我有一个包含3个表单的页面,它们都是独立的(用户可以完成0,1,2或3):
处理这种情况的最佳方法是什么?
我应该在我的控制器 中重复我的代码三次 吗?
public function myPageAction(Request $request)
{
// First one
$form = $this->createFormBuilder()
->add...
->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() ) {
// some code
}
// Second one
$form2 = $this->createFormBuilder()
->add...
->getForm();
$form2->handleRequest($request);
if ($form2->isSubmitted() && $form2->isValid() ) {
// some code
}
// Third one
$form3 = $this->createFormBuilder()
->add...
->getForm();
$form3->handleRequest($request);
if ($form3->isSubmitted() && $form3->isValid() ) {
// some code
}
}
在Twig中 :
我有第一个模式=用户点击并弹出一个弹出窗体的模态:
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
这个,其他模态相同:
{{ form_start(form2) }}
{{ form_widget(form2) }}
{{ form_end(form2) }}
第三个位于页面底部:
{{ form_start(form3) }}
{{ form_widget(form3) }}
{{ form_end(form3) }}
我认为这是很多代码,我重复自己太多,我可以“优化”什么? 我的第一和第二种形式是相同的事实,我可以将它们重新组合成一个吗?我可以创建一个“PhoneType”表单,但除了在我的控制器中调用两次之外我别无选择?
很抱歉,如果这里有很多问题,但我可以这样总结一下:在同一页面上处理多个表单的最佳做法是什么?(在我的控制器和我的视图中) )
答案 0 :(得分:1)
我看到了以下实现目标的方法:
但为什么不能以一种形式嵌入所有这些字段?只分割三个场就像用大炮向蜜蜂射击。我建议您使用第三种方法,因为这是最简单的方法。
答案 1 :(得分:0)
我认为您应该创建包含3个字段的1个表单。你可以按行显示它。
{{ form_row(nameOfRow)}}
答案 2 :(得分:0)
如果表单彼此独立,您可以执行3个twig功能(twig扩展)以在模板中呈现表单,并使用3个不同的操作控制器来处理每个表单。
Twig扩展
class FormExtension extends \Twig_Extension{
private $formFactory;
public function __construct(FormFactoryInterface $formFactory)
{
$this->formFactory = $formFactory;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('get_form_1', array($this, 'getFormOne')),
new \Twig_SimpleFunction('get_form_2', array($this, 'getFormtwo'))
];
}
public function getFormOne()
{
$form = $this->formFactory->create(FormOneType::class,null,[]);
return $form->createView();
}
public function getFormTwo()
{
$form = $this->formFactory->create(FormTwoType::class,null,[]);
return $form->createView();
}
}
template.html.twig
{% if formOne is not defined %}
{% set formOne = get_form_1() %}
{% endif %}
{{ form_start(formOne, {'action': path('route_handle_form_1')) }}
{{ form_row(formOne.field1) }}
{{ form_row(formOne.field2) }}
{{ form_row(formOne._token) }}
{{ form_end(formOne) }}
{% if formTwo is not defined %}
{% set formTwo = get_form_2() %}
{% endif %}
{{ form_start(formTwo , {'action': path('route_handle_form_2')) }}
{{ form_row(formTwo.field1) }}
{{ form_row(formTwo.field2) }}
{{ form_row(formTwo._token) }}
{{ form_end(formTwo) }}
控制器
class FormController extends Controller{
/**
* @Route("/form-1", name="route_handle_form_1")
* @Method("POST")
*/
public function handleFormOneAction(Request $request)
{
$form = $this->formFactory->create(FormOneType::class,null,[]);
$form->handleRequest($request);
if ($form->isValid()) {
//do some action, persist object...
//create a flashbag
//redirect to some page
}
return $this->render("template.html.twig",array(
'formOne' => $form->createView(),
));
}
/**
* @Route("/form-2", name="route_handle_form_2")
* @Method("POST")
*/
public function handleFormTwoAction(Request $request)
{
$form = $this->formFactory->create(FormTwoType::class,null,[]);
$form->handleRequest($request);
if ($form->isValid()) {
//do some action, persist object...
//create a flashbag
//redirect to some page
}
return $this->render("template.html.twig",array(
'formTwo' => $form->createView(),
));
}
}
我使用twig扩展名,因为我认为你想在所有模板中使用3个表单,如果你不需要,你可以避免twig扩展并只在控制器中创建3个表单,它们将页面呈现在哪里是表单