我有一些与其关联的类别的子页面。对于具有多于1个单词的类别,例如"测试类别"我需要输出为1个单词,空格用短划线分隔,例如" Test-Category"
如何重写函数来处理这个问题?
public function CategoriesList() {
if ($this->Categories()->exists()) {
return implode(', ', $this->Categories()->column('Title'));
}
}
答案 0 :(得分:6)
我们可以在getDashedTitle
类中创建一个Category
函数,以使用短划线而不是空格返回标题:
class Category extends DataObject {
public function getDashedTitle() {
return str_replace(' ', '-', $this->Title);
}
}
然后我们可以在DashedTitle
函数中使用map
来获取类别虚线标题:
public function CategoriesList() {
if ($this->Categories()->exists()) {
return implode(', ', $this->Categories()->map('ID', 'DashedTitle')->toArray());
}
}
答案 1 :(得分:3)
您可以使用Extension。这意味着此方法可用于任何varchar字段。
<强> mysite的/代码/扩展/ VarcharDecorator.php 强>
Varchar:
extensions:
- VarcharDecorator
<强> mysite的/ _config / extensions.yml 强>
<% loop $Categories %>
$Title.Slugify<% if not $Last %>, <% end_if %>
<% end_loop %>
现在,您可以在模板中使用 $ Title.Slugify 。
{{1}}
答案 2 :(得分:2)
这是未经测试的,但假设Categories()
返回HasManyList
,您可以尝试这样的事情:
public function CategoriesList()
{
if (!$this->Categories()->exists()) {
return '';
}
$output = [];
foreach ($this->Categories() as $category) {
$output[] = implode('-', explode(' ', $category->Title()));
}
return implode(', ', $output);
}
这将用空格打破标题,然后用破折号将其重新组合,最后将所有标题与,
一起加入并返回。
答案 3 :(得分:2)
FileNameFilter
课程将开箱即用:
FileNameFilter::create()->filter("Test Category 1")
为了获得更多灵活性或自定义功能,您可以扩展类并重载过滤器功能:
class CategoriesFilter extends FileNameFilter {
public function filter($name) {
//do your processing on $name
return $name;
}
}