Symfony ChoiceType - глубокая настройка меток

Я хочу сильно настроить метки выбора моего 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 %}

Работающий. Но есть ли способ лучше?

Спасибо, Ким

почему json? вы могли бы обычай без него ..

hoover_D 09.01.2019 09:50

@hoover_D как? У меня нет доступа к выбранной сущности в шаблоне. Итак, как я могу получить доступ к атрибутам моей сущности (в моем случае MyClass)?

Kim 09.01.2019 19:27
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
388
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В форме 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, поэтому я спрашиваю здесь.

Kim 10.01.2019 19:58

В заголовке вашего вопроса указано ChoiceType; Было непонятно, что вы конкретно говорите только о EntityType, это выглядело просто как пример. field.var.choices всегда представляет собой массив объектов ChoiceView в любом из них (поскольку объект - это просто расширение по выбору). Единственное отличие состоит в том, что в EntityType значением choices[i].data будет сама сущность, в противном случае это будет значение поля. Вы также можете получить доступ к этикетке через choices[i].label.

futureal 10.01.2019 21:56
Ответ принят как подходящий

Хорошо, я понял, вот пример того, как получить доступ к данным вашего выбора 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 %}

Другие вопросы по теме