Symfony2 twig编辑表单未调用控制器

时间:2016-05-27 07:58:50

标签: symfony twig

我确实编辑了通知功能,并使用我的html字段覆盖默认表单小部件,此时不调用控制器,但我确实创建了它已正常工作的功能

{% extends 'base.html.twig' %}
{% block body %}
<h1>Notification edit</h1>
<form name="custom_edit" action="{{ path('notification_edit', { 'id' :        notification.id }) }}"  method="POST"  {{ form_enctype(edit_form) }}> 
<input type="text" name="notification[type]" required /> 
<input type="submit" value="Edit" />
  </form> 
  {% endblock %}

这是我的控制器代码

/**
     * Displays a form to edit an existing Notification entity.
     *
     * @Route("/{id}/edit", name="notification_edit")
     * @Method({"GET", "POST"})
     */
    public function editAction(Request $request, Notification $notification)
    {

        $deleteForm = $this->createDeleteForm($notification);
        $editForm = $this->createForm('LencoBundle\Form\NotificationType', $notification);
        $editForm->handleRequest($request);

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


            $type = $editForm['type']->getData();

            print_r($type);exit;
            $em = $this->getDoctrine()->getManager();
            $em->persist($notification);
            $em->flush();

            return $this->redirectToRoute('notification_edit', array('id' => $notification->getId()));
        }

        return $this->render('notification/edit.html.twig', array(
            'notification' => $notification,
            'edit_form' => $editForm->createView(),
            'delete_form' => $deleteForm->createView(),
        ));
    }

但{{form_widget(edit_form)}}使用此小部件表单调用控制器工作

3 个答案:

答案 0 :(得分:0)

http://symfony.com/doc/current/book/forms.html#forms-and-doctrine有一个很好的例子非常有帮助。

如果您使用实体类创建了表单,根据您的代码似乎就是这种情况,那么您就不需要编辑表单小部件。

if ($form->isValid()) {
$em = $this->getDoctrine()->getManager();
$em->persist($notification);
$em->flush();

return $this->redirectToRoute(//Your route to success);
}

答案 1 :(得分:0)

根据您编写代码的方式,您将id字段传递给控制器​​并期望它使用对象(Notification类型)。

如果您使用param converter annotation

,则可以执行此操作

您的控制器注释应该类似于;

CREATE temporary table temp (index (customerNumber))
    SELECT customerNumber from purchaseOrder where somestatus = someStatus;

SELECT * from registeredUsers wherestatus 
    IN(Some values which mean the account is not active)
    and customerNumber in (SELECT * from temp);

答案 2 :(得分:0)

最佳做法是使用form_widget,因为它采用表单的名称(LencoBundle\Form\NotificationType)并将其用作输入的名称,在这种情况下,我想象您的表单getName()函数返回&#34;通知&#34;它有一个名为&#34;类型&#34;的字段,否则它不会起作用。 (也许是拼写错误或骆驼名字)

您应该直接使用form_widget,我建议您使用form_rest自动将CSRF protection添加到您的表单中。您可以将其用于表单字段而不是整个字段,可以单独使用它,也可以将form_label + form_widget + form_errors组合使用。

如果你需要修改渲染器的模板,你可以使用form themes无论如何使用Twig进行渲染。