Mar*_*ani 5 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'
));
}
}
Run Code Online (Sandbox Code Playgroud)
这是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'
));
}
}
Run Code Online (Sandbox Code Playgroud)
举个例子,尝试添加这个新条目:en_EN Anchor http // url/en
我越来越 :
id translatable_id linkText linkUrl locale
7 NULL Anchor http//url/en en_EN
Run Code Online (Sandbox Code Playgroud)
我试图发现translatable_id是如何工作的,但仍然没有时间来检查整个来源.最后,我试图setTranslatableId,没有更好的运气.(更新:在评论中)
到目前为止,我可以:
添加一些上下文的其他一些注释:
1我尝试过:
$link = new Link();
if ($form->isValid() ) {
$link->mergeNewTranslations(); // but this also does assigm the Id to the translations
}
Run Code Online (Sandbox Code Playgroud)
2为了保存现有的翻译,我只是将现有的Link实体传递给了表单构建器
3我知道我可以循环并将可翻译元素分配给父实体
但如果我有更好的选择,这是一个我不愿意做的黑客攻击:
// persist($link); and flush()
foreach ($link->getTranslations() as $linkTranslation) {
$linkTranslation->setTranslatable($link);
$em->persist($linkTranslation);
}
$em->flush();
Run Code Online (Sandbox Code Playgroud)
所以当然这不是我正在寻找的答案类型:)
您应该'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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
496 次 |
| 最近记录: |