Пункты меню панели
Вкладка в PrestaShop — это запись, которая связывает страницу панели с пунктом меню. Без неё контроллер панели не откроется вовсе, а права сотрудников на страницу не настроить. Модуль описывает свои вкладки свойством tabs, и движок создаёт их при установке и удаляет при удалении модуля.
Описание вкладки
Вкладки задают в конструкторе главного класса, перед вызовом parent::__construct():
// modules/acmehello/acmehello.php
$this->tabs = [
[
'name' => 'Отзывы',
'class_name' => 'AdminAcmehelloReviews',
'parent_class_name' => 'AdminCatalog',
'visible' => true,
],
];После сброса модуля в разделе меню «Каталог» появится пункт «Отзывы».
php bin/console prestashop:module reset acmehelloКлючи
| Ключ | Что задаёт |
|---|---|
name | Название пункта. Строка или массив по языкам |
class_name | Имя контроллера без окончания Controller |
parent_class_name | Раздел меню, внутри которого стоит пункт |
visible | false — страница работает, но в меню её нет |
icon | Значок для пункта верхнего уровня |
route_name | Имя маршрута Symfony, если страница написана на Symfony |
Название на нескольких языках
'name' => [
'en' => 'Reviews',
'ru' => 'Отзывы',
],Ключ — код языка. Для языков, которых в массиве нет, движок возьмёт первое значение.
Родительские разделы
parent_class_name | Раздел меню |
|---|---|
AdminCatalog | Каталог |
AdminParentOrders | Заказы |
AdminParentCustomer | Клиенты |
AdminParentModulesSf | Модули |
AdminParentShipping | Доставка |
AdminParentPayment | Оплата |
AdminAdvancedParameters | Расширенные параметры |
Имя класса любого раздела можно узнать в таблице ps_tab, колонка class_name:
SELECT id_tab, id_parent, class_name FROM ps_tab WHERE id_parent = 0 OR class_name LIKE 'AdminParent%';Запрос покажет разделы верхнего уровня и подразделы, в которые можно встроиться.
Скрытая вкладка
Не каждой странице нужен пункт меню. Страницу, на которую ведёт кнопка с другой страницы, регистрируют с 'visible' => false:
[
'name' => 'Статистика отзывов',
'class_name' => 'AdminAcmehelloStats',
'parent_class_name' => 'AdminCatalog',
'visible' => false,
],Страница откроется по ссылке, но в меню её не будет.
Свой раздел с подпунктами
Если страниц несколько, сначала описывают раздел, затем его подпункты — в parent_class_name у них стоит class_name раздела:
$this->tabs = [
[
'name' => 'Acme',
'class_name' => 'AdminAcmehelloParent',
'parent_class_name' => 'AdminCatalog',
'visible' => true,
],
[
'name' => 'Отзывы',
'class_name' => 'AdminAcmehelloReviews',
'parent_class_name' => 'AdminAcmehelloParent',
'visible' => true,
],
];У раздела-контейнера контроллера может не быть: по нажатию откроется первый подпункт.
Ссылка на страницу панели
Адрес страницы панели содержит защитный токен, поэтому его не пишут руками. Ссылку строит getAdminLink() — например, чтобы со страницы настроек модуля перейти к списку отзывов:
// modules/acmehello/acmehello.php, метод getContent
$url = $this->context->link->getAdminLink('AdminAcmehelloReviews');Метод возвращает полный адрес с токеном.
Права доступа
Для каждой вкладки движок создаёт права на просмотр, добавление, изменение и удаление. Владелец магазина раздаёт их профилям сотрудников на странице «Расширенные параметры → Команда → Разрешения». Профиль без права просмотра не увидит пункт меню и не откроет страницу по ссылке.
Частая ошибка
В tabs поменяли название или родителя, а меню осталось прежним. Вкладки записываются в базу только при установке модуля. После любой правки tabs модуль нужно сбросить. В обновлении уже выпущенного модуля новую вкладку создают в скрипте обновления — объектом Tab или повторной установкой вкладок.