これが私の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およびnameはユーザーエンティティのフィールドです。
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.1)で次のことを実行できます。
{{ u.vars.data.name }}
u
はユーザーのフォームビューであり、添付された変数のリストが含まれています。 data
変数には、フォームの正規化されたデータが含まれます。これは通常、オブジェクトです(カスタムモデルトランスフォーマーを追加した場合を除く)。
以前のバージョンのSymfonyでは、次のことができます。
{{ u.vars.value.name }}
value
変数には、フォームのビューデータが含まれます。これは、オブジェクトでもあります(カスタムモデルまたはビュートランスフォーマーを追加した場合を除く)。
Symfonyマスターまたは> = 2.1で作業している場合は、data
ではなくvalue
にアクセスすることをお勧めします。
これは、Symfony3.1のラジオウィジェットで機能しました。
{% set entity = form.parent.vars.choices[form.vars.name].data %}
バージョン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 -%}
Bernhard Schussekの回答 forSymfony 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 %}