2014-02-23 54 views
1

我在單個頁面中有10個表單(它們在標籤頁中)。如何讓我的表單在Symfony中模塊化?

我的控制器功能非常龐大,爲了使表單模塊化,我打算只顯示控制器功能中的表單,並向相應的控制器進行POST。

這些10種形式中的一些用於其他頁面,因此通過更改動作url,可以更輕鬆地在單獨的控制器中管理它們。

但是,那麼如何顯示錶單錯誤和阻止表單重置,如果它是無效的?

如果嵌入式控制器可以重定向,我可以做到這一點。我錯過了另一種選擇嗎?

Symfony2必須有一個不允許嵌入式控制器重定向的原因,但我想知道爲什麼。

第三編輯:的實際形式

圖片:http://imgur.com/sIx3sgs,tnZkvqM,ZAP950s,hk45oTW#0

  1. 圖像1:步驟1(只能用一次創建)
  2. 圖2:步驟5(可創建多次)您可以看到創建表單和編輯表單
  3. 圖3:第5步用戶界面表單滑動。
  4. 圖片4:第六步一樣第一步

不需要這些表格,以便去,用戶可以創建並保存第六步而沒有需要創建第一步。

第二編輯:

這不是一個多步驟的形式。爲了方便,我將它們命名爲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')); 
    } 
} 
+0

發佈您的代碼。 –

+0

@AndrzejOśmiałowski我發佈了我的代碼。我編輯它使其更短。 – OsakaHQ

+0

你的形式(整個形式)是一種「階梯式」形式嗎? –

回答

1

我想出了4個解決方案,我能想到的,爲了從最好到最差:

  1. AJAX
  2. 沒有重定向在嵌入式控制器
  3. 保存在會議上發佈的數據/萬一form表單錯誤無效
  4. 修改Symfony2的內部,以允許從嵌入式控制器

重定向AJAX

這實際上是最好的,因爲它減少了整個頁面的請求並且它是高度模塊化的。

您將呈現所有10個嵌入式控制器,但每個提交按鈕將代替執行一個指向相應控制器的ajax帖子,該控件只會處理相應的表單,並且只會返回該特定表單的視圖。

而且你不需要對你的javascript感興趣,因爲你只需要在點擊提交時進行AJAX調用並將響應加載到表單所在的div處。


沒有重定向在嵌入式控制器

這樣做的問題是,如果用戶按下F5,它將重新發送POST數據。


保存在會話發佈數據/萬一形式形狀誤差是無效

修改Symfony2的內部,以允許從嵌入式控制器重定向

這兩個選項是不希望因爲它會造成複雜性。

+0

我仍然認爲這可能是一個設計問題;)AJAX解決方案看起來不錯,因爲它允許您使用Form Events,這在許多情況下可能會有所幫助。 –

相關問題