Оформление
Создание класса админки
Необходимо создать класс, который будет расширять Bia\AdminBundle\Admin\BaseAdminService. Этот сервис управляет конфигурацией форм для создания, редактирования, отображения и других операций для сущностей в административном интерфейсе.
Пример
php
class PodcastAdmin extends BaseAdminService
{
public function configureListForm(FormMapper $formMapper): FormMapper
{
$formMapper
->layout('default')
->block('main')
->add('title', BiaInputType::class)
->end()
->block('main')
->add('text', BiaTextareaType::class)
->end()
->end();
return $formMapper;
}
public function configureEditForm(FormMapper $formMapper): FormMapper
{
$formMapper
->layout('default')
->block('main')
->add('title', BiaInputType::class, [
'required' => true,
])
->end()
->block('another')
->add('description', BiaTextareaType::class)
->add('url', BiaInputType::class)
->end()
->end();
return $formMapper;
}
public function configureShowFields(FormMapper $formMapper): FormMapper
{
$formMapper
->add('description', BiaInputType::class);
return $formMapper;
}
public function configureListFilters(FormMapper $formMapper): FormMapper
{
$formMapper
->add('title', BiaInputType::class, ['has_filter' => false]);
return $formMapper;
}
}Основные методы для управления отображением полей
Для настройки различных форм существуют несколько методов:
configureListForm(FormMapper $formMapper)
Этот метод настраивает, какие поля будут отображены при отображении списка всех записей сущности (листинг).configureEditForm(FormMapper $formMapper)
Этот метод настраивает, какие поля будут отображаться при редактировании существующих записей или при создании новых записей.
Если нужно настроить поля для создания отдельно от редактирования, можно переопределить методconfigureCreateForm(). Если при создании записи необходимо настроить отображение полей иначе, чем при редактировании, можно переопределить методconfigureCreateForm(). Этот метод позволяет гибко управлять отображением полей в зависимости от контекста (создание или редактирование).configureShowFields(FormMapper $formMapper)
Этот метод настраивает, какие поля будут отображаться при просмотре конкретной записи.configureListFilters(FormMapper $formMapper)
Этот метод настраивает, какие поля будут отображаться при фильтрации.configureModerationForm(FormMapper $formMapper)
Этот метод настраивает, какие поля будут отображаться при модерации конкретной записи. Для включения модерации нужно установить в классе админки свойствоmoderationEnabled.phpclass PodcastAdmin extends BaseAdminService { protected bool $moderationEnabled = true; }
Админка версионируемых сущностей
Для версионируемой сущности немного меняется синтаксис описания полей, вынесенных в состояние. Если в админке, описывающей простую сущность, мы ко всем полям обращаемся просто по их имени, например так: add('description', BiaInputType::class), то в админке версионируемой сущности к полям, вынесенным в состояние, нужно обращаться через специальное свойство базовой сущности actualState.
Для configureShowFields, configureListFilters и configureListForm поля, вынесенные в состояние, указываются так: add('actualState:description', BiaInputType::class).
php
public function configureListForm(FormMapper $formMapper): FormMapper
{
return $formMapper->block('main')
->add('title', BiaInputType::class)
->add('actualState:description', BiaInputType::class)
->add('actualState:price', BiaInputType::class)
->end();
}В методе configureEditForm поля, находящиеся в сущности состояния, должны быть заключены в метод addForm и описаны в коллбэке этого метода. Это необходимо для корректной работы версионируемых данных при редактировании сущности.
php
public function configureCreateForm(FormMapper $formMapper): FormMapper
{
return $formMapper->block('main')
->add('title', BiaInputType::class)
->addForm('actualState', function (FormMapper $formMapper) {
return $formMapper
->add('description', BiaInputType::class)
->add('price', BiaInputType::class);
}, [
'data_class' => ProductState::class,
'required' => true,
])
->end();
}Регистрация класса админки
Для связи класса админки с сущностью необходимо зарегистрировать админский сервис с использованием Bia\AdminBundle\DependencyInjection\Loader\Configurator\AdminServiceConfigurator.
В процессе регистрации указывается сущность, к которой относится админка, с помощью метода setEntityClassname.
Также нужно добавить тег admin, параметры тега участвуют в генерации пунктов меню административной-панели.
Пример
php
<?php
use App\Bundles\PodcastBundle\Admin\PodcastAdmin;
use App\Bundles\PodcastBundle\Entity\Podcast;
use Bia\AdminBundle\DependencyInjection\Loader\Configurator\AdminServiceConfigurator;
use Bia\AdminBundle\Enum\MenuTypeEnum;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (ContainerConfigurator $containerConfigurator): void {
$services = $containerConfigurator->services();
AdminServiceConfigurator::register($services, "admin.bia.podcast.podcast", PodcastAdmin::class)
->call("setEntityClassname", [Podcast::class])
->tag("admin", [
"originalName" => "Подкасты",
"parentCode" => null,
"isEditable" => true,
"type" => MenuTypeEnum::MAIN->value,
"menuAction" => "list",
]);
};Описание опций для генерации меню
| Опция | Описание |
|---|---|
originalName | Название, которое будет отображаться в пункте меню по умолчанию. |
parentCode | Символьный код меню-родителя, можно не указывать или указать "system" |
isEditable | Флаг, который ограничивает возможность редактирования пункта меню. |
type | Определяет поведение пункта меню в административном интерфейсе (например, основное меню). Значение из MenuTypeEnum |
menuAction | Стандартное действие для меню. По умолчанию это list, но также возможен вариант tree. |