在Symfony 4.4中覆盖复选框表单字段,产生重复标签且无字段

kx1ctssn  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(122)

我有麻烦覆盖一个复选框字段在我的Symfony形式在我的Twig模板。
我在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 %}

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

yvgpqqbh

yvgpqqbh1#

看起来你正在使用一个基于 Bootstrap 的表单主题(如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部分需要 Package 到label中,因此theme会两次调用同一个块,第一次调用_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

lmvvr0a8

lmvvr0a82#

我在boostrap_5_layout中找到了解决同样问题的方法。
如果你不在顶部调用{% use "bootstrap_base_layout.html.twig" %},它会给予一个双标签和一个双div.form-check。
所以只要加上这样的,它的工作对我来说。

{% use "bootstrap_5_layout.html.twig" %}
{% use "bootstrap_base_layout.html.twig" %}

{%- block checkbox_widget -%}
    {%- set attr_class = attr_class|default(attr.class|default('')) -%}
    {%- set row_class = '' -%}
    {%- if 'btn-check' not in attr_class -%}
        {%- set attr_class = attr_class ~ ' form-check-input' -%}
        {%- set row_class = 'form-check' -%}
    {%- endif -%}
    {%- set attr = attr|merge({class: attr_class|trim}) -%}
    {%- set parent_label_class = parent_label_class|default(label_attr.class|default('')) -%}
    {%- if 'checkbox-inline' in parent_label_class %}
        {%- set row_class = row_class ~ ' form-check-inline' -%}
    {% endif -%}
    {%- if 'checkbox-switch' in parent_label_class %}
        {%- set row_class = row_class ~ ' form-switch' -%}
    {% endif -%}
    {%- if row_class is not empty -%}
        <div class="{{ row_class }}">
    {%- endif -%}
    {{- form_label(form, null, { widget: parent() }) -}}
    {%- if row_class is not empty -%}
        </div>
    {%- endif -%}
{%- endblock checkbox_widget %}

相关问题