为多个实体创建一个普通管理员,但在编辑时致电特定管理员

时间:2018-07-13 15:19:46

标签: php symfony doctrine sonata-admin

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

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

和两个继承的子类

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 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语句来解决它的唯一方法?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

添加后会添加什么

$form->add('extrafield')

在您的管理课程中?