当验证失败并在同一页面上显示2个表单时呈现问题

时间:2016-04-01 09:01:06

标签: forms symfony twig

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

第二个动作在twig中用:

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

当表单2的验证失败时,两者都被渲染,两者都有效。 Controller将用户返回到具有表单错误的表单,但不是返回整个页面,而是仅呈现表单。

我的代码如下:

第一步:

/**
 * @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 global(whole_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

2 个答案:

答案 0 :(得分:0)

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

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

要更改第二个表单操作,请使用以下方法:

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

或者你可以为第二种形式实现ajax处理(如果你需要在单独的动作中保持它的逻辑)。

答案 1 :(得分:0)

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

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