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

时间:2018-06-28 07:23:51

标签: symfony sonata-admin

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

DataSource是我必须调用的第三个应用程序,以获取有关项目的信息。一个项目可以与许多数据源链接。每个通信(项目数据源)都需要一个project_datasource_id,这是第三方应用程序中项目的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 :(得分:0)

因为“细节”是一个集合,所以您不能那样做,没错。但是在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

因此,要根据您的目的使用哪种表格类型。

答案 1 :(得分:0)

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