8

お手伝いをお願いします。ドロップダウン リストのあるフォームがあり、外部入力に基づいて選択肢を変更する必要があります。私はそれがeventListenerでうまくいくはずだと思います

$builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function(FormEvent $event) use($input){
                $form = $event->getForm();

                // get existin form child
                // modify list of choices

            }

私が見たすべてのサンプルは、新しいフィールドを追加するためだけに FormEvents を使用していますが、既存のフィールドを変更する必要がありますが、それにアクセスする方法がわかりません。

手伝ってくれてありがとう

4

3 に答える 3

24

元の質問はかなり古いものですが、他の誰かがすべてのオプションを再度複製することなくフィールドの特定のオプションを変更する必要がある場合に備えて、ここに残しておきます。

<?php

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $form = $event->getForm();

    // Get configuration & options of specific field
    $config = $form->get('field_to_update')->getConfig();
    $options = $config->getOptions();

    $form->add(
        // Replace original field... 
        'field_to_update',
        $config->getType()->getName(),
        // while keeping the original options... 
        array_replace(
            $options, 
            [
                // replacing specific ones
                'required' => false,
            ]
        )
    );
});

ソース: https://github.com/symfony/symfony/issues/8513#issuecomment-21868035

于 2015-09-16T13:37:31.323 に答える
3

できることは、元の子をオーバーライドすることです。

$builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function(FormEvent $event) use($input){
            $form = $event->getForm();

            $form->add($this->factory->createNamed('name_to_override', 'choice', null,
                 array("choices" => array("choice"=>"value"))
                ));

        }

それは私のために働いた。

注:$this PHP 5.3 では Closure を使用できないため、これは PHP 5.4 でのみ機能します。

于 2013-05-29T00:12:59.057 に答える
0

エンティティ関係の動的フォーム全体で機能するブログ投稿がここにあります: http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/

Symfony サイトには、これもほとんど文書化されています。上記のブログ投稿で行われるajaxコードと対応するコントローラー メソッドを記述するだけで済みます。

于 2013-04-12T15:15:50.420 に答える