如何在Symfony中使我的表单模块化?

时间:2014-02-23 22:05:53

标签: php forms symfony

我在一个页面中有10个表单(它们位于标签页中)。

我的控制器功能非常庞大,为了使表单模块化,我计划只在控制器功能中显示表单并对其对应的控制器执行POST。

这10个表单中的一些用于其他页面,因此通过更改操作URL,可以更轻松地在单独的控制器中管理它们。

但是,如果表单无效,我将如何显示表单错误并阻止重置表单?

如果嵌入式控制器可以重定向,我可以实现这一点。我错过了另一种选择吗?

Symfony2必须有理由不允许嵌入式控制器中的重定向,但我想知道为什么。

第三次修改:

实际表格的图片:http://imgur.com/sIx3sgs,tnZkvqM,ZAP950s,hk45oTW#0

  1. 图片1:步骤1(只能创建一次)
  2. 图片2:Step5(可以多次创建)您可以看到创建表单和编辑表单
  3. 图3:Step5 ui表格滑了。
  4. 图4:步骤6与步骤1相同
  5. 这些表单不需要按顺序排列,用户无需创建step1即可创建和保存step6。

    第二次修改:

    这不是一个多步形式。为方便起见,我将它们命名为Step1Step2等。

    修改

    这就是我所拥有的:

    class DefaultController extends Controller{
        public function processAction(){
            $request = $this->getRequest();
            /*** FORM 1 ****/
            $entity  = new Step1();
            $form1   = $this->createForm(new Step1Type(), $entity);
            if ($request->getMethod() == 'POST'){
                $form1->bindRequest($request);
                if($form1->isValid()){
                    return $this->redirect($this->generateUrl('some_link'));
                }
            }
            /***/
            //Do the same for other forms
    
            return array(
                'form1'   => $form1->createView()
                //[...to form10]
            );
        }
    }
    

    这就是我想要的:(我会用嵌入式控制器来做,但你不能重定向)

    class DefaultController extends Controller{
        public function processAction(){
            $request = $this->getRequest();
            /*** FORM 1 ****/
            $entity  = new Step1();
            $form1   = $this->createForm(new Step1Type(), $entity);
            //change $form1 action url to point to Step1Controller->createAction()
            /***/
            //Do the same for other forms
    
            return array(
                'form1'   => $form1->createView()
                //[...to form10]
            );
        }
    }
    class Step1Controller extends Controller{
        public function createAction(){
            $request = $this->getRequest();
    
            $entity  = new Step1();
            $form   = $this->createForm(new Step1Type(), $entity);
    
            $form->bindRequest($request);
            if($form->isValid()){
                //save entity
                return $this->redirect($this->generateUrl($getRedirectLinkFromForm));
            }
            return $this->redirect($this->generateUrl('some_other_link')); 
        }
    }
    

1 个答案:

答案 0 :(得分:1)

我提出了4个我能想到的解决方案,从最好到最差:

  1. AJAX
  2. 嵌入式控制器中没有重定向
  3. 在案例表单无效的情况下保存会话发布的数据/表单错误
  4. 修改Symfony2内部以允许从嵌入式控制器重定向
  5. <强> AJAX

    这实际上是最好的,因为它减少了整个页面请求,并且它是高度模块化的。

    您将渲染所有10个嵌入式控制器,但每个提交按钮将改为执行指向对应控制器的ajax帖子,该控制器仅处理相应的表单,并且仅返回该特定表单的视图。

    你不需要对你的javascript感兴趣,因为你只需要在点击提交时进行AJAX调用并将响应加载到表单所在的div。


    嵌入式控制器中没有重定向

    问题在于,如果用户按下F5,它将重新发送POST数据。


    在案例表单无效的情况下保存会话中发布的数据/表单错误

    修改Symfony2内部以允许从嵌入式控制器重定向

    这两个选项不太理想,因为它会增加复杂性。