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

Posted

技术标签:

【中文标题】在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段【英文标题】:Overriding checkbox form field producing duplicate label and no field in Symfony 4.4 【发布时间】:2021-07-03 01:38:10 【问题描述】:

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

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

【问题讨论】:

我认为你需要在 label|unescape|raw 前面添加 - widget|raw @Vyctorya 感谢您的评论,但这没有任何效果。另外,我不确定它的语法是否有效。 【参考方案1】:

看起来您正在使用基于引导程序的表单主题(如 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。对于第二次调用,主题提供了widget 变量,您必须自己渲染(否则您将看不到您的复选框)。此外,您必须禁止标签被渲染两次,这可以通过检查是否定义了小部件来完成。

看看原始块如何也检查widget is defined是否避免双重标签渲染:

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

【讨论】:

以上是关于在 Symfony 4.4 中覆盖复选框表单字段产生重复标签且没有字段的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 表单验证:如果另一个字段不为空,则需要字段

Prestashop 1.7 - 覆盖 Symfony 表单约束

Symfony buildForm:将复选框输入放在标签标签内

Symfony 4.4:为图像文件上传保留的实体/模型属性由表单系统设置更新(结果始终为空 - 没有错误)

选中 Symfony 表单 EntityType 复选框

Symfony 表单 - 内部带有复选框的集合类型