如何在Sonata Admin中正确配置'sonata_type_collection'字段

ero*_*eev 2 symfony symfony-sonata sonata-admin sonata

简而言之:

当我在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'
            ))  
        ))                
    ; 
}
Run Code Online (Sandbox Code Playgroud)

问题是在创建表单中,当我添加新标签时,我必须指定帖子和标题,但邮件仍然不存在,所以我无法添加标签.当我正在编辑帖子时,我可以添加新标签,但是对于其中的每一个,我都必须明确设置帖子,并且我能够为完全不同的帖子添加标签.

你能告诉我如何解决这个问题吗?

pau*_*lgv 8

您可能希望将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'
                               )
                 );
}
Run Code Online (Sandbox Code Playgroud)

[编辑]所以看起来问题来自Post实体,它必须从addTag()方法调用标签的setPost()方法.

public function addTag($tag)
{
    $tag->setPost($this);
    $this->tags->add($tag);

    return $this;
}
Run Code Online (Sandbox Code Playgroud)