在Symfony验证后关闭FancyBox表单

时间:2019-05-04 17:13:17

标签: javascript ajax symfony fancybox

提交表单后,如何关闭包含Symfony表单的FancyBox?我不想在立即单击按钮后关闭fancybox,因为表单可能会引发错误。

一种解决方案似乎在控制器中使用两个Symfony函数(具有两个不同的路由):

  • 一个用于呈现表单
  • 提交表单后返回“ json”响应的一个方法。

通过这种方式,响应中包含错误。然后,在Ajax函数中,根据错误,可以关闭FancyBox。

在此解决方案中,我看到了两个缺点

  1. 该表格在每个提交时都会打两次电话吗?我们会破坏Symfony逻辑吗?
  2. 返回json响应是否需要以手工形式显示错误?

这是最好的表演方式吗?

下面是Controller中两个功能的结构:

     /**
     * @param Request $request
     * @return Response
     * @Route("/rendering_form", name="renderingForm")
     */
     public function renderingForm(Request $request){
          // ... Data request for rendering

          // Building form for rendering
          $form = $this->createMyForm()->getForm();

          $form->handleRequest($request);

          if ($form->isSubmitted() && $form->isValid()) {
              return $this->redirectToRoute('home');
          }

          return $this->render('@Map/Book/book.html.twig', 
                              array(  // data for rendering ,
                                      "form" => $form->createView()
                               ));
    /**
     * @param Request $request
     * @return Response
     * @Route("/rendering_form/validation", name="validationRenderingForm")
     */
    public function validationRenderingForm(Request $request){
        $form = $this->createMyForm();
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $data = $form->getData();
            $errors = $this->getDataErrorCustom($data);

            if ($errors){
                 $response = ['status' => 'fail',
                              'errors' => $errors ];
            }else{
                 $response = ['status' => 'success'];
            }
        }else {
            $response = ["status" => 'fail',
                         "errors" => $form->getErrors()];
        }

        $reponse = new Response(json_encode($reponse));
        $reponse->headers->set('Content-Type', 'application/json');
        return $reponse;
    }

1 个答案:

答案 0 :(得分:0)

fancybox提供了一个方便的beforeClose回调,您可以使用它来停止关闭模式,只需返回false。因此,如果您选择使用ajax提交并验证表单,则可以在等待响应时显示加载图标(使用hideLoading进行隐藏):

$.fancybox.getInstance().showLoading( $.fancybox.getInstance().current );

并成功结束:

$.fancybox.getInstance().close()

对于php部分,我建议遵循dbrumann注释。