実際に、翻訳値を設定および取得するための 2 つのイベント リスナーを持つカスタム from タイプで問題を解決しました。
/**
* build fields
* @param \Symfony\Component\Form\FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
/**
* merge new translation
*/
$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) use ($options) {
//test
$form = $event->getForm();//form
$data = $event->getData();//products
$newTranslation = $event->getData();
$key=$options['translation_property'];
$lang=$this->getLocale($options);
$entity=$form->getParent()->getData();
$setter='set'.strtoupper($key);
$getter='get'.strtoupper($key);
$entity->translate($lang)->$setter($newTranslation);
$entity->mergeNewTranslations();
});
/**
* Populate with data
*/
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($options) {
$data = $event->getData();//products
$form = $event->getForm();//form
$key=$options['translation_property'];
$lang=$this->getLocale($options);
$entity=$form->getParent()->getData();
$setter='set'.strtoupper($key);
$getter='get'.strtoupper($key);
$oldValue=$entity->translate($lang,false)->$getter();//no fallback
$event->setData($oldValue);
});
}
フィールドはマップされません。翻訳プロパティ名と言語は直接指定できます。
/**
* Defauls
* @param \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'translation_path'=>'translations',
'translation_property' => null,
'translation_lang'=>null,//getLocale or set in form type
'mapped'=>false
));
}
そして型継承フォーム基本テキスト。
public function getParent()
{
return 'text';
}
それを twig 拡張サービス (translation_text) として定義すると、非常に簡単に使用できます。
$builder
->add('name')
->add('key')
->add('translate1', 'translation_text',
array(
'translation_property'=>'translate1',
'translation_lang'=>null
))