当前位置: 首页 > 知识库问答 >
问题:

symfony2-编辑表单时动态生成的表单不工作

伏默
2023-03-14

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

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

  1. “约会”的简单形式。它应该是这样工作的:用户选择客户机,然后第二个“选择”是填充正确的数据-取决于每个客户机从第一个选择。这可以工作,但只有当我尝试添加新约会。当我尝试编辑编号时

class AppointmentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('client', EntityType::class, array(
                'class'       => 'SystemAdminBundle:Client',
                'placeholder' => '',
            ));
        $formModifier = function(\Symfony\Component\Form\FormInterface $form, Client $client) 
        {
            $diseases = array();
            if($client !== null) {
                $diseases = $client->getDiseases();
            }
            $form->add('disease', EntityType::class, array(
                    'class'       => 'SystemAdminBundle:Disease',
                    'placeholder' => '',
                    'choices'     => $diseases,
                ));
        };
        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {

                $data = $event->getData();

                $formModifier($event->getForm(), $data->getClient());

            }
        );

        $builder->get('client')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {

                $client = $event->getForm()->getData();

                $formModifier($event->getForm()->getParent(), $client);
            }
        );

    }


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'System\AdminBundle\Entity\Appointment'
        ));
    }
}
    public function newAction(Request $request)
    {
        $appointment = new Appointment();
        $form = $this->createForm(AppointmentType::class, $appointment);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {


            $data = $request->request->get('appointment');

            if(array_key_exists('name', $data)) {

                $em = $this->getDoctrine()->getManager();
                $em->persist($appointment);
                $em->flush();

                return $this->redirectToRoute('appointment_show', array('id' => $appointment->getId()));

            }

        }

        return $this->render('appointment/new.html.twig', array(
            'appointment' => $appointment,
            'form' => $form->createView(),
        ));

    }
    public function editAction(Request $request, Appointment $appointment)
    {
        $deleteForm = $this->createDeleteForm($appointment);
        $appointment = new Appointment();
        $editForm = $this->createForm('System\AdminBundle\Form\AppointmentType', $appointment);
        $editForm->handleRequest($request);

        if ($editForm->isSubmitted() && $editForm->isValid()) {

            $data = $request->request->get('appointment');

            if(array_key_exists('name', $data)) {

                $em = $this->getDoctrine()->getManager();
                $em->persist($appointment);
                $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(
            'appointment' => $appointment,
            'edit_form' => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }


    {% block content %}

    {{ form_start(form) }}
        {{ form_widget(form) }}
        
    {{ form_end(form) }}

    
    window.onload = function() {

    var $sport = $('#appointment_client');

    $sport.change(function() {

      var $form = $(this).closest('form');

      var data = {};
      data[$sport.attr('name')] = $sport.val();
      data['appointment[_token]'] = $('#appointment__token').val();

      $.ajax({
        url : $form.attr('action'),
        type: $form.attr('method'),
        data : data,
        success: function(html) {

          $('#appointment_disease').replaceWith(

            $(html).find('#appointment_disease')
          );

        }
      });
    });

    };
    
    {% endblock %}
    

    {% block content %}
    {{ form_start(edit_form) }}
        {{ form_widget(edit_form) }}
        
    {{ form_end(edit_form) }}

    
    window.onload = function() {


    var $sport = $('#appointment_client');

    $sport.change(function() {

      var $form = $(this).closest('form');

      var data = {};
      data[$sport.attr('name')] = $sport.val();
      data['appointment[_token]'] = $('#appointment__token').val();

      $.ajax({
        url : $form.attr('action'),
        type: $form.attr('method'),
        data : data,
        success: function(html) {

        $('#appointment_disease').replaceWith(

        $(html).find('#appointment_disease')
    );   
    }
    });
    });

    };
    
    {% endblock %}

共有1个答案

董哲
2023-03-14

您可以在EditAction中创建新约会,然后将其持久化。您应该使用函数参数中的一个,处理请求并刷新,因为您的对象已经持久化了。

因此删除这些行:

$appointment = new Appointment();
// ...
$em->persist($appointment);
 类似资料:
  • 本文向大家介绍使用Vue生成动态表单,包括了使用Vue生成动态表单的使用技巧和注意事项,需要的朋友参考一下 开需求会了,产品说这次需求的表单比较多,目前有18个,后期的表单可能会有增加、修改。我作为这次的前端开发,看到这样的需求,心里知道要这样搞不得把自己累死,首先表单居多,还会有变更,以后维护起来也让人心力憔悴。 于是我提议做动态表单,做一个表单的配置系统,在系统里配置表单类型、表单得字段、以及

  • 上下文 我正在创建一个股票价格数据数据库。我目前正在使用下面的函数: 这允许在编辑单元格时对某些列执行编辑。到目前为止,它是有效的,但有一些扭结。 问题1 有时,当我编辑列的第四行上方的单元格时,它会编辑整个列,尽管我告诉它从第四行开始。这发生在几分钟前的一个单元格中,我告诉它排除上面的“I2”。我为此编写的代码有什么问题吗? 问题2我尝试为代码创建其他异常,其中对于某些指定的范围,它将仅从不同的

  • 我在处理我的联系方式时遇到了麻烦,虽然是一个简单的联系方式。我花了很多时间试图找出我的代码出了什么问题,但一直没有找到解决办法。我的对象没有接收数据。我有以下例外情况: 执行INSERT INTO联系人(电子邮件、姓名、消息、日期)VALUES时发生异常 (?, ?, ?, ?)'用参数[null, null, null,"2016-09-19 00:08:48"]: SQLSTATE[23000

  • 问题内容: 我已经做了一个不错的表格,并使用了一个复杂的“添加”函数来处理它。像这样开始 现在,我真的不想重复该方法中的所有功能,因此我想可以使用完全相同的模板,甚至可以id在表单中添加一个字段,以便该函数知道其正在编辑的内容。但这有几个问题 我将在哪里放置功能?之所以必须在此之后,是因为这是创建文章的地方,但它甚至永远都不会达到那个目的,因为由于唯一的约束,表单是无效的(除非用户编辑了所有内容)

  • 问题内容: 我有一个Webapp,允许用户创建自己的字段,以供以后使用表单呈现。 我有一个像这样的Formfield模型: 我用来代表字段的类型,无论是哪种类型(复选框,输入,以后都会有更多)。 如你所见,每个字段都有一个form_id的FK。 我正在尝试为给定的form_id生成动态表单。问题是我需要确定要为每个Formfield呈现的字段的类型。因此,我还需要在某个时候处理字段类型。 我想一个

  • 问题内容: 我想基于服务器的json响应生成html表单。在JSON响应中,将输入类型,输入标题所有必需的信息。它可以是checbox,单选按钮,texarea或任何其他输入。 是否有任何第三方工具来生成表格。 谢谢 。 问题答案: 尝试dhtmlx表单javascript库: http://www.dhtmlx.com/docs/products/dhtmlxForm/index.shtml 您