如何在 Sonata Admin 中正确配置“sonata_type_collection”字段
Posted
技术标签:
【中文标题】如何在 Sonata Admin 中正确配置“sonata_type_collection”字段【英文标题】:How to properly configure 'sonata_type_collection' field in Sonata Admin 【发布时间】:2015-01-09 12:03:09 【问题描述】:简而言之:
当我在 OneToMany 关系中使用“sonata_type_collection”时,我必须指定关系的另一端,在“创建操作”中仍然不存在,并且可以在“更新操作”中设置,但也可以指定完全不同的父级。
更详细的解释:
我正在使用 Sonata Admin Bundle 进行 CRUD 操作,假设我只有 Post(id, title, content) 和 Tag(id, post_id, title) 实体。 我希望能够在编辑 Post 实体时添加和删除标签实体,因此我使用“sonata_type_collection”字段。
这是 PostAdmin 类中的 configureFormFields 方法:
protected function configureFormFields(FormMapper $formMapper)
$formMapper
->add('title')
->add('content')
->add('tags', 'sonata_type_collection', array(), array(
'edit' => 'inline',
'inline' => 'table'
))
))
;
问题是在创建表单中,当我添加新标签时,我必须同时指定帖子和标题,但帖子仍然不存在,所以我无法添加标签。 在编辑帖子时,我可以添加新标签,但对于每个标签,我都必须明确设置一个帖子,例如,我可以为完全不同的帖子添加一个标签。
你能告诉我如何解决这个问题吗?
【问题讨论】:
我不确定,但如何将原型字段设置为 true。至少当您处理此类信息时,您就是这样做的。 不知道这个字段是什么,怎么设置。你能告诉我你的意思吗? 【参考方案1】:您可能希望将 by_reference 选项设置为 false。
protected function configureFormFields(FormMapper $formMapper)
$formMapper
->add('title')
->add('content')
->add('tags', \Sonata\CoreBundle\Form\Type\CollectionType::class,
array('by_reference' => false),
array('edit' => 'inline',
'inline' => 'table'
)
);
[编辑] 所以看起来问题来自 Post 实体,它必须从 addTag() 方法调用标签的 setPost() 方法。
public function addTag($tag)
$tag->setPost($this);
$this->tags->add($tag);
return $this;
【讨论】:
我在问这个问题之前试过这个,但没有运气。无论如何,这个设置的目的是什么? 引用 Symfony 的文档,将 by_reference 设置为 false 会强制在父对象上调用 setter,这在您的情况下似乎是合适的。 symfony.com/doc/current/reference/forms/types/… 你的实体是什么样的?也许你应该检查处理关系的设置器。 问题出在 Post 实体的 addTag($tag) 方法中。我必须通过调用 $tag->setPost($this); 将帖子显式设置为那里的标签。如果您将其添加到您的答案中,我将很乐意接受。以上是关于如何在 Sonata Admin 中正确配置“sonata_type_collection”字段的主要内容,如果未能解决你的问题,请参考以下文章
Sonata Admin:isGranted() 在 Admin 类中总是返回 true,但在模板中返回正确的布尔值
Sonata Admin Bundle:按计数一对多关系排序