2016-10-10 66 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); 
        }, 
       ]); 
      } 
     ); 
}