2012-09-27 13 views
7

Il mio progetto mi richiede di ricostruire la funzionalità di un sistema di grandi dimensioni mantenendo la struttura del database (per ragioni di fatturazione storica). Ho iniziato con Symfony 2.0.x e ho avviato il processo di aggiornamento a Symfony 2.1.2.Accesso a scelte specifiche direttamente dall'elemento ChoiceType in Twig

In precedenza, ero in grado di accedere direttamente alle opzioni individuali di un gruppo radio (multiple = false, expanded = true) in Twig utilizzando la notazione dot. Per esempio, nella mia forma ho definito l'elemento simile a questo:

$builder->add('settings_group', 'choice', array(
     'choices' => array(
      'existing' => 'A pre-existing setting group', 
      'override' => 'Specify an override instead' 
     ), 
     'multiple' => false, 'expanded' => true, 
     'property_path' => false 
     ) 
    ); 

Nel mio template Twig, il mio margine di profitto è stato in questo modo:

<ul> 
     <li> 
      {{ form_widget(form.settings_group.existing) }} 
      [ .. dropdown ..] 
     </li> 
     <li> 
      {{ form_widget(form.settings_group.override) }} 
      [ .. text input .. ] 
     </li> 
    </ul> 

Ha funzionato perfettamente per quello che dovevo fare, come i pulsanti di opzione "esistente" o "sovrascrittura" determinano quali campi sono stati mantenuti e quali sono stati ripristinati quando l'entità è stata salvata. In particolare, il mio problema sorge perché voglio separare manualmente i pulsanti di opzione e stampare vari altri campi modulo prima del prossimo pulsante radio. È un modello ricorrente in un numero di moduli in questo sistema, basato sulla funzionalità e sul database esistenti.

Dopo l'aggiornamento a Symfony 2.1, questo non è più possibile ed ottengo un errore:

Method "existing" for object "Symfony\Component\Form\FormView" does not exist

Ho provato varie possibilità tra cui .get() e l'iterazione di .choices() [che finisce dandomi oggetti ChoiceView che non posso quindi produrre usando form_widget()]. Ho provato a creare un tipo personalizzato per incapsulare un pulsante di opzione più i campi di impostazione associati, ma a causa del modo in cui vengono creati i nomi degli elementi non posso escludere che si escludano a vicenda. Ho anche provato a creare un tipo più complesso che rappresenta sia le opzioni che i campi associati, ma ancora una volta non è stato possibile accedere e rendere una scelta specifica nel modello del tipo.

Idealmente, spero in qualcosa dell'API che ho semplicemente trascurato e posso trovare/sostituire e farlo funzionare. In caso contrario, sarebbe gradito un consiglio su (o un collegamento a) un approccio più symfony-friendly per farlo.

risposta

0

Hai provato qualcosa di simile:

<ul> 
    <li> 
     {{ form_widget(form['settings_group']['existing']) }} 
     [ .. dropdown ..] 
    </li> 
    <li> 
     {{ form_widget(form['settings_group']['override']) }} 
     [ .. text input .. ] 
    </li> 
</ul> 
+0

Ciao, ero pieno di speranza. È vicino, ma senza sigaro. Mi viene detto: 'Chiave" esistente "nell'oggetto (con ArrayAccess) di tipo" Symfony \ Component \ Form \ FormView "non esiste ...' –

+0

Un'idea: stai usando Twig {{dump ()} } per stampare il contenuto degli oggetti, come per il debug del tuo codice? Vedrò meglio in seguito quello che stai cercando di ottenere. –

2

Ho affrontato una situazione simile e risolto in questo modo:

<li> 
    {{ form_widget(form.myRadioField.children[0]) }} 
</li> 
<li> 
    {{ form_widget(form.myRadioField.children[1]) }} 
</li> 

Questo non è in alcun modo pulito, riutilizzabile, migliore -programma di pratica ma funziona.

+0

Ack! Funziona e nient'altro che ho provato ... ma come dici che non è riutilizzabile ... hai mai trovato un altro modo? – matt

+0

Sì, in realtà Twig fornisce un modo per sovrascrivere il layout di qualsiasi parte del modulo. Anche per un determinato campo specifico. Dovresti usare questa possibilità per personalizzarlo. –