Как правильно настроить поле sonata_type_collection в Sonata Admin

В двух словах:

Когда я использую 'sonata_type_collection' в отношении OneToMany, я должен указать другую сторону отношения, которая в «действии создания» все еще не существует и в «действии обновления» может быть установлено, но также можно указать полностью другой родитель.

Более подробное объяснение:

Я использую Sonata Admin Bundle для операций CRUD и могу сказать, что у меня есть только сущности Post (id, title, content) и Tag (id, post_id, title). Я хотел бы иметь возможность добавлять и удалять объекты тегов во время редактирования объекта Post, поэтому я использую поле sonata_type_collection.

Это метод configureFormFields из класса PostAdmin:

protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper                           
            ->add('title')
            ->add('content')
            ->add('tags', 'sonata_type_collection', array(), array(
                'edit' => 'inline',
                'inline' => 'table'
            ))  
        ))                
    ; 
}

Проблема в том, что в форме создания, когда я добавляю новый тег, мне нужно указать как сообщение, так и заголовок, но сообщение все еще не существует, поэтому я не могу добавлять теги. Пока я редактирую сообщение, я могу добавлять новые теги, но для каждого из них я должен явно установить сообщение, и я могу, например, добавить тег для совершенно другого сообщения.

Подскажите, как решить эту проблему?


person eroteev    schedule 12.11.2014    source источник
comment
Я не уверен, но как насчет добавления поля прототипа, установленного в значение true. По крайней мере, когда вы работаете с такой информацией, это то, что вы делаете.   -  person Rodolfo Velasco    schedule 12.11.2014
comment
Я не знаю, что это за поле и как его установить. Не могли бы вы сказать мне, что вы имеете в виду?   -  person eroteev    schedule 13.11.2014


Ответы (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, которому пришлось вызывать метод setPost () тегов из метода addTag ().

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

    return $this;
}
person paulgv    schedule 12.11.2014
comment
Я пробовал это, прежде чем задавать вопрос, но безуспешно. В любом случае, какова цель этой настройки? - person eroteev; 13.11.2014
comment
Цитируя документ Symfony, установка by_reference в false заставляет сеттер вызываться для родительского объекта, что кажется уместным в вашем случае. symfony.com/doc/current/reference/forms/ types / Как выглядят ваши объекты? Возможно, вам стоит проверить сеттеры, которые обрабатывают отношение. - person paulgv; 13.11.2014
comment
Проблема заключалась в методе addTag ($ tag) объекта Post. Мне пришлось явно установить пост для этого тега, вызвав $ tag- ›setPost ($ this); Если вы добавите это к своему ответу, я с радостью его приму. - person eroteev; 13.11.2014