Symfony2:动态生成嵌入式表单

时间:2014-02-11 15:23:39

标签: php forms events symfony

Symfony2有forms dynamic generation的可能性。

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

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

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

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

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

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

我使用Symfony 2.4。

非常感谢你!

1 个答案:

答案 0 :(得分:10)

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

对于他们两者,可以获取提交数据并更改表格。

他们之间的区别:

  • FormEvents :: PRE_SUBMIT - 数据未规范化,因此$ event-> getData() 返回简单数组
  • FormEvents :: SUBMIT - 数据是NORMALIZED,因此返回$ event-> getData() 模型对象

还有更好的可能性:

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

在这种情况下,您将能够:

  1. 以标准化形式获取所有POST数据(模型对象)
  2. 修改表单字段,该字段位于绑定事件的字段
  3. 之后
  4. 我们将根据POST数据自动设置字段值