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


Display Multi Word Categories As 1 Word With Dashes

我有一些子页面具有与之关联的类别。对于具有 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;
  }
}