如何覆盖奏鸣曲管理控制器以提供另一个对象的字段

How to override sonata admin controller to provide fields of another object

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

DataSource 是我必须调用以获取项目信息的第三个应用程序。一个项目可以 link 使用许多数据源。每个通信(项目数据源)都需要一个project_datasource_id,这是项目在第 3 方应用程序中的 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的文章,我觉得我必须这样实现。但是,我没有找到如何去做。我查看了基本的奏鸣曲模板,我也必须覆盖它,但是显示的每个表单元素都使用我的模型 linked,所以我不知道如何添加我自己的字段。 如果有人可以提供一些 link 或任何想法,我将不胜感激!

PS : 我尽力了,抱歉我的英语错误。

因为"details"是一个集合,所以不能那样做,没错。但是在 sonata admin 中有一些额外的类型,例如 'sonata_type_admin',它们用于将所需类型的另一个 admin 简单地嵌入到您当前的表单中。

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

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

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

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

这正是我所需要的,非常感谢!由于我的关系,我必须使用 CollectionType,但这确实是我所需要的。