【问题标题】:Render issue when validation fail with 2 forms on the same page在同一页面上使用 2 个表单验证失败时呈现问题
【发布时间】:2016-07-21 00:16:04
【问题描述】:

我需要在同一页面上呈现 2 个表单。为此,我的控制器中有 2 个操作,第一个操作管理表单 1 并渲染整个页面,第二个操作管理表单 2 并仅渲染此表单。

第二个动作在 twig 中调用:

{% render (controller("AppBundle:User:secondForm")) %}

两者都被渲染,都可以工作,除非表单 2 的验证失败。控制器将用户返回到表单错误的表单,但不是返回整个页面,而是仅呈现表单。

我的代码如下所示:

第一个动作:

/**
 * @Route("/profile/global-page", name="global_page")
 */
public function Global1Action(Request $request)
{
    [.......]

    $process = $formHandler->process($user);
    if ($process) {
        $request->getSession()->getFlashBag()->add('success', 'ok');
        return $this->redirect($this->generateUrl('an_url'));
    }

    return $this->render('entire_page.html.twig', array(
        'form' => $form->createView(),
    ));
}

然后是 Twig 全局 (entire_page.html.twig):

{% extends 'base.html.twig' %}

{% block content %}

{#FlashBags#}
{% include 'components/alert.html.twig' with {'type':'success'} %}

<div class="col-md-offset-3 col-md-6">
    <div class="col-md-12 row">
        <div class="panel panel-profil">
            <div class="panel-heading">
                <h3 class="panel-title">form 1</h3>
            </div>
            <div class="panel-body">
                <form action="{{ path('global_page') }}" method="POST" class="form-horizontal text-center">
                    {{ form_widget(form) }}
                    <button type="submit" name="submit" class="btn btn-main button-sm">Go</button>
                </form>
            </div>
        </div>
    </div>
</div>
{% render (controller("AppBundle:User:secondForm")) %}

{% endblock %}

然后是 SecondForm 动作:

    /**
 * @Route("/profile/second-form", name="second_form")
 */
public function secondFormAction(Request $request)
{
    [.......]

    $process = $formHandler->process($user);
    if ($process) {
        $request->getSession()->getFlashBag()->add('success', 'ok');
        return $this->redirect($this->generateUrl('an_url'));
    }

    return $this->render('only_form2.html.twig', array(
        'form' => $form->createView(),
    ));
}

最后是第二根树枝(only_form2.html.twig):

    <div class="col-md-offset-3 col-md-6">
<div class="col-md-12 row">
    <div class="panel panel-profil" style="margin-top: 10px;">
        <div class="panel-heading">
            <h3 class="panel-title"> second form panel </h3>
        </div>
        <div class="panel-body">
            <form action="{{ path('second_form') }}" {{ form_enctype(form) }} method="POST">
                {{ form_widget(form) }}
                <button type="submit" name="submit" class="btn btn-main button-sm">Go 2</button>
            </form>

        </div>
    </div>
</div>

我不明白如何将用户返回到整个页面(有表单错误),而不是在验证失败时只呈现第二个表单。

谢谢!

编辑:我发现了这个post,它解释了如何在一个控制器中拥有 2 个表单。下面的答案似乎不适用于 Symfony 2.8

【问题讨论】:

    标签: forms symfony twig


    【解决方案1】:

    要解决此问题,您需要将表单请求发送到呈现整个页面的操作 (Global1Action)。不要在创建第二个表单的地方采取行动。

    您还需要将两个表单处理移至Global1Action

    要更改第二个表单动作,请使用此方法:

    $form->setAction($this->generateUrl('global_page'))
    

    或者您可以为第二种形式实现 ajax 处理(如果您需要将其逻辑保留在单独的操作中)。

    【讨论】:

      【解决方案2】:

      您可以使用多表单操作。像这样:

      public function multiformAction()
      {
          $form1 = $this->get('form.factory')->createNamedBuilder($formTypeA, 'form1name')
          ->add('foo', 'text')
          ->getForm();
      
          $form2 = $this->get('form.factory')->createNamedBuilder($formTypeB, 'form2name')
          ->add('bar', 'text')
          ->getForm();
      
          if('POST' === $request->getMethod()) {
      
             if ($request->request->has('form1name') {
              // handle the first form
             }
      
             if ($request->request->has('form2name') {
              // handle the second form
             }
          }
      
         return array(
          'form1' => $form1->createView(),
          'form2' => $form2->createView()
         );  
      }
      

      看到这个post。还有这个question

      【讨论】:

      • 谢谢你们,如果这是完成这项工作的更好方法,我将一次性完成。
      猜你喜欢
      • 1970-01-01
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多