将多词类别显示为带破折号的 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 %>
我有一些子页面具有与之关联的类别。对于超过 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 %>