2013-12-15 12 views
14

Ich möchte Felder in symfony2 gruppieren. Zum Beispiel wickeln Sie sie in ein div und Ort Schlagzeilen zwischendurch:Gruppenformularfelder 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> 

Das Problem ist die Form sehr Felder bekam, damit ich sie eins nach dem anderen in der Vorlage machen kann nicht. Gibt es keine Möglichkeit beim Hinzufügen von Feldern? Wie:

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

Oder wie kann ich damit umgehen?

+0

Eine mögliche Lösung ist die Verwendung einer Liste in Zweig, um bevorzugen Felder anzuzeigen, ohne Duplizierungscode. –

+0

@ n.1 200+ oder 2000+ ... es spielt keine Rolle. es ist einfach zu viel, um manuell eins nach dem anderen zu handhaben. –

Antwort

10

Zweig kann Ihnen helfen, mehrere Felder mit einem minimalen Code anzuzeigen:

<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

Das ist sehr nah an dem, was ich wollte. Trotzdem muss ich alle 200 Felder in Controller und in Template neu schreiben. Auch wenn ich ein Feld im Controller lösche, muss ich es auch in der Vorlage löschen. –

+0

Ja, Sie müssen die Felder in der Vorlage neu schreiben, aber nicht in der Steuerung. Ich kann einen Test hinzufügen, um zu überprüfen, ob jedes Feld existiert, bevor ich versuche, es anzuzeigen. Das ist die beste Lösung, die ich habe. Ich werde meine Antwort aktualisieren. –

6

Die Struktur in Ihrer Formularklasse sollte nicht unbedingt mit der Struktur in Ihrem Layout verknüpft sein. Sie können die Felder in Ihrem HTML nach Belieben strukturieren. In Ihrem Fall würden Sie Ihren Schritt Schriften setzen genauso wie Sie in Ihrem Q tat, z.B .:

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

Wenn Sie noch Interesse an Gruppenformen (ich nicht, dass nicht getestet):

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

Source.

+1

Beachten Sie, dass Sie für Symfony3 'inherit_data' anstelle von' virtual' property verwenden sollten –

14

Ich fand heraus, nach this post (Danke „n.1“ für den Link) ist es möglich, zu einer Gruppe innerhalb der Steuerung:

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

Welche gibt folgende Vorlage:

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

die ich Thema kann die Art und Weise Ich möchte. Aber auch "bschussek" wrote:

Die Struktur in deiner Formularklasse sollte nicht unbedingt mit der Struktur in deinem Layout zusammenhängen. Sie können die Felder im HTML nach Belieben strukturieren.

Also vielleicht die beste Praxis ist nicht die Steuerung für die Strukturierung zu verwenden und ich sollte die Praxis von „n.1“