Symfony ChoiceType глубокая настройка меток - PullRequest
0 голосов
/ 09 января 2019

Я хочу сильно настроить метки выбора моего EntityType, например, создать таблицу с несколькими атрибутами моей модели.

Итак, я хочу получить доступ к атрибутам класса моих выборов. Выбор - мои сущности от класса MyClass до EntityType. Как я могу сделать это в ветке?

В настоящее время я делаю это так:

1. в моем FormClass I json_encode все поля, которые мне нужны в моем ярлыке

2. в моем шаблоне I 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 %}

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

Спасибо, Ким

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Хорошо, я понял, вот пример того, как получить доступ к данным вашего EntityType в ветке. Вы можете проверить список 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 %}
0 голосов
/ 10 января 2019

В форме 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...