2013-12-15 4 views
14

Я хочу сгруппировать поля в symfony2. Например обернуть их в DIV и место заголовки между:Поле формы группы в 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> 

Проблема есть форма получила очень много полей, поэтому я не могу вынести их один за другим в шаблоне. Есть ли какой-либо вариант при добавлении полей? Нравится:

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

Или как я могу справиться с этим?

+0

Возможное решение заключается в использовании списка в Twig для того, чтобы отобразить поля без дублирующий код. –

+0

@ n.1 200+ или 2000+ ... это не имеет значения. его слишком много, чтобы обращаться с руководством по одному. –

ответ

10

Twig может помочь вам вывести несколько полей с минимальным кодом:

<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

Thats очень близко к тому, что я хотел. Но все же мне нужно переписать все 200 полей в контроллере и в шаблоне. Также, если я удаляю поле в контроллере, я должен также удалить его в шаблоне. –

+0

Да, вы должны переписать поля в шаблоне, но не в контроллере. Я могу добавить тест, чтобы проверить, что каждое поле существует, прежде чем пытаться его отобразить. Это лучшее решение, которое у меня есть. Я собираюсь обновить свой ответ. –

6

Структура в вашем классе формы не обязательно должна быть связана со структурой в вашем макете. Вы можете структурировать поля в HTML-формате в зависимости от того, что вам нравится. В вашем случае вы бы положить шаг заголовки так же, как вы делали в вашем Q и т.д .:

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

Если вы все еще заинтересованы в групповых формах (я не проверял, что):

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

Source.

+1

Обратите внимание, что для Symfony3 вы должны использовать 'inherit_data' вместо' virtual' property –

14

я узнал, согласно this post (Спасибо «N.1» для ссылки) можно сгруппировать в контроллере:

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

Что дает следующий шаблон:

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

Что я могу тему путь я хочу. Но и «bschussek» написал:

Структура в вашем классе формы не обязательно должна быть связана со структурой в вашем макете. Вы можете структурировать поля в HTML в зависимости от того, что вам нравится.

Так может быть, лучшая практика не использовать контроллер для структурирования и я предпочитаю практику из «N.1»

Смежные вопросы