Encodera

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

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

Оглавление

Пункты меню панели

Вкладка в 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Раздел меню, внутри которого стоит пункт
visiblefalse — страница работает, но в меню её нет
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 или повторной установкой вкладок.

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

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