2017-04-05 9 views
1

symfonyのフォームビルダーでフィールド値を取得する方法。 私はフォームに2つのドロップダウンを持っています 私はページが開いているときにDropdown1に基づいてDropdown2で関連するオプションをします。私は静的に値を代入するとき、それは動作しますが、私は「leadSource」の値を取得し、それを割り当てたい -symfonyのフォームビルダーのフィールド値の取得方法

$builder->add('leadSource', 'entity', array( 
     'label' => 'How did you hear about C2? Source ', 

     'class' => 'C2EducateToolsBundle:LeadSources', 
     'query_builder' => function($repo) { 
      return $repo->createQueryBuilder('p')->orderBy('p.sort_order', 'ASC'); 
     }, 
     'property' => 'name', 
     'empty_value' => 'Select' 

    )); 
$leadSource = 1; 

$leadSource = 1;:ここ

は私のフォームは

use Symfony\Component\Form\FormEvents; 
use Symfony\Component\Form\Event\DataEvent; 
use C2Educate\ToolsBundle\Entity\Students; 
public function buildForm(FormBuilder $builder, array $options) { 

フィールド1であります$leadSource

leadSourceを取得し、leadSourceSubクエリに渡したい

フィールド2:

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (DataEvent $event) { 
    $form = $event->getForm(); 
    $entity = $event->getData(); 
    $leadSource = $entity->getLeadSourceID(); 
    $form->add('leadSourceSub', 'C2Educate\ToolsBundle\Entity\Students', array(
      'label' => ' Source Detail ', 
      'required' => true, 
      'class' => 'C2EducateToolsBundle:LeadSourceSubs', 
      'query_builder' => function($repo) use ($leadSource) { 
       return $repo->createQueryBuilder('p') 
         ->where('p.lead_source_id =:leadSource') 
         ->setParameter('leadSource', $leadSource) 
         ->orderBy('p.sort_order', 'ASC'); 
      }, 
      'property' => 'name', 
      'empty_value' => 'Select' 
     )); 
    }); 

答えて

3

...それはフォームビルダー、ないフォームだからあなたは、$builderからフォームデータを取得することはできません。データはまだ含まれていません。

この作業を行うには、FormEventsを使用する必要があります。この場合、おそらくFormEvents::PRE_SET_DATAイベントリスナーが必要になります。

$builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) { 
     $form = $event->getForm(); 
     // in your case it's C2EducateToolsBundle:LeadSourceSubs 
     $entity = $event->getData(); 
     $leadSource = $entity->getLeadSource(); 

     // adding this field again will override it. 
     $form->add('leadSourceSub', 'entity', array(
       'label' => ' Source Detail ', 
       'required' => true, 
       'class' => 'C2EducateToolsBundle:LeadSourceSubs', 
       'query_builder' => function($repo) use ($leadSource) { 
        return $repo->createQueryBuilder('p') 
          ->where('p.lead_source_id =:leadSource') 
          ->setParameter('leadSource', $leadSource) 
          ->orderBy('p.sort_order', 'ASC'); 
       }, 
       'property' => 'name', 
       'empty_value' => 'Select' 
      )); 
     } 
    }); 

は、このコードがテストされていないと、いくつかの検証が必要になることがあり $entityは、あなたはそれがどのような場合になることを期待するものであるかどうかを確認したいので、予めご了承ください。

+0

はい私は[送信されたフォームの動的生成]から同じことを試しました(https://symfony.com/doc/current/form/dynamic_form_modification.html#dynamic-generation-for-submitted-forms).i取得中Error'Catchable Fatal Error:C2Educate \ ToolsBundle \ Form \ Type \ StudentsType :: C2Educate \ ToolsBundle \ Form \ Type \ {closure}()は、C2Educate \ ToolsBundle \ Form \ Type \ FormEventのインスタンスでなければなりません。 C:\ xampp \ htdocs \ c2Education \ src \ C2Educate \ ToolsBundle \ Form \ Type \ StudentsType.php行121 \ – Developer

+0

で指定されたSymfony \ Component \ Form \ Event \ DataEventのコードをコピーしただけで、名前空間をインポートするのを忘れた可能性があります。 'symfony \ Component \ Form \ FormEvent;を使用する' –

+0

かなり古いSymfonyを持っているようですので、代わりに 'Symfony \ Component \ Form \ Event \ DataEvent'を使用し、代わりに' DateEvent' FormEventの –

関連する問題