Symfony 3根据翻译消息动态添加属性以形成字段

时间:2017-05-16 06:58:36

标签: php forms symfony symfony-3.1

我想为每个表单元素实现自定义帮助器消息(html数据属性)。帮助程序消息在YAML lang文件(messages.en.yml)中定义,并非所有表单元素都有帮助程序消息。

问题是我不确定是否可以使用Symfony FormType或Symfony Form事件来完成。

我正在考虑将Form事件创建为服务并注入翻译服务,并从那里操纵数据并添加帮助程序类,但我没有找到任何可靠的示例如何完成。

我想的其他选择是使用Trait并在特征中注入翻译服务,然后从那里开始开发我的代码,但它感觉不是那么正确。

有人可以分享他们的经验并了解如何解决这个特殊问题吗?

这是我的设置

messages.en.yml

intro:
        created: Intro created!
        edited:  Intro has been edited successfully!
        deleted: Intro has been has been deleted!
        index:
            title: List of all intros
        new:
            title: New intro
        show:
            title: Details of intro
        edit:
            title: Edit intro
        form:
             title: Title
             content: Content
             isEnabled: Is active
        tooltip:
             title: Please enter title

我的表单类型:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('title', TextType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'attr' => [
                    'data-helper' => 'Please enter title'
                ]

            )
        )
        ->add('content', TextareaType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'required' => false,
                'attr' => [
                    'class' => 'mceEditor'
                ]
            )
        )
        ->add('isEnabled', CheckboxType::class, array(
                'label_format' => 'admin.intro.form.%name%',
                'required' => false,
            )

1 个答案:

答案 0 :(得分:1)

您可以registering the form as a service执行此操作并将YAML configuration注入表单。

config.yml

message_config:
    intro:
            created: Intro created!
            edited:  Intro has been edited successfully!
            deleted: Intro has been has been deleted!
            index:
                title: List of all intros
            new:
                title: New intro
            show:
                title: Details of intro
            edit:
                title: Edit intro
            form:
                 title: Title
                 content: Content
                 isEnabled: Is active
            tooltip:
                 title: Please enter title

services.yml

services:
app.form.type.my_form:
    class: AppBundle\Form\Type\MyForm
    arguments:
        - '%message_config%'
    tags:
        - { name: form.type }

现在,您可以使用FormType中的数组。

<?php

namespace AppBundle\Form\Type;

class MyForm
{
    protected $messages;

    public function __construct(array $messages)
    {
        $this->messages = $messages;
    }
}

如果翻译服务正在使用YAML配置,则会注入翻译服务。

更新:Symfony使用Translator组件和Twig表单主题执行此操作,请参阅以下注释。