表单主题
表单呈现方式的每个部分都可以自定义。您可以自由更改每个表单“行”的呈现方式,更改用于呈现错误的标记,甚至自定义 textarea 标记的呈现方式。没有什么是禁止的,并且可以在不同的地方使用不同的自定义。
Symfony 使用模板来呈现表单的每个部分,例如标签标签、输入标签、错误消息和其他所有内容。
在 Twig 中,每个表单“片段”都由一个 Twig 块表示。要自定义表单呈现方式的任何部分,您只需要覆盖适当的块。
在 PHP 中,每个表单“片段”都是通过单独的模板文件呈现的。要自定义表单呈现方式的任何部分,您只需要通过创建一个新模板来覆盖现有模板。
要了解其工作原理,请自定义 form_row 片段并将类属性添加到围绕每一行的 div 元素。为此,请创建一个新的模板文件来存储新的标记:
{# src/Acme/TaskBundle/Resources/views/Form/fields.html.twig #}
{% block form_row %}
{% spaceless %}
<div class="form_row">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}
当通过 form_row 函数呈现大多数字段时,使用 form_row 表单片段。要告诉表单组件使用上面定义的新 form_row 片段,请将以下内容添加到呈现表单的模板顶部:
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form 'AcmeTaskBundle:Form:fields.html.twig'
'AcmeTaskBundle:Form:fields2.html.twig' %}
{{ form(form) }}
form_theme 标记(在 Twig 中)“导入”给定模板中定义的片段,并在呈现表单时使用它们。换句话说,当稍后在此模板中调用 form_row 函数时,它将使用自定义主题中的 form_row 块(而不是 Symfony 附带的默认 form_row 块)。
您的自定义主题不必覆盖所有块。渲染自定义主题中未覆盖的块时,主题引擎将回退到全局主题(在包级别定义)。
如果提供了多个自定义主题,则将按列出的顺序搜索它们,然后再返回到全局主题。
要自定义表单的任何部分,您只需要覆盖适当的片段。确切知道要覆盖哪个块或文件是下一节的主题。
{# src/Acme/TaskBundle/Resources/views/Default/new.html.twig #}
{% form_theme form with 'AcmeTaskBundle:Form:fields.html.twig' %}
{% form_theme form with ['AcmeTaskBundle:Form:fields.html.twig',
'AcmeTaskBundle:Form:fields2.html.twig'] %}
有关更多信息,请参阅如何在Symfony 食谱中自定义渲染
全局表单主题
在上面的示例中,您使用 form_theme 助手(在 Twig 中)将自定义表单片段“导入”到该表单中。你也可以告诉 Symfony 在你的整个项目中导入自定义表单。
枝条
要在所有模板中自动包含之前创建的 fields.html.twig 模板中的自定义块,请修改您的应用程序配置文件:
# app/config/config.yml
twig:
form:
resources:
- 'AcmeTaskBundle:Form:fields.html.twig'
fields.html.twig 模板中的任何块现在都用于全局定义表单输出。