在Symfony中使用引导复选框的变量呈现转换
在symfony4项目中,我使用引导主题来呈现HTML内容 我有一个表格,其中包含接受条款的复选框,如: ☑ 我接受 我希望将链接作为变量(将根据语言的不同而变化) 所以我有一个这样的翻译yaml:在Symfony中使用引导复选框的变量呈现转换,symfony,twig,bootstrap-4,symfony4,Symfony,Twig,Bootstrap 4,Symfony4,在symfony4项目中,我使用引导主题来呈现HTML内容 我有一个表格,其中包含接受条款的复选框,如: ☑ 我接受 我希望将链接作为变量(将根据语言的不同而变化) 所以我有一个这样的翻译yaml: form: register: title: Registration username: Username email: Email password: Password repeat_password: Repeat your password
form:
register:
title: Registration
username: Username
email: Email
password: Password
repeat_password: Repeat your password
accept_terms: Accept %terms%
在我的formType
文件中,我无法插入翻译,因为我找不到任何东西来输入%terms%
参数
->add(
'termsAccepted',
CheckboxType::class,
[
'mapped' => false,
'constraints' => new IsTrue(),
'label' => 'form.register.accept_terms',
]
)
在细枝文件中,我无法更改表单标签,因为。。。在Symfony中,它表示,form\u label
不适用于复选框(和单选按钮)
你知道如何在checkbox元素(bootstrap4)上发送翻译(带参数)吗
解决方案
在我的小树枝里:
{% form_theme form.termsAccepted _self %}
{% block checkbox_label -%}
... here is a copy/paste of the orignial code from https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig ...
{{ widget|raw }}
<label{% for attrname, attrvalue in label_attr %} {{ attrname }}="{{ attrvalue }}"{% endfor %}>
{% set terms_link = '<a href="http://url.com">'~'form.register.terms_link'|trans()~'</a>' %}
{{- label is not same as(false) ? (translation_domain is same as(false) ? label|raw : label|trans({'%terms%': terms_link}, translation_domain)|raw) -}}
{{- form_errors(form) -}}
</label>
{%- endif -%} {%- endblock checkbox_label %}
{%form\u theme form.termsAccepted\u self%}
{%block复选框_标签-%}
... 这是一份源代码的拷贝/粘贴https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig ...
{{widget | raw}
{%set terms\u link='''%}
{{-label与(false)不同?(翻译域与(false)相同)?label{raw:label{trans({'%terms%':terms_link},翻译域){raw)}
{{-form_错误(form)-}
{%-endif-%}{%-endblock复选框_label%}
在视图中,您可以在顶部插入
{% form_theme form.termsAccepted _self %}
如文件中所述
然后,您可以用所需的复选框覆盖Bootstrap4表单主题中附带的复选框标签。只要写
{% block checkbox_label %}
Copy and paste here the same block from bootstrap 4 form them and edit as your needs. See https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Twig/Resources/views/Form/bootstrap_4_layout.html.twig
{% endblock %}
此自定义块将仅用于form.TermsAcepted
如果您想要一个更通用的解决方案,您可以创建自己的类型(例如扩展
CheckboxType
的CheckboxlinkType
,添加所需的选项(linkUri和linkText)在configureOptions
中,将它们的值传递给buildView
中的视图。然后,您可以使用bootstrap4表单主题中的一个作为基础并使用变量,编写渲染类型所需的特定块,称为checkboxlink\u label
。如果需要帮助,请告诉我。c的替代解决方案我们通过表单主题使用模板是为了翻译表单类型中的标签,并禁用在模板中执行的翻译:
->add('termsAccepted', CheckboxType::class, [
'mapped' => false,
'constraints' => new IsTrue(),
'label' => $this->translator->trans('form.register.accept_terms', [
'%terms%' => 'foo',
],
'translation_domain' => false,
])
您必须向表单类型的构造函数添加一个
TranslatorInterface
参数,将其注册为服务,并在此处注入translator
服务。我认为,由于输出转义,使用此解决方案,您无法为术语的链接输出html标记。Thx,我尝试了您的解决方案,它工作正常,但效果良好@ste提到,HTML是转义的。其他“缺点”是,它迫使我添加一个具有依赖关系的服务。就我想为我的用户包创建一个共享包而言,我不喜欢该解决方案。哦,对不起,我错过了您需要在此处输出HTML的内容。为此,您确实需要自定义表单主题。谢谢,我将使用该解决方案。For您的信息,在我使用引导模板的情况下,我确实需要{%block checkbox\u label-%}
(不是checkbox\u小部件)。我将编辑我的帖子,为所有相关人员添加解决方案。仍然有一个奇怪的行为我无法解释:为了正确打印我的链接,我需要在这两个语句上添加过滤器:label|raw
和label|trans({'%terms%':terms_link},translation|domain)|raw)
(请参阅我的原始帖子)我遇到的另一个问题是,我无法将变量从控制器传递到我的表单小枝中的{%block checkbox_label-%}。你知道怎么做吗?这是正确的(但没有解决)。所以我想我最好的选择是创建一个自定义表单字段类型。@shabang正如我所说的,如果你想要一个更通用的解决方案,你必须创建你自己的类型,例如CheckboxlinkType
。请参阅,将父项设置为CheckboxType
,在configureOptions
(使用setDefined
)中添加linkUri
和linkLabel
,并将它们发送到buildView
中的视图。然后在通用模板()中创建自己的块`{%block mycheckbox_label%}。当实例化(使用添加
)全新类型时,您将在第三个参数中传递链接URI
和链接标签
的实际值(使用标签
,约束
,等等)以这个类型
为例
->add('termsAccepted', CheckboxType::class, [
'mapped' => false,
'constraints' => new IsTrue(),
'label' => $this->translator->trans('form.register.accept_terms', [
'%terms%' => 'foo',
],
'translation_domain' => false,
])