Symfony 3 根据翻译信息动态添加属性形成字段
Symfony 3 dynamically add attributes to form fields based on translation messages
我想为每个表单元素实现自定义帮助程序消息(html 数据属性)。帮助消息在 YAML 语言文件 (messages.en.yml) 中定义,并非所有表单元素都有帮助消息。
问题是我不确定是否可以使用 Symfony FormType 或 Symfony Form 事件来完成。
我正在考虑将表单事件创建为服务并注入翻译服务,然后从那里操作数据并添加帮助程序类,但我没有找到任何可靠的例子如何完成。
我考虑的另一个选择是使用 Trait 并在 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,
)
您可以通过 registering the form as a service and injecting the 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 表单主题执行此操作,请参阅以下评论。
我想为每个表单元素实现自定义帮助程序消息(html 数据属性)。帮助消息在 YAML 语言文件 (messages.en.yml) 中定义,并非所有表单元素都有帮助消息。
问题是我不确定是否可以使用 Symfony FormType 或 Symfony Form 事件来完成。
我正在考虑将表单事件创建为服务并注入翻译服务,然后从那里操作数据并添加帮助程序类,但我没有找到任何可靠的例子如何完成。
我考虑的另一个选择是使用 Trait 并在 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,
)
您可以通过 registering the form as a service and injecting the 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 表单主题执行此操作,请参阅以下评论。