2012-07-05 92 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();