Symfony2 - 动态生成的表单在编辑表单时不起作用

Posted

技术标签:

【中文标题】Symfony2 - 动态生成的表单在编辑表单时不起作用【英文标题】:Symfony2 - Dynamic generated form not working while editing form 【发布时间】:2017-03-06 05:43:33 【问题描述】:

基于文档:http://symfony.com/doc/2.8/form/dynamic_form_modification.html#form-events-submitted-data

我准备了动态生成的表格。一切正常,但只有当我使用表单来添加新数据(/new)时,当我使用相同的表单来编辑现有数据时 - 不工作

    “约会”的简单表格。它应该像这样工作:用户选择客户端,然后第二个“选择”正在填充正确的数据 - 取决于第一个选择的每个客户端。这工作正常,但只有当我尝试添加新约会时。当我尝试编辑号时。
类 AppointmentType 扩展 AbstractType 公共函数 buildForm(FormBuilderInterface $builder, array $options) $建造者 ->添加('名称') ->add('client', EntityType::class, array( 'class' => 'SystemAdminBundle:Client', '占位符' => '', )); $formModifier = function(\Symfony\Component\Form\FormInterface $form, Client $client) $疾病 = 数组(); if($client !== null) $diseases = $client->getDiseases(); $form->add('disease', EntityType::class, array( 'class' => 'SystemAdminBundle:Disease', '占位符' => '', '选择' => $疾病, )); ; $builder->addEventListener( FormEvents::PRE_SET_DATA, 函数 (FormEvent $event) 使用 ($formModifier) $data = $event->getData(); $formModifier($event->getForm(), $data->getClient()); ); $builder->get('client')->addEventListener( FormEvents::POST_SUBMIT, 函数 (FormEvent $event) 使用 ($formModifier) $client = $event->getForm()->getData(); $formModifier($event->getForm()->getParent(), $client); ); 公共函数configureOptions(OptionsResolver $resolver) $resolver->setDefaults(数组( 'data_class' => 'System\AdminBundle\Entity\Appointment' ));
    约会控制器 - 这是添加新约会和编辑的功能。对于“新”我的代码有效,对于“编辑”没有。
公共函数 newAction(请求 $request) $约会=新约会(); $form = $this->createForm(AppointmentType::class, $appointment); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) $data = $request->request->get('约会'); if(array_key_exists('name', $data)) $em = $this->getDoctrine()->getManager(); $em->坚持($约会); $em->flush(); return $this->redirectToRoute('appointment_show', array('id' => $appointment->getId())); return $this->render('appointment/new.html.twig', array( '约会' => $约会, 'form' => $form->createView(), )); 公共功能editAction(请求$request,约会$appointment) $deleteForm = $this->createDeleteForm($appointment); $约会=新约会(); $editForm = $this->createForm('System\AdminBundle\Form\AppointmentType', $appointment); $editForm->handleRequest($request); if ($editForm->isSubmitted() && $editForm->isValid()) $data = $request->request->get('约会'); if(array_key_exists('name', $data)) $em = $this->getDoctrine()->getManager(); $em->坚持($约会); $em->flush(); return $this->redirectToRoute('appointment_show', array('id' => $appointment->getId())); return $this->redirectToRoute('appointment_edit', array('id' => $appointment->getId())); return $this->render('appointment/edit.html.twig', array( '约会' => $约会, 'edit_form' => $editForm->createView(), 'delete_form' => $deleteForm->createView(), ));
    查看“新”约会
% 块内容 % form_start(form) form_widget(form) form_end(form) window.onload = 函数() var $sport = $('#appointment_client'); $sport.change(函数() var $form = $(this).closest('form'); 变量数据 = ; 数据[$sport.attr('name')] = $sport.val(); 数据['约会[_token]'] = $('#appointment__token').val(); $.ajax( 网址:$form.attr('action'), 类型:$form.attr('method'), 数据:数据, 成功:函数(html) $('#appointment_disease').replaceWith( $(html).find('#appointment_disease') ); ); ); ; % 端块 %
    查看“编辑”约会 - 几乎与“新”约会相同
% 块内容 % form_start(edit_form) form_widget(edit_form) form_end(edit_form) window.onload = 函数() var $sport = $('#appointment_client'); $sport.change(函数() var $form = $(this).closest('form'); 变量数据 = ; 数据[$sport.attr('name')] = $sport.val(); 数据['约会[_token]'] = $('#appointment__token').val(); $.ajax( 网址:$form.attr('action'), 类型:$form.attr('method'), 数据:数据, 成功:函数(html) $('#appointment_disease').replaceWith( $(html).find('#appointment_disease') ); ); ); ; % 端块 %

【问题讨论】:

你的 appointment_edit 路由在参数中接受了一个 id,但你的控制器接受了一个 Appointment 对象——这甚至是如何工作的? 嗨,你能解决这个问题吗?我有同样的问题 【参考方案1】:

您在editAction 中创建一个new Appointment,然后将其持久化。您应该使用函数参数中的那个,处理请求并刷新,因为您的对象已经持久化。

所以删除这些行:

$appointment = new Appointment();
// ...
$em->persist($appointment);

【讨论】:

是的,我添加了“$appointment = new Appointment();”因为失误。我删除了它,但仍然无法正常工作。

以上是关于Symfony2 - 动态生成的表单在编辑表单时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 使用没有附加任何实体的表单生成器

添加 CSS 到表单类型是 Symfony2

Sonata Admin 编辑表单多对多不起作用 - symfony2.1.6

用户登录时不显示表单,但在用户注销时显示

用户登录时不显示表单,但用户注销时显示

未处理模态中的 Symfony2 表单