我正在使用“ knp Doctrine Translatable ”来翻译实体。到目前为止工作得很好。现在我想有一个通用的解决方案,它适用于任何数量的语言。所以我想使用一个嵌入式表单(集合)来处理实体的可翻译。现在一切正常,除了添加新翻译时没有设置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 插入新链接,但不插入翻译(它们以 NULL 保存为 traslatable_id)
- #2 保存现有的翻译链接完美无缺
添加一些上下文的其他一些注释:
1 我试过:
$link = new Link();
if ($form->isValid() ) {
$link->mergeNewTranslations(); // but this also does assigm the Id to the translations
}
2 为了保存现有的翻译,我只是将现有的链接实体传递给表单生成器
3 我知道我可以循环并将 Translatable 元素分配给父实体
但如果我有更好的选择,我不愿意这样做:
// persist($link); and flush()
foreach ($link->getTranslations() as $linkTranslation) {
$linkTranslation->setTranslatable($link);
$em->persist($linkTranslation);
}
$em->flush();
所以当然这不是我正在寻找的答案类型:)