0

我在 Symfony2 (v 2.2) 中构造表单时遇到困难。我需要具有多对多连接的数据表形式。看起来很复杂。

我在数据库中有这样的实体

  • 游戏
  • 字段
  • 价值观
  • 类别

实体之间的连接PNG):

Categories <- Values -> Fields -> Game

值包含字段和类别的 FK,并具有我需要保存在表单中的字段“值”(见下文)。Fields 包含 FK 到 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 标题包含字段标题(来自字段表的记录),行标题包含类别标题(从类别表记录)。在表格单元格中有存储在值表中的输入字段,我需要保存这些字段。如果表格 Values 中存在适当的值,我们将显示其值(并在表单提交期间更新)。如果不是,那么我们必须输入值并在数据库中创建这样的记录。

我想:

  • 自定义表单类型 Games 其中游戏是字段类型 Collection
  • 每个游戏都包含自定义表单类型值(或类似类别-值-字段)

但在那种情况下,我什至不知道如何在 formBuilder 中构造列表“游戏”中的列表“值”。

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

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

谢谢

4

1 回答 1

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');

为了能够以表格的方式显示您的表单,我将向模板传递一个可用类别数组并在其上循环以显示好单元格中的每个小部件。

此解决方案不允许您为不存在的值添加空白输入字段。在使用实体创建表单之前,您可以通过在字段实体的缺失类别中添加事实空值(如空字符串)来绕过该问题。

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

另一种方法可能是监听 Form Event PRE_SET_DATA 并在那里添加丢失的数据。

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

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

于 2013-07-16T09:00:25.210 回答