Как отрисовать электронную сеточную форму с Symfony Компонентом формы? - PullRequest
0 голосов
/ 10 апреля 2020

У меня есть 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 Компонент формы, чтобы возможность редактировать мою сетку, а точнее ее элементы.

Моя проблема связана с рендерингом 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 (ie. <td> часть с 3 входами в ней), однако я не понимаю, как мне организовать свои GridElement s в строках.

Должен ли я просто oop просмотреть свои элементы и сгенерировать форму без каких-либо функций рендеринга формы? Таким образом, я смогу реализовать свою собственную логику c, чтобы знать, где начинать <tr> и когда ее заканчивать. Сообщения об ошибках не будут проблемой, потому что в случае ошибки в ячейке сообщение будет находиться по пути elements , а не по указанному c element one.

Or Есть ли причудливый способ, которым я не вижу?

1 Ответ

0 голосов
/ 15 апреля 2020

Я думаю, вы должны использовать CollectionType с прототипом. Это работает с jQuery, и вы можете пользовательский элемент, как вы хотите. Не просто, но прекрасно работает.

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

...