我需要在同一页面上呈现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
答案 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()
);
}