2016-07-14 22 views
3

我有一些兒童網頁與他們有關聯的類別。對於超過1個單詞的類別,例如「測試類別」,我需要輸出爲1個單詞,空格用短劃線分隔,例如「Test-Category」顯示多個詞類別作爲1個字用虛線

函數如何重寫來處理?

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

回答

6

我們可以在我們的Category類中創建一個getDashedTitle函數,以便使用破折號而不是空格返回標題:

class Category extends DataObject { 
    public function getDashedTitle() { 
     return str_replace(' ', '-', $this->Title); 
    } 
} 

然後我們就可以使用DashedTitlemap函數來獲取類別虛線標題:

public function CategoriesList() { 
    if ($this->Categories()->exists()) { 
     return implode(', ', $this->Categories()->map('ID', 'DashedTitle')->toArray()); 
    } 
} 
+0

謝謝。這是我的解決方案,因爲在我的情況下它是一個非常簡單的用例。 – KenSander

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

這將打破標題上升空間,然後用破折號把它重新走到一起,最後加入所有標題連同,並返回。

2

FileNameFilter類會做你需要開箱什麼:

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

更靈活的或自定義功能,可以擴展的類和重載過濾功能:

class CategoriesFilter extends FileNameFilter { 

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

} 
+0

太棒了!非常感謝。我不知道這個功能。 – KenSander

3

您可以使用此一Extension。這意味着此方法可用於任何varchar字段。

的mysite /碼/擴展/ 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 %>