Encodera

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

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

Оглавление

Основные понятия

В документации и коде PrestaShop постоянно встречаются одни и те же слова: витрина, панель, хук, контекст. Этот урок — словарь. Каждое понятие дальше разобрано подробно, здесь важно понять, что чем является.

Витрина и панель управления

ЧастьКто пользуетсяАнглийское название
ВитринаПокупатель: каталог, корзина, заказFront office, FO
Панель управленияВладелец магазина: товары, заказы, настройкиBack office, BO

Это две отдельные части с разными адресами, шаблонами и контроллерами. Модуль обычно работает в обеих: выводит блок на витрине и даёт страницу настроек в панели.

Модуль, хук, тема

ПонятиеЧто это
МодульПапка в modules с главным классом. Его можно установить, выключить и удалить из панели
ХукИменованная точка в коде или шаблоне, в которой движок спрашивает модули: «кто хочет что-то добавить?»
ТемаШаблоны, стили и скрипты витрины

Связь между ними такая: тема в нужном месте страницы вызывает хук, например displayHome, а модуль, подписанный на этот хук, возвращает HTML. Тема не знает, какие модули установлены, а модуль не знает, как устроена тема.

Два ядра

PrestaShop постепенно переезжает на фреймворк Symfony, и в коде живут два мира.

Старое ядроНовое ядро
Папкиclasses, controllerssrc
ШаблоныSmarty, файлы .tplTwig, файлы .html.twig
Где работаетВся витрина и часть панелиБольшинство страниц панели
Как выглядит кодКлассы без пространств имён: Product, DbСлужбы, маршруты, контроллеры Symfony

Модулю приходится иметь дело с обоими: блок на витрине пишут по-старому, страницу в панели — по-новому. В курсе всегда сказано, к какому миру относится пример.

Контекст

Контекст — объект класса Context, в котором собрано всё о текущем запросе: какой магазин, язык, валюта, кто покупатель, какая у него корзина.

$context = Context::getContext();
 
$languageId = (int) $context->language->id;
$currencyCode = $context->currency->iso_code;
$customerName = $context->customer->firstname;

Первая строка получает контекст, остальные читают из него номер языка, код валюты и имя покупателя. Внутри модуля и контроллера вызывать getContext() не нужно: контекст уже лежит в $this->context.

Что есть в контексте

СвойствоЧто в нём
languageТекущий язык
currencyТекущая валюта
shopТекущий магазин
customerПокупатель на витрине
cartЕго корзина
employeeСотрудник в панели управления
linkПостроитель адресов страниц
smartyШаблонизатор
controllerКонтроллер текущей страницы

Несколько магазинов и языков

Одна установка может обслуживать несколько магазинов и языков. Поэтому у товара нет одного названия: оно своё для каждого языка. Поэтому же многие методы ядра принимают номер языка и номер магазина, а берут их обычно из контекста.

Частая ошибка

В панели управления обращаются к $this->context->customer или $this->context->cart и получают пустой объект: покупателя и корзины там нет, есть сотрудник в $this->context->employee. На витрине наоборот. Прежде чем читать свойство контекста, подумайте, на какой стороне выполняется код.

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

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