Symfony2: доступ к полям объекта в Twig с типом поля объекта

Вот мой FormType:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder
        ->add('user', 'entity', array(
            'class'   => 'UserBundle:User',
            'expanded' => true,
            'property' => 'name',
        ));
}

Есть ли способ доступа к полям пользователя в представлении (Twig)?

Я хотел бы сделать что-то вроде этого:

{% for u in form.user %}
    {{ form_widget(u) }}
    {{ form_label(u) }}
    {% if u.moneyLeft > 0 %}
    <span>{{ u.name }} : {{ u.moneyLeft }} €</span>
    {% endif %}
{% endfor %}

... где moneyLeft и имя - поля из пользовательского объекта.

Ответ 1

В Symfony 2.5 вы можете выполнить это, обратившись к данным из каждого выбора, используя значение дочернего индекса.

В построителе форм - как и следовало ожидать:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    // Generate form
    $builder
        ->add('child', 'entity', array(
            'class'         => 'MyBundle:Child',
            'label'         => 'Children',
            'property'      => 'any_property_for_label',
            'expanded'      => true,
            'multiple'      => true
        ));
}

В шаблоне Twig:

{{ form_start(form) }}
{% for child in form.child %}
    {% set index = child.vars.value %}{# get array index #}
    {% set entity = form.child.vars.choices[index].data %}{# get entity object #}
    <tr>
        <td>{{ form_widget(child) }}</td>{# render checkbox #}
        <td>{{ entity.name }}</td>
        <td>{{ entity.email }}</td>
        <td>{{ entity.otherProperty }}</td>
    </tr>
{% endfor %}
{{ form_end(form) }}

Ответ 2

На сегодняшний день вы можете сделать следующее в главной ветке (и в ожидании 2.1):

{{ u.vars.data.name }}

u - это вид формы для пользователя, который содержит список присоединенных переменных. Переменная data содержит нормализованные данные формы, которая обычно является вашим объектом (если вы не добавили настраиваемый трансформатор модели).

В более ранних версиях Symfony вы можете:

{{ u.vars.value.name }}

Переменная value содержит данные представления формы, которая также является вашим объектом (если вы не добавили настраиваемую модель или трансформатор представлений).

Если вы работаете с мастером Symfony или >= 2.1, я рекомендую получить доступ к data вместо value.

Ответ 3

Это работало для меня в Symfony 3.1 для радио-виджета:

{% set entity = form.parent.vars.choices[form.vars.name].data %}

Ответ 4

Версия 2.6.7

Подобно тому, что предложил Аарон Гейзер, вы можете использовать настраиваемые виджеты формы, чтобы достичь этого:

{# src/AppBundle/Resources/views/Form/fields.html.twig #}
{% extends 'form_div_layout.html.twig' %}

{%- block entity_widget -%}
    <div {{ block('widget_container_attributes') }}>
    {%- for n, child in form %}
        {{- form_widget(child, {
            'entity': form.vars.choices[n].data
        }) -}}
        {{- form_label(child) -}}
    {% endfor -%}
    </div>
{%- endblock %-}

{%- block radio_widget -%}
{# You now have access to entity #}
{%- endblock -%}

Ответ 5

Обновление Ответ Bernhard Schussek для Symfony 2.8.4 (или даже несколько более низкая версия):

{% for key,value in form.user %} {# key is the ID in the database table #}
    {{ form_widget(value, {'label':value.vars.label}) }}
    {{ form.user.vars.choices[key].data.moneyLeft }} {# this syntax is new #}
{% endfor %}