Я хочу сильно настроить метки выбора моего EntityType, например создать таблицу с несколькими атрибутами моей модели.
Итак, я хочу получить доступ к своим атрибутам класса choices. Выбор - это мои сущности от класса MyClass до EntityType. Как я могу сделать это в веточке?
Сейчас делаю так:
1. в моем FormClass I json_encode все поля, которые мне нужны в моем лейбле
2. в моем шаблоне я json_decode эту информацию и отображаю в соответствии с
В КОДЕ:
1.
$builder
->add('field', EntityType::class, [
'class' => MyClass::class,
'multiple' => false,
'expanded' => true,
],
'choice_label' => function (MyClass $myClass) {
$data = [
'name' => $myClass->getName(),
'description' => $myClass->getDescription(),
];
return json_encode($data);
},
])
2.
{% block my_form_widget %}
...
{# form is my 'field' FormView of the EntityType #}
{% for child in form %}
{# child is a FormView, one choice of my EntityType #}
{# child.vars.data is boolean as its a checkbox #}
{% set data = child.vars.label|json_decode %}
create some complex html here, like tables
...
{% endfor %}
...
{% endblock %}
Работающий. Но есть ли способ лучше?
Спасибо, Ким
@hoover_D как? У меня нет доступа к выбранной сущности в шаблоне. Итак, как я могу получить доступ к атрибутам моей сущности (в моем случае MyClass)?




В форме Symfony (или поле формы, которое является просто собственной формой), которая сопоставлена с сущностью, у вас всегда есть доступ к базовым данным в form.vars.data. Таким образом, в этом случае form.vars.data будет либо null, либо экземпляром MyClass.
Для удобства использования в шаблоне вы можете сделать что-то вроде:
{% set my_object = form.field.vars.data %}
{% if my_object %}
{{ my_object.getName() }}
{{ my_object.getDescription() }}
{% endif %}
Таким образом, нет необходимости перекодировать данные вашей сущности для уровня представления, поскольку они всегда уже доступны.
Если вы работаете с EntityType и хотите получить доступ к свойствам каждого объекта выбора, они также доступны в массиве choices:
{% for choice in form.field.vars.choices %}
{{ choice.data.getName() }}
{{ choice.data.getDescription() }}
{% endfor %}
Хороший трюк, когда вы пытаетесь получить доступ к любым данным формы и не знаете, где искать, - это временно добавить строку в свой шаблон, например:
{{ dump(form.field) }}
Это позволит вам просмотреть доступные данные и увидеть, что все доступно. Обратите внимание, что для этого необходимо включить расширение отладки Twig и включить XDebug в PHP, чтобы вывод выглядел красиво.
Это не относится к выбору EntityType. Да, это для самого EntityType, но не для всех его вариантов, которые обрабатываются / отображаются как дочерние элементы формы, но там вы не можете получить доступ к данным через vars.data, поэтому я спрашиваю здесь.
В заголовке вашего вопроса указано ChoiceType; Было непонятно, что вы конкретно говорите только о EntityType, это выглядело просто как пример. field.var.choices всегда представляет собой массив объектов ChoiceView в любом из них (поскольку объект - это просто расширение по выбору). Единственное отличие состоит в том, что в EntityType значением choices[i].data будет сама сущность, в противном случае это будет значение поля. Вы также можете получить доступ к этикетке через choices[i].label.
Хорошо, я понял, вот пример того, как получить доступ к данным вашего выбора EntityType в twig. Вы можете проверить список child.parent.vars.choices.
{% block my_form_widget %}
...
{# form is my 'field' FormView of the EntityType #}
{% for child in form %}
{# child is a FormView, one choice of my EntityType #}
{# child.vars.data is boolean as its a checkbox #}
{% for choice in child.parent.vars.choices if choice.value == child.vars.value %}
{{ choice.data.name }} {# contains MyClass name #}
{{ choice.data.description }} {# contains MyClass description #}
{% endfor %}
...
{% endfor %}
...
{% endblock %}
почему json? вы могли бы обычай без него ..