首页 > 解决方案 > 如何覆盖奏鸣曲管理控制器以提供另一个对象的字段

问题描述

我对 Symfony 非常陌生,尤其是 Sonata Admin。在我的项目中,我有一个实体项目,它与 CommunicationDetails 实体具有 OneToMany 关系。此 CommunicationDetails 实体链接到具有 ManyToOne 关系的 DataSource 实体。

DataSource 是我必须调用以获取有关项目的信息的第三个应用程序。一个项目可以与许多数据源链接。每次通信(project-datasource)都需要一个project_datasource_id,即项目在3rd party app中的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:我尽力了,对不起我的英语错误。

标签: symfonysonata-admin

解决方案


由于“细节”是一个集合,你不能那样做,没错。但是在奏鸣曲管理员中有一些额外的类型,例如“sonata_type_admin”,它们用于将所需类型的另一个管理员简单地嵌入到您当前的表单中。

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

在此处查找其他示例和类型

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

因此,这取决于您使用哪种表单类型的目的。


推荐阅读