Symfony2:复杂的多对多或数据表格式

时间:2013-06-20 18:39:46

标签: php symfony symfony-forms symfony-2.2

我在Symfony2(v 2.2)中构建表单时遇到了困难。 我需要像数据表一样的多对多连接。它看起来很复杂。

我在DB中有这样的实体

  • 游戏
  • 字段
  • 分类

实体之间的连接PNG):

Categories <- Values -> Fields -> Game

值包含字段和类别的FK,并且我需要在表单中保存字段“value”(见下文)。 Fields包含FK to Games。

需要此类表格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标题包含Fields标题(Fields表中的记录),行标题包含Categories标题(从Categories表中记录)。 在表格单元格中,存储在Values表中的输入字段需要保存。如果表值中存在适当的值,则表示其值(并在表单提交期间更新)。如果不是,那么我们必须输入值并在DB中创建这样的记录。

我想:

  • 自定义表单类型游戏为字段类型集合的游戏
  • 每个游戏都包含自定义表单类型值(或类别 - 值 - 字段)

但是在那种情况下我甚至不知道如何在formBuilder中构建列表“Games”中的列表“Values”。

另一个问题是如何仅显示“类别”和“字段”中的值,并且不显示任何输入,因为我不需要更改这些表。

请给我一些关于如何构建此类表格的建议。

谢谢

1 个答案:

答案 0 :(得分:0)

不是一个简单的...这是一个高级别的观点,我会考虑这个问题。不确定它不会引发一些其他棘手的问题,但我希望它至少会给你一些提示。我不确定你是否可以有一个FormType来同时处理所有这些。

我首先会创建一些跟随实体相关的GameType:

  • 包含FieldType
  • 集合的GameType
  • 包含ValueType
  • 集合的FieldType
  • 包含两个字段的ValueType:值的文本和类别
  • 的实体

总结一下,伪代码:

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实体中添加缺少的类别中的factice空值(如空字符串)来绕过该问题。

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

另一种方法可能是收听表单事件PRE_SET_DATA并在那里添加缺少的数据。

使用此解决方案,如果用户未在字段中输入内容,您可能会获得具有空值的Value实体。您可以在PRE_SUBMIT(在v2.0中称为PRE_BIND)事件侦听器中删除它们(请参阅此discussion)。

对于您的第二个问题(不可编辑的显示),它应该更容易:尝试实现上面的循环,但不显示窗体小部件,显示实体属性。您可以从第一个视图开始,以使表格正常工作,然后尝试使用此工作基础来实现表单。