为多个实体创建一个总管理员,但在编辑时调用特定管理员

Create one general admin for multiple entities but call particular admin on edit

假设我有一个抽象的学说实体class

abstract class BaseClass
{
    private $title;
    private $description;
}

和两个继承childclasses

class A extends BaseClass
{
}

还有一个额外的字段

class B extends BaseClass
{
    private $extraField;
    ...
}

对于这两个实体,我想创建一个管理员,以便在一个视图中同时列出这两个实体。所以在我的 admin.yml 中添加

AppBundle\Admin\BaseClassAdmin:
      tags:
        - { name: sonata.admin, manager_type: orm, label: "base" }
      arguments:
        - null
        - AppBundle\Entity\BaseClass
        -
      calls:
        - [setSubClasses, [{'A' : 'AppBundle\Entity\A', 'B' : 'AppBundle\Entity\B'}]]

而 BaseClass Admin class 是

class BaseClassAdmin extends AbstractAdmin
{
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('title');
    }

    protected function configureFormFields(FormMapper $form)
    {
        $form->add('title');
        $form->add('description');
    }
}

我想要做的是列表视图显示这两种类型,这不是问题。但是当我点击一个类型为 B 的项目时,我想在我的表单中显示 extraField。但事实并非如此。

这是因为 B 调用了特定的管理员(在表单中添加了 extraField),它只调用了一般管理员 (BaseClassAdmin)。

所以我的问题

有没有办法从列表视图中调用对应于实体类型的特定管理员?还是只能修改BaseClassAdmin,在form方法中添加难看的if-statements解决?

如果添加

会怎样
$form->add('extrafield')

在您的管理员中 class ?

您可以在 configureFormFields 中调用 $this->getSubject(),并根据 instanceof 检查有条件地添加字段。

https://symfony.com/doc/master/bundles/SonataAdminBundle/reference/advanced_configuration.html#inherited-classes