Как получить каждый экземпляр сущности поля EntityType с помощью Twig внутри формы Symfony 3

В большинстве случаев таблицы без внешних связей в базе данных далеки от реальности. Это означает, что у вас всегда будет хотя бы одно внешнее отношение из таблицы в другую, игнорируя тип проекта. В отношениях «многие ко многим», реализованных с помощью Doctrine в вашем проекте Symfony, может быть головной болью, однако, если вы узнали, как правильно реализовать, у вас наверняка есть поле EntityType в вашей форме. В этой статье мы создадим простой пример с отношением «Игры к категориям», в этом случае каждая игра может быть связана со многими категориями, что означает, что в нашей форме «Игры» мы дадим пользователю возможность выбирать, к каким категориям связано с игрой, поэтому наше поле Entity будет отображаться как несколько флажков, и, очевидно, допускается несколько вариантов выбора:

add('Categories', EntityType::class, [
// Multiple selection allowed
'multiple' => true,
// Render as checkboxes
'expanded' => true,
// This field shows all the categories
'class'    => Categories::class,
'mapped' => false
]);
// ... //
}
// ... //
}

В нашей форме ветки Игровой сущности мы могли легко визуализировать поле, используя form_row или рендеринг всей формы один раз с помощью Twig:

{{ form_start(games_form) }}
{#
Render all widgets of the Form
#}
{{ form_widget(games_form) }}
{{ form_end(games_form) }}

Но это дало бы следующий результат в нашем проекте:

Twig Custom Render с сущностью

Согласно вашим правилам CSS или дизайна, вы не хотите этого, потому что это довольно уродливо, для вас и для пользователя. В нашем проекте у каждой категории есть значок (изображение), и мы хотим иметь возможность отображать какую-то панель с тем же флажком, но также отображающим название категории и значок, и для этого нам нужно получить каждый сущность каждого флажка.

Получение объекта Entity с помощью Twig

Первое, что вам нужно знать, — это то, что при работе с полем EntityType, которое раскрывается и допускает несколько выборок, виджет по умолчанию отображает группу флажков, поэтому вы можете перебирать их с помощью цикла for. Как в нашем GamesForm Category Поле называется «Категории», мы можем отобразить каждый виджет как:

{% for CategoryField in GamesForm.Categories %}
{{ form_row(CategoryField) }}
{% endfor %}

Однако это все еще довольно уродливо (хотя мы знаем, как его настроить сейчас):

Twig Entity Поле Custom Render

Как упоминалось ранее, у каждой сущности категории есть свойство, а именно значок, в котором хранится имя значка каждой категории, поэтому мы можем сгенерировать более красивый виджет для выбора категории в форме, извлекая ее сущность, чтобы узнать, какой является иконкой каждой сущности. Это может быть достигнуто следующим образом:

{% for CategoryField in GamesForm.Categories %}
{# store index of the category in a variable #}
{% set index = CategoryField.vars.value %}
{# get entity object from its index in the Categories Field #}
{% set entity = GamesForm.Categories.vars.choices[index].data %}
{#
The entity variable contains a CategoryEntity with all its properties.
So we can now render
#}

{{ form_label(category_type) }}

{{ form_widget(category_type) }}

{% endfor %}

Который в нашем проекте будет генерировать следующие виджеты:

Twig Retrieve Entity of EntityType поле

Выглядит лучше не так ли? Как видите, сущность каждого флажка поля EntityType может быть получена из form.FieldName.vars.choices объект, который содержит варианты выбора поля. Чтобы получить правильную сущность, вам просто нужно указать индекс массива выбора и извлечь сущность из data имущество.

Ссылка на основную публикацию
Adblock
detector