Symfony2:嵌入式动态生成 [英] Symfony2: dynamic generation of embedded form

查看:162
本文介绍了Symfony2:嵌入式动态生成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Symfony2有可能表单动态



然而,基于用户提交的数据,嵌入式表单 的动态生成存在很大问题:



如果我使用FormEvents :: PRE_SET_DATA,则我无法接收嵌入表单的帖子数据 - 只有父对象数据可用

  $ builder-> get('contacts') - > addEventListener(
FormEvents :: POST_SET_DATA
函数(FormEvent $ event){
$ data = $ event-> getData(); // $ data将包含嵌入的表单对象 - 不是数据对象!
}
);

如果我使用FormEvents :: POST_SUBMIT,那么我可能会收到数据,但是我不能修改表单



  $ builder-> get('contacts') - > addEventListener(
FormEvents :: POST_SUBMIT,
函数(FormEvent $ event){
$ data = $ event-> getData(); // $ data将包含填充的数据对象 - 一切都ok
$ form = $ event-> getForm (); // form将会ok
if($ data-> getSomeValue()){
$ form-> add(...); //错误:你不能添加子提交表单
}
}
);

请帮助:有没有办法根据用户提交的数据动态生成嵌入式表单?



我使用Symfony 2.4。



提前非常感谢!

解决方案

问题很容易解决:需要使用FormEvents :: SUBMIT或FormEvents :: PRE_SUBMIT事件。



<对于他们来说,可以获得提交数据并更改表单。



它们之间的区别:




  • FormEvents :: PRE_SUBMIT - 数据不正则化,所以$ event-> getData()
    返回简单数组

  • FormEvents :: SUBMIT - 数据是NORMALIZED,所以$ event-> getData()返回
    模型对象



还有更好的可能性:



您可以使用FormEvents :: POST_SUBMIT但是您需要将其附加到子窗体字段 - 而不是整个子表格。



在这样的c您可以:


  1. 以规范化形式(模型对象)获取所有POST数据

  2. 修改绑定事件之后的表单字段

  3. 字段值将根据POST数据自动设置


Symfony2 has possibility of forms dynamic generation.

However there is big problem with dynamic generation of embedded forms based on user submitted data:

If I use FormEvents::PRE_SET_DATA then I can't receive post data for embedded form - only parent object data is available

$builder->get('contacts')->addEventListener(
  FormEvents::POST_SET_DATA
  function(FormEvent $event) {
    $data = $event->getData(); //$data will contain embedded form object - not the data object!
  }
);

If I use FormEvents::POST_SUBMIT then I may receive data but I can't modify form

$builder->get('contacts')->addEventListener(
  FormEvents::POST_SUBMIT,
  function(FormEvent $event) {
    $data = $event->getData(); //$data will contain filled data object - everything is ok
    $form = $event->getForm(); //form will be ok
    if ($data->getSomeValue()) {
      $form->add(...); //Error: "You cannot add children to a submitted form"
    }
  }
);

Please help: is there any way to dynamically generate embedded form based on user submitted data?

I use Symfony 2.4.

Thank you very much in advance!

解决方案

The problem was easy to solve: it is needed to use FormEvents::SUBMIT or FormEvents::PRE_SUBMIT events.

For both of them it is possible to get submit data and to change the form.

The difference between them:

  • FormEvents::PRE_SUBMIT - data is not normalized, so $event->getData() returns simple array
  • FormEvents::SUBMIT - data is NORMALIZED, so $event->getData() returns model object

And there is even better possibility:

You may use FormEvents::POST_SUBMIT BUT you need to attach it to the subform field - not to the whole subform.

In such case you'll be able to:

  1. Get all POST data in normalized form (model object)
  2. Modify form fields which goes after one to which event is bound
  3. Fields values we'll be automatically set based on POST data

这篇关于Symfony2:嵌入式动态生成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆