i18n表格翻译与knp Doctrine扩展

时间:2014-11-04 17:15:04

标签: symfony doctrine-extensions

我正在使用“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插入一个新链接,但不插入翻译(它们以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我知道我可以循环并将可翻译元素指定为父实体

但如果我有更好的选择,那就是我不愿意做的黑客攻击:

// persist($link); and flush()
foreach ($link->getTranslations() as $linkTranslation) {
  $linkTranslation->setTranslatable($link);
  $em->persist($linkTranslation);
}
$em->flush();

所以当然这不是我正在寻找的答案类型:)

0 个答案:

没有答案