2016-10-10 22 views
3

我有以下表單,它包含數據庫中的數據,它仍然是WIP(我缺少一些我沒有添加的字段)。 表單在第一個選擇中加載數據,並基於該選擇,我使用ajax根據第一個選擇(基本上與選定值的關聯)填充第二個選擇。並從那裏再次選擇某些選項等等,並在最後提交表單時,我想根據數據從數據庫生成報告。 目前我很堅持的第二場,因爲我總是得到一個錯誤:symfony ajax表單動態修改

This value is not valid. 

窗體類:

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('survey', EntityType::class, [ 
      'class' => SurveyManager::class, 
      'placeholder' => 'Choose option', 
      'attr' => [ 
       'class' => 'field-change', 
      ], 
     ]) 
     ->add('headquarter', ChoiceType::class, [ 
      'choices' => [], 
     ]) 
     ->add('submit', SubmitType::class, [ 
      'label' => 'Save', 
     ]) 
    ; 
} 

我不雷爾知道如何修復錯誤或如何我應該如何處理這種類型的表單。你能幫我出去嗎?

基於答案我這樣做

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

     $data = $event->getData(); 

     $form->add('headquarter', EntityType::class, [ 
      'class' => HeadQuarterManager::class, 
      'query_builder' => function(HeadQuarterManagerRepository $er) { 

       return $er->getHeadquarter($data['survey']); 
      }, 
     ]); 
    } 
); 

但我發現了這個錯誤:

Notice: Undefined variable: data 

不能確定如何將數據傳遞到getHeadquarter方法,所以我可以返回選擇的ID =>名稱數組。

回答

4

當您運行函數$form->isValid()時,它將檢查它在buildForm函數中構建的窗體。任何不在那裏的額外字段/值都會導致此錯誤。

您可以使用form events更改此行爲。

+0

我想你會說... :-D問題是我從來沒有使用過,我沒太明白該文檔:( –

+0

@LS從它你需要的聲音選項3 http://symfony.com/doc/current/form/dynamic_form_modification.html#form-events-submitted-data當你完成它,一旦你得到用於它 – Rooneyl

+0

好吧,讓我看看那個部分放一些代碼,我們會從那裏看到我做了什麼愚蠢的事情:D –

0

在這到底是怎麼做的:

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('survey', EntityType::class, [ 
      'class' => SurveyManager::class, 
      'attr' => [ 
       'class' => 'field-change', 
      ], 
     ]) 
     ->add('submit', SubmitType::class, [ 

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

       $data = $event->getData(); 
       $modifier = $data['survey']; 
       $form->add('headquarter', EntityType::class, [ 
        'class' => HeadQuarterManager::class, 
        'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) { 
         return $er->getHeadquarter($modifier); 
        }, 
       ]); 
      } 
     ); 
}