我试图在Symfony(2.7)中创建一个自定义表单类型,以便在我的一些表单字段中添加一个help_block (Boostrap 3样式)。
我遵循这个页面的说明:http://symfony.com/doc/current/cookbook/form/create_form_type_extension.html
显示是OK的,help_block工作正常,但它是不可翻译的,(开发栏没有显示任何缺失的翻译)。所以有我的问题:我如何使自定义表单类型可翻译,如标签选项,如果可能的话,在相同的translation_domain比表单?
下面是扩展代码:
<?php
namespace WIC'MasterBundle'Form'Extension;
use Symfony'Component'Form'AbstractTypeExtension;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'Form'FormView;
use Symfony'Component'Form'FormInterface;
use Symfony'Component'PropertyAccess'PropertyAccess;
use Symfony'Component'OptionsResolver'OptionsResolver;
/**
* Add a BootStrap Help block to any form field
*/
class HelpTextExtension extends AbstractTypeExtension
{
/**
* Returns the name of the type being extended.
*
* @return string The name of the type being extended
*/
public function getExtendedType() {
return 'form';
}
/**
* Add the help_text option
*
* @param OptionsResolver $resolver
*/
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefined(array('help_text'));
$resolver->setDefault('help', null);
}
/**
* Pass the Help Text to the view
*
* @param FormView $view
* @param FormInterface $form
* @param array $options
*/
public function buildView(FormView $view, FormInterface $form, array $options) {
$view->vars['help_text'] = $form->getConfig()->getAttribute('help_text');
}
public function buildForm(FormBuilderInterface $builder, array $options) {
if (array_key_exists('help_text', $options)) {
$builder->setAttribute('help_text', $options['help_text']);
}
}
}
和我的模板覆盖:
{% extends 'bootstrap_3_horizontal_layout.html.twig' %}
{% block form_row -%}
{% spaceless %}
<div class="form-group{% if (not compound or force_error|default(false)) and not valid %} has-error{% endif %}">
{{ form_label(form) }}
<div class="{{ block('form_group_class') }}">
{{ form_widget(form) }}
{{ form_errors(form) }}
{% if help_text is not null %}
<span class="help-block">{{ help_text }}</span>
{% endif %}
</div>
</div>
{% endspaceless %}
{%- endblock form_row %}
提前感谢你的帮助,
您可以像在其他地方一样添加翻译,只需填充标签。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text', [
'label' => 'rpr.page.title', // <- any string can be there
]);
}
默认的翻译域是'messages',要更改,请添加'translation_domain'到你的configureOptions
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => 'Acme'Entity'DemoEntity',
'translation_domain' => 'forms'
]);
}
当然,您需要在正确的位置创建翻译文件:AcmeBundle'Resources'translations
注意事项:-当你在AcmeBundle'Resources'translations
中创建新的翻译文件时,如forms.de.yml,你需要清除缓存,即使在开发中。
docs here: http://symfony.com/doc/current/reference/forms/types/form.html#translation-domain
a)在config.yml中设置区域参数并启用翻译
parameters:
locale: en
framework:
#esi: ~
translator: { fallbacks: ["%locale%"] }
b)创建自定义表单类型我从文档中创建了GenderType。
c)用构造函数扩展自定义表单类型,以访问转换器并在需要时使用转换器:
namespace AppBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Translation'Translator;
class GenderType extends AbstractType
{
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'choices' => array(
'm' => $this->translator->trans('user.male'),
'f' => $this->translator->trans('user.female'),
)
));
}
public function getParent()
{
return 'choice';
}
public function getName()
{
return 'gender';
}
}
d)创建您的字段类型作为一个服务
// app/config/services.yml
services:
app.form.type.gender:
class: AppBundle'Form'Type'GenderType
arguments:
- @translator.default
tags:
- { name: form.type, alias: gender }
e)创建一个翻译文件:
// src/AppBundle/Resources/translations/user.en.yml
user:
creation: Create User
gender: Gender
male: Male
female: Female
f)扩展你的formType(例如UserType)。确保通过在步骤d中创建的"gender"服务别名传递字段类型。还要为每个字段设置标签和translation_domain选项。
// src/AppBundle/Form/UserType.php
namespace AppBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
use AppBundle'Form'Type'GenderType;
class UserType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('gender', 'gender', array('label' => 'user.gender', 'translation_domain' => 'user'))
// and more fields
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle'Entity'User'
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_user';
}
}
g)将trans_default_domain添加到你的twig模板中,并翻译任何你想翻译的内容。例子:
{% extends '::base.html.twig' %}
{% trans_default_domain 'user' %}
{% block body -%}
<h1>{{ 'user.creation'|trans }}</h1>
{{ form(form) }}
{% endblock %}