Поля групповой формы в Symfony2

Я хочу сгруппировать поля в symfony2. Например, оберните их в div и разместите заголовки между ними:

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

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

Ответы

Ответ 1

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>

Ответ 2

Я узнал, согласно этому сообщению (спасибо "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>

Что я могу тему, как я хочу. Но и "бшуссек" писал:

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

Итак, лучше всего не использовать контроллер для структурирования, и я должен предпочесть практику с "n.1"

Ответ 3

Структура в вашем классе формы не обязательно должна быть связана со структурой в вашем макете. Вы можете структурировать поля в 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')
);

Источник.