Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Страница панели: 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
searchfalse — убрать фильтр по колонке
orderbyfalse — запретить сортировку

Добавьте колонку с датой и сортировку по умолчанию:

// в конструкторе, после 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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.