3

Symfony2 でGedmo Sluggable動作を使用して、スラッシュ (/) とダッシュ (-) の両方を単語区切りとして許可する方法があるかどうかを知る必要があります。つまり、通常どおり 1 つの特定の区切り記号ですが、他の特定の特殊文字は無視されるため、そのままにしておきます。私はスラッグとしてこのようなことをしたい:

products/some-product

これにより、スラッシュで分類されたスラッグを URL で使用し、スペースをダッシュ​​で区切ることができます。ただし、たとえば、セパレータが「/」の場合、「-」もそのままではなく置き換えられます。

関連する Sluggable クラス コード ( Urlizer ) を調べたところ、多くの正規表現が行われていることがわかりましたが、スラッシュやダッシュを他のすべてのものと一緒に置き換えないようにオーバーライドする必要がある場所がわかりません。

4

1 に答える 1

6

これを実現するには、Urlizerを拡張する独自のクラスを作成し、それをGedmoのクラスではなくリスナーの呼び出し可能として設定します。

STOF doctrine拡張機能を使用すると、スラッガブルリスナーがサービスとして作成されますが、プライベートとして設定されているため、通常はアクセスできません。したがって、最初に独自の構成でこのリスナーのエイリアスを作成する必要があります。

services:

    sluggable.listener:
        alias: stof_doctrine_extensions.listener.sluggable

次に、クラスを作成する必要があります。setTransliterator()と呼ばれるセッターがあり、これを使用して独自のトランスリテレーターを呼び出すことができます。これを使用して、スラッギングプロセスを変更するために必要なものを注入できます。関数postProccessText()は本当に変更したいものであり、transliterate()関数はまさに呼び出し可能なものです。

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();
于 2012-07-10T19:12:39.450 に答える