在Symfony中为Bootstrap复选框渲染带变量的翻译

时间:2018-08-22 18:51:11

标签: symfony twig bootstrap-4 symfony4

在Symfony 4项目中,我使用Bootstrap主题来呈现HTML内容。

我有一个表单,其中包含一个复选框,用于接受诸如:

  

☑我接受terms

我想将链接作为变量(视语言而定)

所以我有这样的翻译语言:

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

在树枝文件中,我无法更改form_label,因为...在Symfony documentation中,它表示form_label不适用于复选框(和单选按钮)

{{ form_label(form.termsAccepted, 'that custom label is ignored...') }}

关于如何在复选框元素(引导程序4)上发送翻译(带有参数)的任何想法吗?

解决方案

以我的嫩枝形式:

{% 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 %}

2 个答案:

答案 0 :(得分:2)

在您看来,您可以在顶部插入

{% form_theme form.termsAccepted _self %}

文档https://symfony.com/doc/current/form/form_customization.html#child-forms

中的规定

然后,您可以用所需的Bootstrap 4表单主题中随附的checkbox_label覆盖。只是写

{% 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.termsAccepted。

如果需要更通用的解决方案,则可以创建自己的类型(例如扩展CheckboxlinkType的{​​{1}},在CheckboxType中添加所需的选项(linkUri和linkText)并传递其值到configureOptions中的视图,然后您可以使用引导程序4表单主题中的那个作为基础并使用您的变量来编写渲染类型所需的特定块,称为buildView。需要帮助。

答案 1 :(得分:1)

通过表单主题自定义模板的另一种解决方案是在您的表单类型中翻译标签并禁用在模板中执行的翻译:

->add('termsAccepted', CheckboxType::class, [
    'mapped' => false,
    'constraints' => new IsTrue(),
    'label' => $this->translator->trans('form.register.accept_terms', [
        '%terms%' => 'foo',
    ],
    'translation_domain' => false,
])

您将必须在表单类型的构造函数中添加一个TranslatorInterface参数,将其注册为服务并在此处注入translator服务。