2

我在 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 %}

不幸的是,这不起作用,奇怪的是让我没有复选框和重复的标签,我不知道为什么。

4

1 回答 1

0

看起来您正在使用基于引导程序的表单主题(如 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 part 需要被包裹到 label 中,所以主题调用同一个 block 两次,第一次调用_labelpart,第二次调用_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

于 2021-04-09T05:12:27.683 回答