Всем доброго времени суток!  Нынче многие бросают свой взгляд в сторону EasyAdminBundle, но я до сих пор использую и предпочитаю одну из лучших панелей администратора для Symfony. Система очень гибкая и многими недооценённая, мол Sonata ограничивает администратора в действиях (представляет малый функционал панели администратора). Если Вам нужно что-то иное, всегда можно дополнить или модернизировать уже существующие методы. Недавно мне нужно было произвести пакетное действие для продуктов и после выполненной работы захотелось рассказать об этом Вам. Вдобавок прикреплю Select2, ибо у меня возникали некие трудности, офф.документация ограничена в информации. Итак, начнем сразу с чистого проекта. На момент создания хаба актуальные версии пакетов: symfony/skeleton 6.1 sonata-project/admin-bundle 4.18 sonata-project/doctrine-orm-admin-bundle 4.7 sonata-project/user-bundle 5.3.3 При установке никаких проблем особо возникать не должно, в ином случае в интернете полно информации об установке SonataAdminBundle. Для демонстративной работы пакетного действия нам понадобится 2 сущности, со связью M2M. Создаём сущность Product: Также создаём Category: В обе сущности требуется добавить метод возврата строки __toStringОбновим таблицы в БД: Теперь создадим файлы для панели администратора: Нужно их зарегистрировать: Добавим кастомное поле, где будет отображаться скидка и цена со скидкой.Саму скидку запишем в параметры контейнера: Теперь передадим этот параметр в качестве аргумента: Принимаем параметр и создаём само поле: Чтобы не вызывало ошибку о несуществующем методе, создадим метод в сущности продукта. Не важно что он будет возвращать. Нам теперь нужно создать шаблон, который будет отображать поле Добавим тройку тестовых записей продуктов, заодно сразу тройку категорий. Проверяем.   Можно создавать пакетное действие. Нужно создать метод configureBatchActions Проверим отображение Попробуем добавить поле выбора категории. Для этого я решил выбрать Select2 с подгрузкой названий с помощью Ajax. Создадим новый шаблон. Метод пакетного удаления мне не нужен, поэтому я удалил возможность выбора и всегда будет использоваться только наш метод: Установим новый шаблон для нашего списка Теперь у нас поле выбора категории, но ещё не настроен ответ Ajax. Категории мы уже создали. Нужно создать запрос query в CategoryRepository, который будет возвращать сущности с похожим набором символов в имени. Создадим контроллер, который будет принимать запрос от Ajax. Настроим маршрут для контроллера Теперь можно проверить работу нашего Select2 Осталось только настроить контроллер, который будет принимать категорию и добавлять её к выделенным продуктам. Нам нужен CRUD контроллер и метод с названием нашего пакетного действия: Теперь передадим в наш сервис контроллер в качестве аргумента: Попробуем добавить категорию к нескольким продуктам Как мы видим, теперь всё работает и работает всё как нам нужно и к отмеченным продуктам прикрепилась выбранная категория. Я хотел вам показать, что SonataAdminBundle не ограничивает Вас в действиях. Вы можете сделать любое действие, которое Вам требуется, нужно лишь знать как и где это править. Буду рад любым замечаниям и комментариям, также постараюсь ответить на вопросы, если у Вас они возникнут.