5

我正在使用“ 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();

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

4

1 回答 1

0

您应该向该字段添加一个'by_reference'=>false选项translations,然后在您的Link实体中添加这些方法(请参阅https://symfony.com/doc/current/form/form_collections.html

public function addTranslation(LinkTranslation $t)
{
    $t->setTranslatable($this);
    $this->getTranslations()->add($t);
}

public function removeTranslation(LinkTranslation $t)
{
    $this->getTranslations()->remove($t);
}
于 2017-08-11T21:23:59.970 回答