gpt4 book ai didi

symfony - 带有 knp Doctrine 扩展的 i18n 表单翻译

转载 作者:行者123 更新时间:2023-12-03 17:48:41 30 4
gpt4 key购买 nike

我正在使用“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 是如何工作的,但仍然没有时间检查整个源代码。最后,我也尝试设置TranslatableId,但运气不佳。 (更新:在评论中)

到目前为止,我可以:
  • #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 保存现有翻译我刚刚将现有的 Link 实体传递给了表单构建器

    3 我知道我可以循环并将 Translatable 元素分配给父实体

    但如果我有更好的选择,我不愿意这样做:
    // persist($link); and flush()
    foreach ($link->getTranslations() as $linkTranslation) {
    $linkTranslation->setTranslatable($link);
    $em->persist($linkTranslation);
    }
    $em->flush();

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

    最佳答案

    你应该添加一个 '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);
    }

    关于symfony - 带有 knp Doctrine 扩展的 i18n 表单翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26741094/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com