2012-07-05 2 views
2

Symfony2에서 Gedmo Sluggable 동작을 사용하면 슬래시 (/)와 대시 (-)를 단어 분리 자로 허용하는 방법이 있는지 알아야합니다. 다른 말로하면, 특정 구분 기호는 평소와 같지만 다른 특정 특수 문자를 그대로두면 무시됩니다. 나는 슬러그으로 이런 일을하고 싶지 :이 날 슬래시를 통해 분류 된 URL에 슬러그를 사용하여 대시를 통해 공간을 분리 할 수 ​​있습니다Symfony2 플러 거 가능 다중 분리 기호

products/some-product 

. 그러나 예를 들어 구분 기호가 "/"인 경우 "-"는 그대로 남겨 두는 대신 바뀝니다.

나는 관련 Sluggable 클래스 코드 (Urlizer)를 살펴보고 많은 정규식을 볼 수 있지만 모든 부분을 대치 할 수 없도록 대시 또는/또는 대시가 허용되도록 대체해야하는지 잘 모르겠습니다. 그밖에.

답변

5

당신은 Urlizer를 확장 한 자신 만의 클래스를 생성 한 다음 Gedmo의 클래스 대신 리스너의 호출 가능 호출로 설정하여이를 수행 할 수 있습니다.

STOF doctrine 확장을 사용하는 경우, 서비스로서 슬러지 (slluggable) 리스너가 작성되지만 개인용으로 설정되어 정상적으로 액세스 할 수 없습니다. 따라서 먼저 자신의 구성에서이 수신기에 대한 별칭을 만들어야합니다.

services: 

    sluggable.listener: 
     alias: stof_doctrine_extensions.listener.sluggable 

그런 다음 클래스를 만들어야합니다. 자신의 음역자를 호출하는 데 사용할 수있는 setTransliterator()라는 세터가 있습니다.이 변환기를 사용하여 슬러 밍 프로세스를 수정하는 데 필요한 것을 주입 할 수 있습니다. postProcessText()의

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

정규 표현식은 원하는대로 수정할 무엇 : 함수 postProccessText()는 당신이 정말로 음역() 함수를 호출 단지 무엇인가, 수정할 것입니다. 그 후에는 계속하기 전에 함수를 호출 할 수있는 권리로 만들어야하며, 다음과 같이하면됩니다.

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