2

手短に:

OneToMany 関係で「sonata_type_collection」を使用している場合、関係の反対側を指定する必要があります。「作成アクション」ではまだ存在せず、「更新アクション」では設定できますが、完全に指定することもできます。別の親。

より詳細な説明:

私は CRUD 操作に Sonata Admin Bundle を使用しており、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'
            ))  
        ))                
    ; 
}

問題は、作成フォームで新しいタグを追加するときに投稿とタイトルの両方を指定する必要があることですが、投稿がまだ存在しないため、タグを追加できません。投稿を編集している間に新しいタグを追加できますが、それらのすべてに対して明示的に投稿を設定する必要があり、たとえば、まったく別の投稿にタグを追加することができます。

この問題を解決する方法を教えていただけますか?

4

1 に答える 1

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'
                               )
                 );
}

[編集] したがって、addTag() メソッドからタグの setPost() メソッドを呼び出さなければならなかった Post エンティティから問題が発生したようです。

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

    return $this;
}
于 2014-11-12T15:39:14.193 に答える