Страница панели: ModuleAdminController
Отзывы копятся в таблице, и владельцу магазина нужно их видеть и удалять. Самый короткий путь к странице со списком в панели управления — старый контроллер ModuleAdminController. Он относится к старому ядру, но умеет многое сам: по описанию колонок строит таблицу с сортировкой, фильтрами и постраничным выводом.
Где лежит контроллер
Контроллеры панели хранят в папке controllers/admin. Создайте файл вручную:
modules/acmehello/
├── acmehello.php
├── classes/
│ └── AcmeReview.php
├── controllers/
│ ├── admin/
│ │ └── AdminAcmehelloReviewsController.php
│ └── front/
│ └── reviews.php
├── upgrade/
└── views/Контроллер
<?php
// modules/acmehello/controllers/admin/AdminAcmehelloReviewsController.php
class AdminAcmehelloReviewsController extends ModuleAdminController
{
public function __construct()
{
$this->bootstrap = true;
$this->table = 'acmehello_review';
$this->className = 'AcmeReview';
$this->identifier = 'id_review';
parent::__construct();
$this->fields_list = [
'id_review' => ['title' => 'ID', 'class' => 'fixed-width-xs'],
'author' => ['title' => $this->trans('Автор', [], 'Modules.Acmehello.Admin')],
'rating' => ['title' => $this->trans('Оценка', [], 'Modules.Acmehello.Admin')],
];
}
}Имя класса начинается с Admin и заканчивается на Controller, имя файла совпадает с именем класса. Свойства говорят, с какой таблицей и какой моделью работать, а fields_list перечисляет колонки списка.
Регистрация страницы
Панель откроет контроллер, только если он зарегистрирован как вкладка — пункт меню. Вкладки описывают в конструкторе главного класса, перед parent::__construct():
// modules/acmehello/acmehello.php
$this->tabs = [
[
'name' => 'Отзывы',
'class_name' => 'AdminAcmehelloReviews',
'parent_class_name' => 'AdminCatalog',
'visible' => true,
],
];class_name — имя класса контроллера без окончания Controller. Вкладки создаются при установке модуля, поэтому его нужно сбросить:
php bin/console prestashop:module reset acmehelloВ меню панели в разделе «Каталог» появится пункт «Отзывы». Откройте его: на странице таблица с номером, автором и оценкой каждого отзыва. Подробно вкладки разобраны в следующем уроке.
Колонки
| Ключ колонки | Что задаёт |
|---|---|
title | Заголовок |
type | Вид значения: datetime, bool, price |
class | Класс CSS ячейки, например fixed-width-xs |
search | false — убрать фильтр по колонке |
orderby | false — запретить сортировку |
Добавьте колонку с датой и сортировку по умолчанию:
// в конструкторе, после parent::__construct()
$this->fields_list['date_add'] = [
'title' => $this->trans('Дата', [], 'Admin.Global'),
'type' => 'datetime',
];
$this->_defaultOrderBy = 'date_add';
$this->_defaultOrderWay = 'DESC';В списке появится колонка с датой, а новые отзывы встанут наверх.
Действия над строками
// в конструкторе, после parent::__construct()
$this->addRowAction('delete');
$this->bulk_actions = [
'delete' => [
'text' => $this->trans('Удалить выбранные', [], 'Admin.Actions'),
'confirm' => $this->trans('Удалить выбранные записи?', [], 'Admin.Notifications.Warning'),
],
];В каждой строке появится кнопка «Удалить», а под таблицей — меню действий над отмеченными строками. Удаление контроллер выполняет сам через модель AcmeReview.
Форма редактирования
Действие edit добавляют так же: $this->addRowAction('edit'). Форму для него описывают в методе renderForm() массивом $this->fields_form — в том же формате, что у HelperForm из урока о настройках. Сохранение контроллер тоже берёт на себя.
Когда выбирать этот способ
| Способ | Когда подходит |
|---|---|
ModuleAdminController | Простой список и форма по своей таблице, нужно быстро |
| Контроллер Symfony | Страница со своей разметкой и логикой; основной путь развития платформы |
Старые контроллеры работают в PrestaShop 8 и 9, но новые страницы самой панели пишутся на Symfony. Этот способ разобран в уроке «Страница панели на Symfony».
Частая ошибка
Контроллер создан, а по ссылке панель отвечает «Страница не найдена». Причина — контроллер не зарегистрирован как вкладка: запись в tabs добавили, а модуль не сбросили, или в class_name оставили окончание Controller. Проверьте имя и выполните prestashop:module reset.