如何覆盖 Twig 中的 form_row 块,按字段类型添加属性?
尽管您说这与表单自定义无关,但可以通过它来实现...现在正在阅读本文的其他人的快速介绍。
默认的 symfony twig 表单扩展可以在这里找到。
默认的 twig 表单主题可以在Symfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twig 找到。
关于如何覆盖表单的一般信息可以在本书的“如何自定义表单渲染”一章中找到,但我将很快对此进行总结。
form_row 默认
{% block form_row %}
{% spaceless %}
<div>
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}
覆盖表单级别
将此添加到您要自定义的表单模板中:
{% form_theme form _self %}
如果您想将 {% block form_row %} 放入另一个包/模板中,请使用:
{% form_theme form 'AcmeDemoBundle:Form:fields.html.twig' %}
现在在 form_theme 声明之后插入您的自定义 form_row 块或将其放入指定的模板中(在我们的例子中,这将是AcmeDemoBundle:Form:fields.html.twig)。
在我的示例中,如果表单行中有错误,我们将添加类“错误”和另一个类名,即当前字段类型的类型名称。
{% block form_row %}
{% spaceless %}
{# set class to 'error' if errors exist #}
{% set attr = attr|merge({'class': attr.class|default('') ~ (errors|length > 0 ? ' error' : '') }) %}
{% set typeClass = ' ' ~ type|default('text') %}
{#
you could also implement a logic matching input types with an array of their
desired classname-representations here.
#}
{% set attr = attr|merge({'class': attr.class|default('') ~ type) }) %}
<div class="{% for class in attr.class %}{{ class }}{% endfor %}{{ typeClass }}">
{{ form_label(form) }}
{{ form_errors(form) }}
{{ form_widget(form) }}
</div>
{% endspaceless %}
{% endblock form_row %}
如果您想在系统范围内应用您的 form_row 块,请将您的AcmeDemoBundle:Form:fields.html.twig添加到您的 twig.templating.form.resources !
# app/config/config.yml
framework:
templating:
form:
resources:
- 'AcmeDemoBundle:Form'