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

Display Multi Word Categories As 1 Word With Dashes

我有一些子页面具有与之关联的类别。对于超过 1 个单词的类别,例如 "Test Category" 我需要输出为 1 个单词,空格用破折号分隔,例如 "Test-Category"

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

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

这是未经测试的,但假设 Categories() returns a HasManyList 你可以尝试这样的事情:

public function CategoriesList()
{
    if (!$this->Categories()->exists()) {
        return '';
    }

    $output = [];
    foreach ($this->Categories() as $category) {
         $output[] = implode('-', explode(' ', $category->Title()));
    }

    return implode(', ', $output);
}

这将按空格将标题分开,然后用破折号将其放回原处,最后将所有标题与 , 连接在一起并返回。

FileNameFilter class 开箱即用:

FileNameFilter::create()->filter("Test Category 1")

为了获得更大的灵活性或自定义功能,您可以扩展 class 并重载过滤器功能:

class CategoriesFilter extends FileNameFilter {

  public function filter($name) {
    //do your processing on $name
    return $name;
  }

}

我们可以在 Category class 中创建一个 getDashedTitle 函数来 return 标题用破折号代替空格:

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());
    }
}

您可以为此使用 Extension。这意味着此方法将可用于任何 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 %>