2014-02-11 78 views
6

Symfony2有forms dynamic generation的可能性。Symfony2:動態生成嵌入表格

然而,有大問題,動態生成基於用戶嵌入表單提交的數據:

如果我使用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。

非常感謝您提前!

回答

9

問題很容易解決:需要使用FormEvents :: SUBMIT或FormEvents :: PRE_SUBMIT事件。

對於他們兩人都可以獲取提交數據並更改表單。

它們之間的區別是:

  • FormEvents :: PRE_SUBMIT - 數據不是歸一化,所以$事件 - >的getData() 返回簡單陣列
  • FormEvents ::提交 - 數據被歸一化,所以$事件 - >的getData()返回 模型對象

而且有更好的可能性:

您可以使用FormEvents :: POST_SUBMIT但是您需要將它附加到子窗體字段 - 而不是整個子窗體。

在這種情況下,你將能夠:

  1. 獲取規範化的形式(模型對象)
  2. 修改表單字段肚裏一到這之後的事件勢必
  3. 領域的所有POST數據值我們會根據POST數據自動設置
+0

我很努力從FormEvents :: SUBMIT獲取標準化數據,並且無法修改FormEvents :: POST_SUBMIT中的表單字段 - 即使綁定到子表單字段並且不管字段的順序是什麼 – Jonny