Php Symfony2表单使用attr属性的转换器

Php Symfony2表单使用attr属性的转换器,php,symfony,Php,Symfony,我有一个表单,其中一个元素包含一些元素,我想在属性中使用转换器(数据占位符,它是JQuery扩展名的名称) 对于这样的属性、占位符或标签,可以使用转换器吗 这个问题有一个细枝解决方案,但我想知道实体类型内部的解决方案 如果有人需要细枝解决方案: {{ form_widget(form.items, {'attr': {'data-placeholder': 'MyBundle.items.placeholder.data'|trans } }) }} 如果你不是说通过注释进行翻译,那么这就

我有一个表单,其中一个元素包含一些元素,我想在属性中使用转换器(数据占位符,它是JQuery扩展名的名称)

对于这样的属性、占位符或标签,可以使用转换器吗

这个问题有一个细枝解决方案,但我想知道实体类型内部的解决方案

如果有人需要细枝解决方案:

 {{ form_widget(form.items, {'attr': {'data-placeholder': 'MyBundle.items.placeholder.data'|trans } })  }}

如果你不是说通过注释进行翻译,那么这就是你真正想要做的,不是吗

class SomeFormType extends AbstractType {

   protected $container;

  public function __construct($container){

      $this->container = $container;
 }

  public function buildForm(FormBuilderInterface $builder, array $options){

    $trans = $this->container->get('translator');
    $builder->add('items', 'entity', array(
      'label' => 'MyBundle.items',
       required' => true,
       'em' => $this->em,
       'multiple' => 'true',
       'expanded' => false,
       'attr' => array(
          'placeholder' => $trans->translate('MyBundle.items.placeholder'),
          'data-placeholder' => $trans->translate('MyBundle.items.placeholder.data'),
    ),
   ));
  }
}
服务
我今天遇到了同样的情况,使用的方法与舒尚特的略有不同。我直接将翻译器注入到表单类型中(正如之前zelazowy在评论中所建议的那样)。所以我就这样结束了:

<?php

namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Translation\TranslatorInterface;

class TranslatableType extends AbstractType
{
    /**
     * @var TranslatorInterface
     */
    private $translator;

    /**
     * @param TranslatorInterface $translator
     */
    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }
}
要创建可翻译标签,您可以在FormType中直接调用
$this->translator->trans()
,如下所示:

$builder->add('field', 'choice', array(
    'choices' => array(
        1 => $this->translator->trans(
            'forms.choices.field.1', null, 'forms'
        ),
        2 => $this->translator->trans(
            'forms.choices.field.2', null, 'forms'
        ),
    )
));
确保在创建表单时调用控制器中的服务,如下所示:

$form = $this->createForm($this->get('app.form.translatable'));

这样,所有内容都可以很好地进行翻译。

问题是抽象类型无法使用$this->get()获取转换器,解决方案是通过构造函数传递它。默认情况下,占位符不需要转换器。最好传递您使用的服务,而不是整个容器。在这个例子中,使用
@translator
。同意上面的评论,但是加载的translator应该是:
@translator。默认值
我认为
多个
参数应该有值
true
,而不是
'true'
,它在某种程度上是相等的(非空字符串总是
true
)但如果通过
==
操作符检查参数,则可能会产生混淆,并且不起作用。
app.form.translatable:
    class: AppBundle\Form\Type\TranslatableType
    arguments:
      - @translator
$builder->add('field', 'choice', array(
    'choices' => array(
        1 => $this->translator->trans(
            'forms.choices.field.1', null, 'forms'
        ),
        2 => $this->translator->trans(
            'forms.choices.field.2', null, 'forms'
        ),
    )
));
$form = $this->createForm($this->get('app.form.translatable'));