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

时间:2014-11-12 15:17:34

标签: symfony sonata-admin symfony-sonata 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'
            ))  
        ))                
    ; 
}

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

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

1 个答案:

答案 0 :(得分: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'
                               )
                 );
}

[编辑] 因此看起来问题来自Post实体,它必须调用标签' addTag()方法中的setPost()方法。

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

    return $this;
}