【问题标题】:Symfony2 forwards when re-submit the formSymfony2 在重新提交表单时转发
【发布时间】:2015-05-12 23:32:57
【问题描述】:

当我第二次在服务器上发送带有数据的表单时,它会将我重定向到处理来自客户端的请求的路由上。

我的意思

我有控制器方法,它接受来自客户端的请求作为 AJAX 并验证数据

public function addCommentAction(Request $request)
    {
        $post = new Post();
        $form = $this->createForm(new PostType(), $post);
        $post->setCreated(new \DateTime('now'));
        if ($request->getMethod() == 'POST') {
            $form->submit($request);
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($post);
                $em->flush();
                $this->get('session')->getFlashBag()->add('success', 'Comment has been sent on moderation. Wait 1 minute before send another comment.');
            }
        }
        return $this->render('GuestbookBundle:Post:postForm.html.twig', array(
            'form' => $form->createView(),
        ));
    }

我的 ajax。序列化表单,然后使用表单中的数据向服务器发送请求

$('.container .form-comment .send-comment').on('click', function(e) {
        var $from = $(this).closest('form');
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: $from.attr('action'),
            data: $from.serialize(),
            success: function(data) {
                $('.form-comment').empty().append(data);
            }
        })
    });

当我第二次单击发送按钮时,它会将我重定向到页面 mydomain.com/add,该页面处理来自表单的请求

add:
    path:     /add
    defaults: { _controller: GuestbookBundle:Post:addComment }
    requirements:
        _method:  POST

如何解决这个问题?为什么发送成功后我的表单不清楚?

谢谢。

【问题讨论】:

  • 我的猜测是 on 监听器没有第二次注册
  • 什么意思?你能解释一下吗?
  • @MaximR 表单提交后的预期结果是什么?
  • @MaximR on Error 你返回一个表格(包括我怀疑你注册的按钮)。当您在 JS 中注册事件监听器时,该表单不在 DOM 内。

标签: php jquery ajax forms symfony


【解决方案1】:

首先你在提交后又返回表单,你为什么需要这个? 我看到您正在尝试添加评论,因此在提交后您可以返回消息(例如 - 成功)或您需要的任何其他数据。

    public function addCommentAction(Request $request)
    {
        $post = new Post();
        $form = $this->createForm(new PostType(), $post);
        $result = ['status' => 'success',
                'comment' => 'Comment has been sent on moderation. Wait 1 minute before send another comment.' ];
        $post->setCreated(new \DateTime('now'));
        if ($request->getMethod() === 'POST') {
            $form->submit($request);
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $em->persist($post);
                $em->flush();
//              $this->get('session')->getFlashBag()->add('success', 'Comment has been sent on moderation. Wait 1 minute before send another comment.');
                return new JsonResponse($result);
            } 
            $result['status'] = 'error';
            return new JsonResponse($result);
        }
        return $this->render('GuestbookBundle:Post:postForm.html.twig', array(
            'form' => $form->createView(),
        ));
    }

javascript:

$('.container .form-comment .send-comment').on('click', function(e) {
        var $from = $(this).closest('form');
        e.preventDefault();
        $.ajax({
            type: "POST",
            url: $from.attr('action'),
            data: $from.serialize()

        }).done(function(data) {
                  //data will contains data.status && data.message
                  //you can add any data in your controller

            $('.form-comment').empty().append(data.messages);

        }).fail(function(data) {
            alert(data.messages);
        });
    });

你也在使用不推荐使用的语法, 最好使用$form->handleRequest($request);,你可以阅读它here

【讨论】:

  • @MaximR 你是什么意思? symfony 验证没问题
  • 是的。它的工作,但是验证怎么样,可以使用 symfony 验证还是我应该手动来做呢?
  • 我的意思是如何使用这个验证 {{ form_errors(form.domain) }} 或类似的东西,并在每个字段上显示用户要做什么类型的错误。
【解决方案2】:

我找到了为什么他们在重新提交后在 url 上转发我。在第二次 jquery 不起作用,因为响应后我收到新的 html 并且 jquery 可以绑定按钮上的事件。作为解决方案更改 JS 代码

$('.container .form-comment').on('submit', '.send-comment', function(e) {
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-29
    • 2019-07-20
    • 2019-01-21
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多