问题描述
我无法覆盖 Twig 模板中 Symfony 表单中的复选框字段。
我正在我的 Twig 模板中使用以下代码构建该字段:
{{ form_row(form.legal,{
'label' : 'personal.form.fields.legal'|trans,}) }}
在同一个模板中,我有以下块,我试图在其中自定义标签。请注意,上面的翻译包含 HTML,这就是我需要 raw
过滤器的原因。
{% block _crmpiccobundle_details_legal_label %}
{% apply spaceless %}
<label{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}>
{{ label|unescape|raw }}
</label>
{% endapply %}
{%- endblock %}
不幸的是,这不起作用,而且奇怪的是让我没有复选框和重复的标签,我不知道为什么。
解决方法
看起来您正在使用基于引导程序的表单主题(例如 bootstrap_4_layout.html.twig 或 bootstrap_3_layout.html.twig)
尝试这样做:
{% block _crmpiccobundle_details_legal_label %}
{%- if widget is defined -%}
{{ widget|raw }}
{% apply spaceless %}
<label{% with { attr: label_attr } %}{{ block('attributes') }}{% endwith %}>
{{ label|unescape|raw }}
</label>
{% endapply %}
{%- endif -%}
{%- endblock %}
在 bootstrap 布局中,widget 部分需要包装到 label 中,因此主题调用同一个块两次,第一次调用 _label
部分,第二次调用 _widget
。对于第二次调用,theme 提供了 widget
变量,您必须自己呈现该变量(否则您将看不到复选框)。此外,您必须抑制标签被渲染两次,这可以通过检查是否定义了小部件来完成。
看看原始块如何也检查 widget is defined
是否避免双标签渲染: