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