2013-06-20 41 views
0

我在Symfony2(v 2.2)中構建表單時遇到困難。 我需要具有多對多連接的數據表格形式。它看起來很複雜。Symfony2:複雜的多對多或數據表形式

我在DB這樣的實體:

  • 遊戲
  • 分類
  • 實體之間

連接PNG):

Categories <- Values -> Fields -> Game 

值包含字段和類別的FK,並具有字段「值」女巫我需要保存在我的表單(見下文)。 字段包含遊戲的FK。

需要這樣的形式PNG

Game1 
------------------------------------ 
      Field1 Field2 Field3 
Category1 x   x   x 
Category2 x   x   x 
Category3 x   x   x 

Game2 
------------------------------------ 
      Field1 Field2 Field3 
Category1 x   x   x 
Category2 x   x   x 
Category3 x   x   x 

x - <input type='text'> 

每場比賽(展示頁面上只有遊戲標題)具有可編輯的表格(表視圖),其中的cols頭包含(從字段表中的記錄)字段標題和行頭包含類別標題(從類別表中記錄)。 在表單元格中,存儲在值表中的輸入字段,我需要保存。如果表值中存在適當的值,我們將顯示其值(並在表單提交期間更新)。如果不是,那麼我們必須輸入值並在DB中創建這樣的記錄。

心想:

  • 自定義表單類型的遊戲,其中游戲是字段類型集合
  • 每場比賽包含自定義表單類型的值(或類似的東西分類值,場)

但在這種情況下,我甚至不知道如何在formBuilder中列出「遊戲」列表中的「值」列表。

另一個問題是如何僅顯示來自類別和字段的值,並且不顯示任何輸入,因爲我不需要更改這些表。

請給我一些關於如何構建此類表單的建議。

謝謝

回答

0

不容易的......這裏是所有的高級視圖,我會考慮這個問題。不知道它不會提出一些其他棘手的問題,但我希望它至少會給你一些提示。我不確定你可以有一個FormType來處理所有的一次。

我會先創建一些遊戲類型遵循怎樣的實體相關:

  • 包含的FieldType集合的遊戲類型
  • 包含值類型的集合
  • 一個值類型具有的FieldType兩個字段:文本的值和類別的實體

總而言之,在僞代碼中:

GameType : 
    $builder->add('fields', 'collection', array('type' => new FieldType()); 

FieldType : 
    $builder->add('values', 'collection', array('type' => new ValueType());); 

ValueType : 
    $builder->add('value', 'text'); 
    $builder->add('category', 'entity', array('class'=>'YourBundle:Category'); 

爲了能夠以表格的方式顯示您的表單,我會傳遞給模板一個可用類別的數組,並在其上循環顯示好單元格中的每個小部件。

此解決方案不允許您爲不存在的值添加空白輸入字段。您可以通過在創建具有實體的表單之前在Field實體中缺少類別中添加事實空值(如空字符串)來繞過該問題。

// In the controller 
$game = whateverYouDoToGetTheEntityFromDB(); 
$game->addDummyEmptyValues(); 
$form = $this->createForm(new GameType(), $game); 

另一種方式可能是偵聽表單事件PRE_SET_DATA並在其中添加缺少的數據。

使用此解決方案,如果用戶在字段中未輸入任何內容,則可能會獲得值爲空的Value實體。您可以在PRE_SUBMIT(在v2.0中稱爲PRE_BIND)事件偵聽器中刪除它們(請參閱此discussion)。

對於第二個問題(不可編輯的顯示),它應該更容易:嘗試實現上述循環,而不是顯示錶單小部件,顯示實體屬性。你可以從第一個視圖開始,讓表格工作,然後嘗試用這個工作基礎來實現表格。