Symfony Sonata Admin

scorpion-ds

Новичок
Добрый день!

Разбираюсь с формами редактирования сущностей, возник вопрос по типу "sonata_type_collection". Сама по себе форма выводится и список связанных данных из другой сущности выводится и если нажать сохранить, то все нормально (данные обновляются), но если добавить новую запись в дочернюю сущность, то не происходит привязки дочерней сущности к родительской, хотя в таблицу она добавляется.

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

Подскажите, что я мог упустить?
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
scorpion-ds, поставь by_reference => false и у родителя добавь методы addFoo(Foo $foo){$foo->setBar($this); $this->foos->add($foo);} и remove
 

scorpion-ds

Новичок
Не совсем понял, что надо сделать, у меня сейчас так:
PHP:
/**
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\BlogRepository")
* @ORM\Table(name="blog")
* @ORM\HasLifecycleCallbacks()
*/
class Blog
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;

// ...

}
PHP:
/**
* @ORM\Entity(repositoryClass="Blogger\BlogBundle\Entity\Repository\BlogTranslationsRepository")
* @ORM\Table(name="blog_translation")
* @ORM\HasLifecycleCallbacks
*/
class BlogTranslations
{
    
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

    // ...

    /**
    * @ORM\ManyToOne(targetEntity="Blog", inversedBy="comments")
    * @ORM\JoinColumn(name="blog_id", referencedColumnName="id")
    */
    private $blog;
  
    // ...

}
PHP:
class BlogAdmin extends Admin
{
   
    // ... 
 
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
        ->add('title', 'text', array('label' => 'Post Title'))
        ->add('title_translation', 'sonata_type_collection',
                array('label' => 'Заголовок', 'required' => false, 'by_reference' => false),
                array(
                        'edit' => 'inline',
                        'inline' => 'table',
                        //'sortable'  => 'position'
                )
        )
        ->add('author')
        ->add('blog')
        ->add('tags')
        ->end()
        ;
    }
    // ...
};

PHP:
class BlogTranslationsAdmin extends Admin
{
   
    // ...

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
        ->add('title')
        ->add('local')
        ->end()
        ;
    }

    // ...

}
Название классов не несут смысла, я сейчас просто экспериментирую.
 

scorpion-ds

Новичок
В общем я так и не понял, где накосячил в настройках, хотя я так подозреваю, что это какой-то баг, в итоге нашел такое решение:

https://github.com/DmitriyShuba/symfony2sonata_test/blob/master/src/Blogger/BlogBundle/Admin/BlogAdmin.php#L82-L95
PHP:
class BlogAdmin extends Admin
{
   
    // ---
   
    public function prePersist($blog)
    {
        foreach ($blog->getComments() as $comment) {
            $comment->setBlog($blog);
        }
    }
   
    public function preUpdate($blog)
    {
        foreach ($blog->getComments() as $comment) {
            $comment->setBlog($blog);
        }
        $blog->setComments($blog->getComments());
    }
   
   
}
Теперь элементы дочерней сущности стали сохранятся.
 

scorpion-ds

Новичок
Я совсем новичок в Симфони и вообще во фреймверках и доктрины ...

Я все равно не понимаю как это можно сделать в сетере по твоей ссылке, по моим предположениями, эта сущность не знает, что было добавлена новая запись в дочерней сущности и их нужно связать, да и вообще это по идеи проблема именно Sanata Admin (по идеи "by_reference => false" для этого и назначается), хотя может я ошибаюсь.
 

scorpion-ds

Новичок
Возникло несколько вопросов по настройке Sonata Admin:
  • можно ли настраивать основное меню?
  • как указывать блок какого GRUD выводить, а какого нет, на главной странице админки?
  • можно ли создать свою "страницу" в админке, к примеру где будут вынесены основные настройки или что-то произвольное?
 

scorpion-ds

Новичок
Были ли у кого-то проблемы с большим потреблением памяти при использовании Sonata Admin + Media?

В dev-режиме потребление порядка 35-40 метров за раз, в prod не измерял, на на VPS отваливается MySQL по причине перерасхода оперативной памяти, всего доступно 1 Gb, когда сайт начинает индексировать Яндекс происходит перерасход памяти и падение MySQL. Также в целом он довольно медленный.

Сейчас делаю другой проект на SF2, там всех этих проблем нет, но там нет и Сонаты.
 
Сверху