我正在使用“knp Doctrine Translatable”来翻译实体。到目前为止工作得很好。 现在,我想要一个通用的解决方案,适用于任何数量的语言。所以我想使用一个嵌入式表单(Collections)来处理实体的Translatables。 现在一切正常,除了为了添加新的翻译而没有设置translatable_id。任何人都试图实现这一目标吗? 我只是想知道是否有更简单的方法来做到这一点,以避免过于复杂的事情。
到目前为止,非常好,这里是我的类型,这样你就可以更好地理解架构了。
// Main type that has a linkTranslationType with the translations
class linkType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text', array(
'label' => 'Name'
))
->add('translations', 'collection', array(
'type' => new linkTranslationType(),
'label' => false,
'allow_add' => true,
'allow_delete' => true
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\Link'
));
}
}
这是LinkTranslationType,每种语言呈现为“一行”: en_EN Anchor http // url / en
class linkTranslationType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('locale', 'text',array(
'label' => 'Anchor'
))
->add('linkText', 'text',array(
'label' => 'Anchor'
))
->add('linkUrl', 'text', array(
'label' => 'Url'
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\Entity\LinkTranslation'
));
}
}
举个例子,尝试添加这个新条目: en_EN Anchor http // url / en
我得到了:
id translatable_id linkText linkUrl locale
7 NULL Anchor http//url/en en_EN
我试图发现translatable_id是如何工作的,但仍然没有时间检查整个来源。最后,我试图setTranslatableId,没有更好的运气。 (更新:在评论中)
到目前为止,我可以:
添加一些背景的其他一些注意事项:
1我尝试过:
$link = new Link();
if ($form->isValid() ) {
$link->mergeNewTranslations(); // but this also does assigm the Id to the translations
}
2要保存现有翻译,我只是将现有的链接实体传递给表单构建器
3我知道我可以循环并将可翻译元素指定为父实体
但如果我有更好的选择,那就是我不愿意做的黑客攻击:
// persist($link); and flush()
foreach ($link->getTranslations() as $linkTranslation) {
$linkTranslation->setTranslatable($link);
$em->persist($linkTranslation);
}
$em->flush();
所以当然这不是我正在寻找的答案类型:)