form_widget form symfony twig symfony-forms

symfony - form_widget - twig form



Symfony2: acceder a los campos de entidad en Twig con un tipo de campo de entidad (5)

Aquí está mi FormType:

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

¿Hay alguna forma de acceder a los campos del usuario en la vista (Twig)?

Me gustaría hacer algo como esto:

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

... donde moneyLeft y name son campos de la entidad User.


A partir de hoy, puede hacer lo siguiente en la rama principal (y próxima 2.1):

{{ u.vars.data.name }}

u es la vista de formulario para el usuario, que contiene una lista de variables adjuntas. La variable de data contiene los datos normalizados del formulario, que generalmente es su objeto (a menos que haya agregado un transformador modelo personalizado).

En versiones anteriores de Symfony, puedes hacer:

{{ u.vars.value.name }}

La variable de value contiene los datos de vista del formulario, que también es su objeto (a menos que haya agregado un modelo personalizado o un transformador de visualización).

Si está trabajando en Symfony master o> = 2.1, le recomiendo acceder a los data lugar de al value .


En Symfony 2.5, puede lograrlo accediendo a los datos de cada opción utilizando el valor del índice del niño.

En el generador de formularios, como era de esperar:

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 )); }

En la plantilla de 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) }}


Versión 2.6.7

Similar a lo que sugirió Aaron Geiser, puede usar widgets de formularios personalizados para lograr esto:

{# 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 -%}


Esto funcionó para mí en Symfony 3.1 para un widget de radio:

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


Actualización de la respuesta de Bernhard Schussek para Symfony 2.8.4 (o incluso versión algo inferior):

{% 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 %}