我想在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')
或者我该如何处理?
答案 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')
);