2013-12-15 20 views
14

Desidero raggruppare i campi in symfony2. Per esempio avvolgerli a un div e posto i titoli tra:Campi modulo di gruppo in Symfony2

<form> 
<div class="step-1"> 
    <h3>Step 1</h3> 
    Field 1 
    Field 2 
</div> 
<div class="step-2"> 
    <h3>Step 2</h3> 
    Field 3 
    Field 4 
</div> 
</form> 

Il problema è la forma ottenuto moltissimo campi e quindi non posso renderli una per una nel modello. Non c'è qualche opzione quando aggiungi campi? Come:

$form = $this->createFormBuilder() 
     ->addGroup('step-1') 

O come posso gestire questo?

+0

Una possibile soluzione è quella di utilizzare una lista in Twig, al fine di visualizzare i campi, senza codice di duplicazione. –

+0

@ n.1 200+ o 2000+ ... non importa. è troppo per gestire il manuale uno per uno. –

risposta

10

Twig può aiutare a visualizzare più campi con un codice minimo:

<form> 
<div class="step-1"> 
    <h3>Step 1</h3> 
    {% for field in [ 'field1', 'field2'] 
     if (attribute(form, field) is defined) %} 
     {{ form_row(attribute(form, field)) }} 
    {% endfor %} 
</div> 
<div class="step-2"> 
    <h3>Step 2</h3> 
    {% for field in [ 
     'field3', 
     'field4', 
     'field5', 
     'field6' 
    ] if (attribute(form, field) is defined) %} 
     {{ form_row(attribute(form, field)) }} 
    {% endfor %} 
</div> 

{# Display the other fields #} 
{{ form_rest(form) }} 

</form> 
+0

Questo è molto vicino a ciò che volevo. Ma devo ancora riscrivere tutti i 200 campi nel controller e nel modello. Anche se cancello un campo nel controller devo cancellarlo anche nel template. –

+0

Sì, è necessario riscrivere i campi nel modello, ma non nel controller. Posso aggiungere un test per verificare che ogni campo esista prima di tentare di visualizzarlo. Questa è la soluzione migliore che ho. Aggiornerò la mia risposta –

6

La struttura nella classe del modulo non deve necessariamente essere correlata alla struttura nel layout. Puoi strutturare i campi in te HTML in qualsiasi modo tu voglia. Nel tuo caso si dovrebbe mettere le intestazioni passo proprio come hai fatto nella tua Q, ad es .:

<div class="step-1"> 
    <h3>Step 1</h3> 
    {{ form_widget(form.field1) }} 
    {{ form_widget(form.field2) }} 
</div> 

Se ancora interessati a forme di gruppo (non ho test che):

$builder->add(
    $builder->create('step1', 'form', array('virtual' => true)) 
     ->add('field1', 'text') 
     ->add('field2', 'text') 
); 

Source.

+1

Si noti che per Symfony3 si dovrebbe usare 'inherit_data' invece della proprietà' virtuale' –

14

ho scoperto, secondo this post (Grazie "n.1" per il link) è possibile gruppo all'interno del controller:

$form = $this->createFormBuilder() 
      ->add(
       $this->createFormBuilder()->create('step1', 'form', array('virtual' => true)) 
       ->add('field1', 'text') 
       ->add('field2', 'text') 
      ) 

che dà seguente configurazione:

<div class="input-wrapper"> 
    <label class="required">Step1</label> 
    <div id="form_step1"> 
    <div class="input-wrapper"> 
     <label class="required" for="form_step1_field1">Field1</label> 
     <input id="form_step1_field1" type="text" required="required" name="form[step1][field1]"> 
     <input id="form_step1_field2" type="text" required="required" name="form[step1][field1]"> 
    </div> 
    </div> 
</div> 

cui posso tema il modo voglio. Ma anche "bschussek" ha scritto:

La struttura nella classe del modulo non deve necessariamente essere correlata alla struttura nel layout. Puoi strutturare i campi nell'HTML nel modo che preferisci.

Così forse la migliore pratica è di non usare il controller per la strutturazione e mi dovrebbe preferire la pratica da "n.1"

Problemi correlati