У меня возникла проблема с динамической формой на symfony2. Я пытаюсь создать несколько полей для представленной формы. В других словах пользователь вводит некоторые значения, представляет форму и, согласно этим значениям, поля моей динамики добавляются в эту же форму (что, очевидно, отображается во второй раз). Чтобы сделать это, я использовал этот пример из поваренной книги: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-dataSymfony2 недействительная динамическая форма без ошибок
Итак, вот мой FormationType класс
class FormationType extends AbstractType
{
private $em;
private $context;
public function __construct($em, $context) {
$this->em = $em;
$this->context = $context;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('date')
->add('type', 'choice', array(
'mapped' => false,
'choices' => Formationlist::getTypeTypes(false),
'empty_value' => false,
))
->add('cost')
->add('travelCost')
->add('maximum')
->add('location')
->add('schedule')
;
$formModifier = function(FormInterface $form, $type) {
$formationList = $this->em->getRepository('CoreBundle:FormationList')->findBy(array("year" => 1, "type" => $type));
$form->add('formationList', 'entity', array(
'label'=> 'Titre formation',
'choices' => $formationList,
'class' => 'CoreBundle:FormationList',
'property' => 'title',)
);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($formModifier) {
$data = $event->getForm();
$type = $data->get('type')->getData();
$formModifier($event->getForm(), $type);
}
);
$builder->get('type')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier) {
$type = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $type);
}
);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'EXAMPLE\CoreBundle\Entity\Formation'
));
}
public function getName()
{
return 'example_corebundle_formationtype';
}
}
Таким образом, две addEventListener работы довольно хорошо. В первый раз, когда отображается моя форма, поле в formModifier не загружается, как и ожидалось. Мой класс контроллера заключается в следующем:
public function createAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$contextSrv = $this->get('example.service.context');
$context = $contextSrv->getContext();
$entity = new Formation();
$form = $this->createForm(new FormationType($em, $context), $entity);
$form->bind($request);
if ($form->isValid()) {
$em->persist($entity);
$em->flush();
return $this->redirect($this->generateUrl('formation_show', array('id' => $entity->getId())));
}
return array(
'entity' => $entity,
'form' => $form->createView(),
);
}
Поскольку один из моих динамического поля не может быть нулевой, первый раз, когда форма была отправлена, она не может быть действительным. Таким образом, FormationType загружается второй раз. Это означает, что если поле «type» было заполнено, моя функция formModifier() может загружать динамическое поле (formList). Пока там, все работает очень хорошо, и я получил свое новое поле.
Но после второго «подать» на форму ... ничего не происходит. Страница просто перезагружается, и ошибки не отображаются.
Я проверил содержимое формы с
var_dump($request->request->get('example_corebundle_formationtype'));
-> Каждые поля (в том числе динамического) заполняется допустимыми значениями.
Я также попробовать это:
foreach($form->all() as $item) {
echo $item->getName();
var_dump($item->getErrors());
}
-> Эти строки не показывают какой-либо ошибки. Но форма никогда не действует.
var_dump($form->isValid());
-> Он возвращает false. Таким образом, форма недействительна.
Наконец, если я удаляю всю динамическую часть, моя форма работает. Я не понимаю, что случилось. Ошибок, отображаемых формой, нет, а токен csrf кажется правильным. Я что-то пропустил ? Спасибо за вашу помощь.
Просто догадайтесь, можете ли вы проверить с помощью firebug, если значение для типа одинаково, если вы удалите эту строку кода: 'choice' => $ formList, из вашей формы $ formModifier? – Cesc
hm ... я не понимаю вашу точку зрения. Я удалил «choice» => $ formList, из $ formModifier, но ничего не случилось с полем «type». Ожидается, что «тип» - это выбор без динамического значения. Поле formList было и остается списком (единственное отличие -
внутри должен быть действительным id (независимо от того, какой вы указали первичный ключ) для класса FormationList, если нет, $ form-> isValid() будет false. Это был мой момент, но я уверен, что список $ formList хорошо сделан, и поэтому он должен иметь правильный идентификатор. Это было просто дикое предположение. – Cesc