Предположим, у меня есть класс абстрактной доктрины.
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 в метод формы?






Что будет, если добавить
$form->add('extrafield')
в вашем админ-классе?
Вы можете вызвать $this->getSubject() в configureFormFields и добавить поля условно на основе проверки instanceof.
А, ладно, но нет простого способа использовать конкретного администратора объекта? Если нет, то это будет лучший ответ
Прошло много времени с тех пор, как я использовал Сонату, я стараюсь избегать ее, когда могу. Я запомнил это, потому что часто использовал это в подобных ситуациях. Может быть и другой способ, но это будет непросто ... С сонатой нет ничего сложного. И вы, вероятно, в конечном итоге создадите 2 класса и множество строк конфигурации, чтобы заменить простой if.
В моем админке BaseClass добавляется поле, но оно мне нужно, если добавлен тип объекта или нет ...