2

Symfonyのテキストフィールドタイプにはトリムオプションがあります。trim()操作はForm\Extension\Core\EventListener\TrimListenerクラスによって行われると確信しています。これはイベントのリスナーであり、次のPRE_BINDように呼び出します。

$event->setData(trim($event->getData()));

私は自分のオプションを提供したいと思い"normalize_spaces"ます:

$builder->add('last_name', 'text', array(
    'label'           => 'Last name',
    'normlize_spaces' => true
));

このオプションを自分で提供するにはどうすればよいNormalizeSpacesListenerですか?

class NormalizeSpacesListener implements EventSubscriberInterface
{
    public function preBind(FormEvent $event)
    {
        $data = $event->getData();

        if (is_string($data)) {
            $event->setData(preg_replace('/[ ]{2,}/', ' ', $data));
        }
    }

    public static function getSubscribedEvents()
    {
        return array(FormEvents::PRE_BIND => 'preBind');
    }
}
4

1 に答える 1

5

おそらくSymfonyコアFormTypeクラス、特にbuildFormメソッドをオーバーライドすると思います: https ://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/FormType.php

トリムオプションの場合と同じように、そのオプションのテストを追加します。何かのようなもの:

Class MyFormType Extends FormType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         parent::buildForm($builder, $options);

         if ($options['normalize_spaces']) {
             $builder->addEventSubscriber(new NormalizeSpacesListener());
         }
     }
 }

そのクラスをオーバーライドして、デフォルトのコアクラスの代わりにシステムに使用させるには、サービスコンテナーを使用して、サービスform.type.formのクラスを変更します。

ここでどのように宣言されているかをご覧ください:https ://github.com/symfony/symfony/blob/master/src/Symfony/Bundle/FrameworkBundle/Resources/config/form.xml

そして、これを読んで、デフォルトのクラスの代わりに独自のクラスを使用するようにサービスコンテナに実際に指示する方法を理解してください。

バンドルの任意の部分をオーバーライドする方法

注:それは私がそれをやろうとする方法ですが、私は今書いたものをテストしていません

もう1つのオプションは、作成する各フォームにリスナーをアタッチすることであり、デフォルトのオプションにはしません。それもうまくいくと思います。

于 2012-09-29T07:20:34.310 に答える