覆盖Symfony 4.4中产生重复标签和无字段的复选框表单字段



我在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__layout.html.twig或bootstrap_3_layout.html.titch(

试着这样做:

{% 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布局中,小部件部分需要封装到标签中,因此主题调用同一个块两次,第一次用于_label部分,第二次用于_widget。对于第二个调用,主题提供了widget变量,您必须自己呈现该变量(否则您将看不到您的复选框(。此外,您必须抑制标签被渲染两次,这可以通过检查是否定义了小部件来完成。

查看原始块如何检查widget is defined以避免双标签渲染:

https://github.com/symfony/symfony/blob/e2f430dfb4c0c8cdde01ed111f4f0851e268ab5a/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_3_layout.html.twig#L83

最新更新