自定义Symfony2表单

时间:2014-09-21 14:52:14

标签: forms symfony

我最近开始使用Symfony2框架。我已经为我将要使用的任何不正确的术语道歉。

我想自定义表单在我的应用程序中的呈现方式。

更具体地说,在我的Twig文件中,我使用

呈现整个表单
{{ form(forms) }}

我想自定义表单的布局。我知道表单的每一行都可以扩展为

{{ form_start(forms) }}

//...
<div>
    {{ form_label(forms.field) }}
    {{ form_errors(forms.field) }}
    {{ form_widget(forms.field) }}
</div>
//...

{{ form_end(forms) }}

使用以这种格式编写的表单,我可以为布局添加所需的自定义。

问题在于:我的表单没有预定义的行数,但这些行取决于存储在数据库中的某些值。我想在我的Twig中做什么就像这样

{{ form_start(forms) }}

{% for field in forms %}
<div>
    {{ form_label(forms.field) }}
    {{ form_errors(forms.field) }}
    {{ form_widget(forms.field) }}
</div>
{% endfor %}

{{ form_end(forms) }}

不幸的是,这个for循环不起作用。 我也研究过(How to Customize Form Rendering),但我认为这不适合我的情况(是吗?)。

有什么建议吗? 提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您需要自定义form_row方法http://symfony.com/doc/current/cookbook/form/form_customization.html#customizing-the-form-row

// my_form.html.twig
{% extends 'form_div_layout.html.twig' %}

{% block form_row %}
    <div>
        {{ form_label(form) }}
        {{ form_errors(form) }}
        {{ form_widget(form) }}
    </div>
{% endblock form_row %}

// view.html.twig
{% form_theme form 'my_form.html.twig' %}
{{ form_start(form) }}

答案 1 :(得分:0)

作为一种更灵活的解决方案,您可以直接执行所需的操作,而无需更改表单上所有表单行的主题方式。

假设你的主表单包含一个Collection(如果不是,现在就让它们完成它!)名为subforms,其中包含可变数量的项目(每个都是另一种形式),你可以这样做:

{{ form_start(forms) }}

{% for subform in forms.subforms %}
<div>
    {{ form_label(subform.fieldname) }}
    {{ form_errors(subform.fieldname) }}
    {{ form_widget(subform.fieldname) }}
</div>
{% endfor %}

{{ form_end(forms) }}