2012-04-26 21 views
14

Aquí está mi FormType:Symfony2: acceso a campos de entidad en la ramita con un tipo de campo entidad

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

¿Hay una manera de acceder a los campos de usuario en la vista (ramita)?

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 nombre son campos de entidad Usuario.

+1

Aquí hay una enlace a un problema de Symfony en Github que tiene un buen código para que la gente vaya en la dirección correcta: [Problema 3836] (https://github.com/symfony/symfony/issues/3836#issuecomment-23145270) – keyboardSmasher

Respuesta

9

A partir de hoy, se 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 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, se puede hacer:

{{ u.vars.value.name }} 

La variable value contiene la vista de los datos de la forma, que es también su objeto (a menos que agregó un modelo personalizado o ver transformador).

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

+0

Para una entidad tipo de formulario que tuve que hacer esto: '{{u.data.field}}' al repetir las opciones – ncatnow

+1

Cómo obtuve los votos, no tengo idea. Es simplemente incorrecto.Publiqué un comentario en el OP con un enlace a una solución. – keyboardSmasher

+0

@keyboardSmasher: puedes darte cuenta de que bernhard es la misma persona que cerró el problema que has vinculado a github, así que estoy seguro de que ahora puedes descifrar por qué esta respuesta tiene 6 votos ascendentes: estoy seguro (como Yo respondería de la misma manera) que este método está funcionando – DonCallisto

30

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

En el constructor de la forma - 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 la ramita:

{{ 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) }} 
+1

Sugiero usar '{% set entity = projectForm.stages.vars.choices [loop.index - 1] .data%}' en lugar de obtener el índice del valor de la propiedad de la entidad. De esta forma puede evitar el error de clave de matriz desconocida. –

+0

@NikDenisov el bucle también tiene una variable 'loop.index0': https://twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable por lo que no es necesario -1 –

3

Versión 2.6.7

Similar a lo que sugirió Aaron Geiser, puede usar customised form widgets 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 -%} 
2

Actualización de Bernhard Schussek's answer para Symfony 2.8.4 (o incluso algo versión más baja):

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

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

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

Hello , ¿cómo puedo hacer lo mismo pero con un campo CollectionType? Imposible acceder a los datos de recolección porque el método es privado ... – Felurian

Cuestiones relacionadas