在Symfony中使用引导复选框的变量呈现转换

在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

在symfony4项目中,我使用引导主题来呈现HTML内容

我有一个表格,其中包含接受条款的复选框,如:

☑ 我接受

我希望将链接作为变量(将根据语言的不同而变化)

所以我有一个这样的翻译yaml:

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,
])