Как переопределить контроллер администратора сонаты, чтобы предоставить поля другого объекта - PullRequest
0 голосов
/ 28 июня 2018

Я довольно новичок в Symfony и особенно в Sonata Admin. В моем проекте у меня есть объект Project, имеющий отношение OneToMany с объектом CommunicationDetails. Этот объект CommunicationDetails связан с объектом DataSource с отношением ManyToOne.

Источник данных - это третье приложение, которое мне нужно вызвать, чтобы получить информацию о проекте. Проект может быть связан со многими источниками данных. Каждое сообщение (project-datasource) нуждается в идентификаторе проекта project_datasource_id, который является идентификатором проекта в стороннем приложении.

/**
* @ORM\Table(name="project")
* @ORM\Entity
*/
class Project {
    ...

    /**
     * @ORM\OneToMany(targetEntity="CommunicationDetails", mappedBy="project", cascade={"persist"}, indexBy="project")
     */
    private $details;
}



/**
* @ORM\Table(name="communication_details")
* @ORM\Entity;
*/
class CommunicationDetails {

...

/**
 * @ORM\ManyToOne(targetEntity="Project", inversedBy="details")
 */
private $project;

}



/**
 * @ORM\Table(name="datasource")
 * @ORM\Entity
 */
class DataSource{

...

/**
 * @ORM\OneToMany(targetEntity="CommunicationDetails", mappedBy="dataSource", cascade={"persist"}, indexBy="dataSource")
 */
private $details;

У меня нет проблем, чтобы управлять этим поведением с помощью Sonata, но я бы хотел немного улучшить процесс создания. Я хотел бы предоставить поля сущности CommunicatonDetails при создании проекта. На самом деле, я ищу что-то вроде этого (даже если я знаю, что я не могу сделать это таким образом):

$mapper
->with('General', ['class' => 'col-md-4'])
    ->add('name', TextType::class)
    ->add('description', TextareaType::class)
    // Here, I'd like to provide fields of the CommunicationDetails entity to create these objects in the same time
    ->add('details.project_datasource_id', TextType::class)
    ->add('details.basePath', TextType::class)
->end();

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

PS: я сделал все возможное, извините за мои ошибки в английском.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Это именно то, что мне нужно, большое спасибо Я должен использовать CollectionType из-за моих отношений, но это действительно то, что мне было нужно.

0 голосов
/ 28 июня 2018

Поскольку «детали» - это коллекция, вы не можете делать это таким образом, это правильно. Но в sonata admin есть несколько дополнительных типов, таких как 'sonata_type_admin', которые используются для встраивания просто другого администратора нужного типа в вашу текущую форму.

->add('details', 'sonata_type_admin')

Посмотрите здесь другие примеры и типы

https://symfony.com/doc/2.3/bundles/SonataAdminBundle/reference/form_types.html#sonata-type-admin

Так что от вашей цели зависит, какой тип формы использовать.

...