在 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_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 是否避免双标签渲染:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...