如何使用Symfony表单组件呈现基于网格的表单?

问题描述 投票:0回答:1

我有与Grid一对多的GridElement模型。 GridElement具有以下结构:

<?php

class GridElement
{
    /** @var Grid */
    private $grid;

    /** @var Column */
    private $column;

    /** @var int */
    private $row;

    /** @var string */
    private $value;
}

$columnColumn模型是多对一的关系。这里要知道的是,当我要创建或更新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路径上,而不是特定元素上。

或者还有我看不到的更好的方式?

php symfony symfony-forms
1个回答
0
投票

我认为您应该将CollectionType与原型一起使用。这项功能与jQuery配合使用,您可以根据需要自定义项目。不简单,但是效果很好。

https://symfony.com/doc/current/form/form_collections.html#allowing-new-tags-with-the-prototype

© www.soinside.com 2019 - 2024. All rights reserved.