【问题标题】:Symfony2 form submitting on page refreshSymfony2 表单在页面刷新时提交
【发布时间】:2013-04-26 06:27:14
【问题描述】:

我在 Symfony2 框架中有一个表单。成功提交页面后,它会呈现另一个 twig 模板文件并通过在数组中传递参数来返回值。但提交后,如果我刷新页面,它再次提交表单并创建表条目。这是在控制器中提交后执行的代码,

$this->get('session')->setFlash('info', $this->get('translator')->trans('flash.marca'));

return $this->render('NewBundle:Backend:marca.html.twig', array(
                                        'active' => 1,
                                        'marca' => $marca,
                                        'data' => $dataCamp,
                                        'dataMarca' => $this->getMarcas($admin->getId()),
                                        'admin' => $admin,
            ));

我希望将表单重定向到上面提到的带有参数和警报消息的树枝文件。但我不希望在页面刷新时提交表单。

谢谢

【问题讨论】:

    标签: php symfony form-submit symfony-forms page-refresh


    【解决方案1】:

    这对我有用:

    return $this->redirectToRoute("route_name");
    

    【讨论】:

    • 像魅力一样工作!
    【解决方案2】:

    您应该将提交的数据保存在会话中并重定向用户。然后,您将能够根据需要尽可能多地刷新页面,而无需额外提交。 示例代码 - 你的动作算法应该类似:

    ...
    /**
     * @Route("/add" , name="acme_app_entity_add")
     */
    public function addAction()
    {
        $entity = new Entity();
        $form = $this->createForm(new EntityType(), $entity);
        $session = $this->get('session');
    
    // Check if data already was submitted and validated
    if ($session->has('submittedData')) {
        $submittedData = $session->get('submittedData');
        // There you can remove saved data from session or not and leave it for addition request like save entity in DB
        // $session->remove('submittedData');
    
        // There your second template
        return $this->render('AcmeAppBundle:Entity:preview.html.twig', array(
            'submittedData' => $submittedData
            // other data which you need in this template
        ));
    }
    
    if ($request->isMethod('POST')) {
        $form->bindRequest($request);
    
        if ($form->isValid()) {
            $this->get('session')->setFlash('success', 'Provided data is valid.');
            // Data is valid so save it in session for another request
            $session->set('submittedData', $form->getData()); // in this point may be you need serialize saved data, depends of your requirements
    
            // Redirect user to this action again
            return $this->redirect($this->generateUrl('acme_app_entity_add'));
        } else {
            // provide form errors in session storage
            $this->get('session')->setFlash('error', $form->getErrorsAsString());
        }
    }
    
    return $this->render('AcmeAppBundle:Entity:add.html.twig', array(
        'form' => $form->createView()
    ));
    }
    

    重定向到同一页面会阻止提交额外的数据。所以这个例子的精益修改你的动作,你会没事的。 也可以将数据保存在会话中,您可以通过重定向请求传递它。但我认为这种方法比较困难。

    【讨论】:

      【解决方案3】:
      1. 保存您的数据(会话/数据库/您希望保存的任何位置)
      2. 重定向到新操作,检索该操作中的新数据,并呈现模板

      这样,刷新新动作,只会刷新模板,因为您的数据保存发生在上一个动作中

      明白吗?

      所以基本上替换你的

      return $this->render....
      

      return $this->redirect($this->generateUrl('ROUTE_TO_NEW_ACTION')));
      

      在这个新动作中,你把你的

      return $this->render....
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        相关资源
        最近更新 更多