在 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 中覆盖复选框表单字段产生重复标签且没有字段的主要内容,如果未能解决你的问题,请参考以下文章
Prestashop 1.7 - 覆盖 Symfony 表单约束
Symfony buildForm:将复选框输入放在标签标签内