14

这是我的 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 }} €&lt;/span>
    {% endif %}
{% endfor %}

...其中moneyLeftname是来自用户实体的字段。

4

5 回答 5

31

在 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) }}
于 2014-09-30T23:05:21.670 回答
10

从今天开始,您可以在 master 分支(以及即将推出的 2.1)中执行以下操作:

{{ u.vars.data.name }}

u是用户的表单视图,其中包含附加变量的列表。该data变量包含表单的规范化数据,通常是您的对象(除非您添加了自定义模型转换器)。

在 Symfony 的早期版本中,您可以:

{{ u.vars.value.name }}

value变量包含表单的视图数据,它也是您的对象(除非您添加了自定义模型或视图转换器)。

如果您正在使用 Symfony master 或 >=2.1,我建议您使用 accessdata而不是value.

于 2012-07-25T17:44:22.103 回答
9

这在 Symfony 3.1 中为我工作了一个无线电小部件:

{% set entity = form.parent.vars.choices[form.vars.name].data %}
于 2016-11-03T12:25:51.663 回答
5

版本 2.6.7

与 Aaron Geiser 建议的类似,您可以使用自定义表单小部件来实现此目的:

{# 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 -%}
于 2015-05-20T08:59:20.070 回答
2

更新Bernhard SchussekSymfony 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 %}
于 2016-05-05T14:07:57.470 回答