如何在 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:按计数一对多关系排序

Sonata Admin Bundle 如何配置批处理操作

Sonata Admin:显示动作而不是编辑的一对多路线

当sonata_type_admin调用时如何在Sonata的Admin类中获取底层对象?

为 Sonata Admin 包配置自定义模板