2012-07-05 68 views
2

使用Symfony2中的Gedmo Sluggable行爲,我需要知道,如果有一種方法可以讓兩個斜槓(/)和破折號( - )作爲單詞分隔符。換句話說,像往常一樣,一個特定的分隔符,但留下其他特定的特殊字符,因此它被忽略。我想要做這樣的事情作爲毛坯:Symfony2的Sluggable多個分離

products/some-product 

這讓我在通過斜線分類的URL使用蛞蝓,並通過劃線分隔的空間。但是,例如,如果分隔符是「/」,則「 - 」將被替換,而不是單獨留下。

我已經瀏覽了相關的難懂的課程代碼(Urlizer),看到很多正則表達式正在進行,但我不確定我應該重寫的位置,以允許切割和/或破折號不被替換其他。

回答

5

事實證明,你可以通過創建自己的類,它擴展Urlizer,然後將其設置爲可調用的聽衆,而不是Gedmo的類做到這一點。

當使用STOF主義的擴展,一個sluggable監聽器被作爲一種服務創建的,但它被設置爲私有,所以你不能正常上網。所以你必須首先在你自己的配置中給這個監聽器創建一個別名:

services: 

    sluggable.listener: 
     alias: stof_doctrine_extensions.listener.sluggable 

然後你必須創建你的類。有一個名爲setTransliterator()二傳手,你可以用它來調用自己的transliterator,然後你就可以用它來注入您需要修改猛擊過程是什麼。該功能postProccessText()是你真正想要的修改,該音譯()函數究竟什麼是可調用:

namespace My\Bundle\Util; 

use Gedmo\Sluggable\Util\Urlizer as BaseUrlizer; 

class Urlizer extends BaseUrlizer 
{ 
    public static function transliterate($text, $separator = '-') 
    { 
     // copy the code from the parent here 
    } 

    private static function postProcessText($text, $separator) 
    { 
     // copy code from parent, but modify the following part: 

     $text = strtolower(preg_replace('/[^A-Z^a-z^0-9^\/]+/', $separator, 
          preg_replace('/([a-z\d])([A-Z])/', '\1_\2', 
          preg_replace('/([A-Z]+)([A-Z][a-z])/', '\1_\2', 
          preg_replace('/::/', '/', $text))))); 
    } 
} 

postProcessText()的正則表達式要修改自己的喜好是什麼。在這之後,你必須讓你的函數可調用正確的你堅持下去之前,你是好去:

// custom transliterator 
$listener = $this->get('sluggable.listener'); 
$listener->setTransliterator(array('My\Bundle\Util\Urlizer', 'transliterate')); 
$em->flush();