2013-04-12 16 views
5

私は助けたいと思います。ドロップダウンリストを持つフォームがあり、外部入力に基づいて選択肢を変更する必要があります。私はそれがのEventListenersymfony2 - eventListenerでフォームフィールドを変更

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

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

      } 

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

+0

jros:どのように修正しようとしていますか?それを別のタイプに置き換えたいのですか、その属性を変更するだけですか、それとも別のものを変更しますか? – Sean

答えて

0

ため

おかげでブログの記事は、エンティティ関係のために全体のダイナミックなフォームを使用して動作するここにあります:http://aulatic.16mb.com/wordpress/2011/08/symfony2-dynamic-forms-an-event-driven-approach/

symfonyのサイトが、これは主に、あまりにも文書化され、あなただけのAJAXを書く必要がありましたコードとそれに対応するコントローラーの方法を教えてください: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html

2

あなたができることは元の子を上書きすることです。

$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")) 
       )); 

     } 

私のために働いた。

注:これはPHP 5.4でのみ動作し、$thisのクローズはPHP 5.3では使用できません。

+2

5.3では、コールバックの前に '$ that = $ this;'を置き、 '$ this-> factory'を' $ that-> factory'に変更します。 – moteutsch

20

元の質問は、他の誰かが再びすべてのオプションを複製することなく、フィールドの特定のオプションを変更する必要が渡ってくる場合には、私はここにこれを残してみましょう、かなり古いですが:

<?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

+9

私はSymfony 3でも同じ問題がありました。 '$ config-> getType-> getName()'の代わりに 'get_class($ config-> getType() - > getInnerType())'を使います。これは、Symfony 3では、型が完全修飾クラス名である必要があるためです。 – TheNextBigThing

+1

あなたはちょうど私の日を救った...両方のあなた! – Delphine

関連する問題