我有与Grid
一对多的GridElement
模型。 GridElement
具有以下结构:
<?php
class GridElement
{
/** @var Grid */
private $grid;
/** @var Column */
private $column;
/** @var int */
private $row;
/** @var string */
private $value;
}
$column
与Column
模型是多对一的关系。这里要知道的是,当我要创建或更新Grid
时,它的列是固定的:一个人只能添加或删除行。
现在,我想使用Symfony Form组件来编辑Grid,更具体地说是编辑其元素。
我的问题是关于HTML渲染的。我需要类似的HTML:
<table>
<tr>
<th></th>
<th>Column A</th>
<th>Column B</th>
</tr>
<tr>
<td>Line 1</td>
<td>
<input type="hidden" name="elements[0][columnId]" value="1">
<input type="hidden" name="elements[0][row]" value="1">
<input type="text" name="elements[0][value]" value="A1">
</td>
<td>
<input type="hidden" name="elements[1][columnId]" value="2">
<input type="hidden" name="elements[1][row]" value="1">
<input type="text" name="elements[1][value]" value="B1">
</td>
</tr>
<tr>
<td>Line 2</td>
<td>
<input type="hidden" name="elements[2][columnId]" value="1">
<input type="hidden" name="elements[2][row]" value="2">
<input type="text" name="elements[2][value]" value="A2">
</td>
<td>
<input type="hidden" name="elements[3][columnId]" value="2">
<input type="hidden" name="elements[3][row]" value="2">
<input type="text" name="elements[3][value]" value="B2">
</td>
</tr>
</table>
如果我的网格开始是空的,那么生成这样的东西并使其全部正常工作是没有问题的。只需一些JavaScript代码即可生成新行,并删除其他行,在这里没什么难的。
我不知道的部分是,当我的表单首先包含一些元素时,如何生成这样的内容?我可以创建一个模板来定义GridElement
的呈现方式(即其中包含3个输入的<td>
部分),但是我看不到如何将GridElement
排列成行。
我是否应该循环浏览元素并生成表单,而没有任何表单呈现功能?这样,我将能够实现自己的逻辑,从而知道从何处开始<tr>
和何时结束它。错误消息不会成为问题,因为如果单元格中有错误,则该消息将位于elements路径上,而不是特定元素上。
或者还有我看不到的更好的方式?
我认为您应该将CollectionType与原型一起使用。这项功能与jQuery配合使用,您可以根据需要自定义项目。不简单,但是效果很好。
https://symfony.com/doc/current/form/form_collections.html#allowing-new-tags-with-the-prototype