如何在同一页面上处理3表格?

时间:2017-08-18 09:58:14

标签: forms symfony controller twig

我有一个包含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”表单,但除了在我的控制器中调用两次之外我别无选择?

很抱歉,如果这里有很多问题,但我可以这样总结一下:在同一页面上处理多个表单的最佳做法是什么?(在我的控制器和我的视图中) )

3 个答案:

答案 0 :(得分:1)

我看到了以下实现目标的方法:

  1. 使用复合形式(在全局形式中嵌入表单),
  2. 尝试使用类似多步骤的表单,请参阅:https://github.com/craue/CraueFormFlowBundle
  3. 使用事件动态修改表单:https://symfony.com/doc/current/form/dynamic_form_modification.html
  4. 但为什么不能以一种形式嵌入所有这些字段?只分割三个场就像用大炮向蜜蜂射击。我建议您使用第三种方法,因为这是最简单的方法。

答案 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个表单,它们将页面呈现在哪里是表单