Symfony2: динамическая генерация встроенной формы

Symfony2 имеет возможность формирования динамической генерации .

Однако существует большая проблема с динамической генерацией встроенных форм на основе данных, представленных пользователем:

Если я использую FormEvents :: PRE_SET_DATA, то я не могу получить данные post для встроенной формы – доступны только данные родительских объектов

$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.

Заранее большое спасибо!

Проблема была легко решена: необходимо использовать события FormEvents :: SUBMIT или FormEvents :: PRE_SUBMIT.

Для обоих из них можно получить данные отправки и изменить форму.

Разница между ними:

  • FormEvents :: PRE_SUBMIT – данные не нормализованы, поэтому $ event-> getData () возвращает простой массив
  • FormEvents :: SUBMIT – данные НОРМАЛИЗИРОВАНЫ, поэтому $ event-> getData () возвращает объект модели

И есть еще лучшая возможность:

Вы можете использовать FormEvents :: POST_SUBMIT, но вам нужно прикрепить его к полю подформы, а не ко всей подчиненной форме.

В этом случае вы сможете:

  1. Получить все данные POST в нормализованной форме (объект модели)
  2. Измените поля формы, которые идут после одного, к которому связано событие
  3. Значения полей мы будем автоматически устанавливать на основе данных POST