Symfony2中的组表单字段

时间:2013-12-15 22:20:15

标签: php forms symfony

我想在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')

或者我该如何处理?

3 个答案:

答案 0 :(得分:15)

我发现,根据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”中的练习

答案 1 :(得分:11)

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 :(得分:8)

表单类中的结构不一定与布局中的结构相关。您可以按照自己喜欢的方式构建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