2012-04-26 14 views
14

Qui è la mia FormType:Symfony2: l'accesso ai campi di entità in Ramoscello con un tipo di campo un'entità

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

Esiste un modo per accedere ai campi di utenti nella vista (Twig)?

mi piacerebbe fare qualcosa di simile:

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

... dove moneyLeft e nome sono campi da un'entità utente.

+1

Ecco un collegamento a un problema di Symfony a Github che ha qualche bel codice per ottenere la gente andando nella direzione giusta: [edizione 3836] (https://github.com/symfony/symfony/issues/3836#issuecomment-23145270) – keyboardSmasher

risposta

9

A partire da oggi, è possibile effettuare le seguenti operazioni nel ramo principale (e imminente 2.1):

{{ u.vars.data.name }} 

u è la vista modulo per l'utente, che contiene un elenco di variabili associate. La variabile data contiene i dati normalizzati del modulo, che di solito è il tuo oggetto (a meno che tu non abbia aggiunto un trasformatore di modello personalizzato).

Nelle versioni precedenti di Symfony, si può fare:

{{ u.vars.value.name }} 

La variabile value contiene i dati della vista della forma, che è anche l'oggetto (a meno che non si è aggiunto un modello personalizzato o vista trasformatore).

Se si sta lavorando su Symfony master o su> = 2.1, si consiglia di accedere a data anziché a value.

+0

per un'entità tipo di modulo ho dovuto fare questo: '{{u.data.field}}' durante l'iterazione delle scelte – ncatnow

+1

Come questo ha ottenuto voti, non ne ho idea. È semplicemente sbagliato.Ho postato un commento sotto l'OP con un collegamento a una soluzione. – keyboardSmasher

+0

@keyboardSmasher: potresti notare che bernhard è la stessa persona che ha chiuso il problema che hai collegato a github quindi sono sicuro che ora puoi capire perché questa risposta ha 6 upvotes: sono sicuro (come Risponderei allo stesso modo) che questo metodo funziona – DonCallisto

30

In Symfony 2.5, è possibile eseguire questa operazione accedendo ai dati di ciascuna scelta utilizzando il valore dell'indice del bambino.

Nel generatore di forma - come ci si potrebbe aspettare:

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

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

Suggerisco di usare '{% set entity = projectForm.stages.vars.choices [loop.index - 1] .data%}' invece di ottenere un indice dal valore della proprietà dell'entità. In questo modo è possibile evitare l'errore della chiave di array sconosciuta. –

+0

@NikDenisov il ciclo ha anche una variabile 'loop.index0': https://twig.symfony.com/doc/2.x/tags/for.html#the-loop-variable quindi non c'è bisogno di -1 –

3

Versione 2.6.7

Simile a quello che Aaron Geiser ha suggerito, è possibile utilizzare customised form widgets per raggiungere questo obiettivo:

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

Aggiornamento di Bernhard Schussek's answer per Symfony 2.8.4 (o anche un po 'di versione inferiore):

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

Questo ha funzionato per me in Symfony 3.1 per un widget Radio:

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

Ciao , come posso fare lo stesso, ma con un campo CollectionType? Impossibile accedere ai dati della raccolta perché il metodo è privato ... – Felurian

Problemi correlati