【问题标题】:How to deal with 3 form on the same page?如何处理同一页面上的 3 个表单?
【发布时间】:2017-08-18 09:58:14
【问题描述】:

我有一个包含 3 个表单的页面,它们都是独立的(用户可以完成 0、1、2 或 3):

  • 如果用户想被呼叫,第一个询问电话号码;
  • 如果用户希望通过 SMS 联系第二个,则执行相同的操作;
  • 如果用户想添加评论,则使用第三个

处理这种情况的最佳方法是什么?

我是否应该在我的控制器中重复我的代码三遍

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”表单,但我别无选择,只能在我的控制器中调用它两次?

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

【问题讨论】:

    标签: forms symfony controller twig


    【解决方案1】:

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

    1. 使用复合表单(将表单嵌入到全局表单中),
    2. 尝试使用类似多步骤的表单,请参阅:https://github.com/craue/CraueFormFlowBundle
    3. 使用事件动态修改表单:https://symfony.com/doc/current/form/dynamic_form_modification.html

    但是为什么不能将所有这些字段嵌入到一个表单中呢?分割仅有的三个区域就像使用大炮射击蜜蜂一样。我建议您使用第三种方法,因为这是最简单的一种。

    【讨论】:

    • 我将编辑我的问题,但表单同时不可见:我有一个模式用于第一个,第二个相同,第三个位于底部。用户可以在同一页面上完成 0、1、2 或 3 个表单,它们不相互依赖
    • 它们不需要同时有效。
    【解决方案2】:

    我认为您应该创建一个包含 3 个字段的表单。您可以按行显示它。

    {{ form_row(nameOfRow)}}
    

    【讨论】:

    • 不,我不能,我会编辑我的问题,也许不清楚,但我的 3 个表单“同时”不可见。我有 2 个模态(用于第一种和第二种形式),第三个位于页面底部。所以我需要控制每一个!
    【解决方案3】:

    如果表单彼此独立,您可以执行 3 个 twig 函数(twig 扩展)来在模板中呈现表单,并使用 3 个不同的操作控制器来处理每个提交的表单。

    树枝扩展

    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 个表单

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多