Создайте одного общего администратора для нескольких организаций, но вызовите конкретного администратора при редактировании

Предположим, у меня есть класс абстрактной доктрины.

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 -

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 и решить его, добавив уродливые операторы if в метод формы?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что будет, если добавить

$form->add('extrafield')

в вашем админ-классе?

В моем админке BaseClass добавляется поле, но оно мне нужно, если добавлен тип объекта или нет ...

Jim Panse 16.07.2018 09:37
Ответ принят как подходящий

Вы можете вызвать $this->getSubject() в configureFormFields и добавить поля условно на основе проверки instanceof.

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

А, ладно, но нет простого способа использовать конкретного администратора объекта? Если нет, то это будет лучший ответ

Jim Panse 16.07.2018 09:36

Прошло много времени с тех пор, как я использовал Сонату, я стараюсь избегать ее, когда могу. Я запомнил это, потому что часто использовал это в подобных ситуациях. Может быть и другой способ, но это будет непросто ... С сонатой нет ничего сложного. И вы, вероятно, в конечном итоге создадите 2 класса и множество строк конфигурации, чтобы заменить простой if.

Padam87 16.07.2018 14:09

Другие вопросы по теме