将多个单词类别显示为带有破折号的1个单词

时间:2016-07-14 18:32:17

标签: php silverstripe

我有一些与其关联的类别的子页面。对于具有多于1个单词的类别,例如"测试类别"我需要输出为1个单词,空格用短划线分隔,例如" Test-Category"

如何重写函数来处理这个问题?

public function CategoriesList() {
    if ($this->Categories()->exists()) {
        return implode(', ', $this->Categories()->column('Title'));
    }
}

4 个答案:

答案 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;
  }

}