2012-01-18 18 views
23

Ho un problema con la visualizzazione della raccolta nel mio modulo.Raccolta moduli Symfony2: viene mostrato l'indice dell'oggetto corrente

Quando si visualizza la mia collezione di entità Ho qualcosa di simile:

0 
Name: myInputName 
Address: myInputAddress 

1 
Name: myInputName 
Address: myInputAddress 

mia domanda è perché Symfony2 visualizzare l'indice di ...

E questo per tutte le entità salvate nella mia collezione ...

Ecco il codice che uso:

$builder    
     ->add('person', 'collection', array( 
      'label' => ' ',    
      'type' => new PersonType(), 
      'prototype' => true, 
      'allow_add' => true, 
      'allow_delete' => true, 
      'by_reference' => false, 
     )) 
    ; 

Nel mio file ramoscello:

<div> 
    {{ form_widget(edit_form) }}  
</div> 

Aiuto per favore

Sam

risposta

1

È possibile personalizzato il rendering della vostra collezione per non visualizzare l'indice con, per esempio:

{% block _FORMNAME_person_widget %} 
{% spaceless %} 
    {% for child in form %} 
     {{ form_widget(child.Name) }} 
     {{ form_widget(child.Address) }} 
    {% endfor %} 
{% endspaceless %} 
{% endblock %} 
+0

grazie mille ... Il metodo senza spazio rimuove l'etichetta senza il widget? – Sam

+0

"rimuovi spazi bianchi tra tag HTML" (http://twig.sensiolabs.org/doc/tags/spaceless.html) Il suo uso è comune in \ vendor \ symfony \ src \ Symfony \ Bridge \ Twig \ Resources \ views \ Form \ form_div_layout.html.twig – webda2l

+4

Questo in realtà non risolve il problema. Piuttosto, nasconde semplicemente l'indice dalla visualizzazione. Mi chiedo come cambierebbe l'indice per dire, un altro valore dell'entità? –

75

Rimozione di indici (etichette) per articoli da collezione:

$builder    
    ->add('person', 'collection', array(
     ... 
     'options' => array('label' => false) 
    )) 
; 

Se si desidera aggiungere etichette personalizzate per ogni fila è possibile produrre la forma da soli:

{{ form_start(edit_form) }} 
    {% for person in form.persons %} 
     {{ form_row(person, {'label': 'custom label per item' }) }} 
    {% endfor %} 
{{ form_end(edit_form) }} 

Nota: testato su Symfony 2,3 & 2,4

+0

Speravo di farlo nel costruttore, ma questa soluzione lo farà. Grazie! –

+25

Per symfony3 usare ''entry_options'' invece di'' options'' – sectus

1

So che questo è stato chiuso per un po ' . E non sono sicuro se questo è stato risolto altrove. Questo problema è in realtà abbastanza semplice da risolvere e sono sorpreso che non ci sia documentazione su questo ovunque. In PersonType o in qualsiasi tipo che viene utilizzato in una raccolta, è sufficiente modificare i vars ['name'] in buildView per essere ciò che si desidera visualizzare come etichetta.

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    // Adjust the view based on data passed 
    $this->vars['name'] = $form->getData(); 
    // Or... 
    $this->vars['name'] = 'Some random string'; 
} 

Se lo si desidera dinamico, si utilizzerà l'oggetto da forma-> getData(). Dal momento che, nel mio problema, sto usando un tema del modulo, ignorare il ramoscello non è davvero un'opzione per me.

Spero che questo aiuti qualcuno.

+0

Non so se questo è cambiato in Symfony 2.7 ma ora sembra essere '$ form-> vars ['name'] = 'Foo bar baz '; ' – StuBez

+1

In Symfony 3 è' $ view-> vars [' name '] ' –

0

Utilizzando la soluzione di @ MrBandersnatch di seguito, ho dovuto utilizzare $view->vars['name'] anziché $this->vars['name'] (Symfony 2.3).

(mi scuso per non aver aggiunto questo come commento alla risposta di @ MrBandersnatch, non ho ancora abbastanza reputazione).

4

Questo è qualche giorno fa ma perché mi trovavo di fronte alla stessa domanda per Symfony 3 la risposta del setto è quella giusta.

Utilizzare l'opzione

'entry_options' => ['label'=>false], 

all'interno del vostro costruttore per nascondere lui oggetto voce.

Cordiali saluti

Problemi correlati