Encodera

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

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

Оглавление

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

Прежде чем писать код, полезно знать пять слов, которые встречаются в каждом уроке: MVC-L, реестр, дополнение, событие и версия. Каждому позже посвящены свои уроки — здесь только то, что они означают.

MVC-L

Каждая страница собирается из четырёх файлов, у каждого одна задача:

БукваЧастьЗадачаПапка
MМодельЗапросы к базе данныхmodel
VШаблонHTML на Twigview/template
CКонтроллерПринимает запрос, собирает данные, отдаёт ответcontroller
LПереводТексты страницы для каждого языкаlanguage

Главный — контроллер: остальные три он подключает сам.

Реестр

В OpenCart нет внедрения зависимостей. Все общие объекты лежат в одном месте — реестре — и доступны в каждом контроллере и модели как свойства $this:

// внутри любого метода контроллера или модели
$productId = (int) ($this->request->get['product_id'] ?? 0);
$storeName = $this->config->get('config_name');

Первая строка читает параметр из адреса, вторая — название магазина из настроек.

ОбъектДля чего
$this->requestДанные запроса: get, post, cookie, files, server
$this->responseОтвет: вывод, заголовки, перенаправление
$this->loadЗагрузка моделей, шаблонов, переводов, других контроллеров
$this->dbЗапросы к базе
$this->configНастройки магазина
$this->sessionДанные сессии
$this->urlПостроение ссылок
$this->languageТексты загруженных файлов перевода
$this->documentЗаголовок страницы, стили и скрипты
$this->cache, $this->logКеш и журнал ошибок
$this->cart, $this->customerКорзина и покупатель — только на витрине
$this->userСотрудник — только в панели

Дополнения

Дополнение — папка в extension/ со своими частями admin и catalog. Его ставят и удаляют из панели. У дополнений есть виды: module, payment, shipping, total, theme и другие.

События

Событие — сигнал, который движок отправляет до и после каждого вызова контроллера, модели и шаблона. Дополнение подписывается на сигнал и меняет данные или вывод, не трогая файлы ядра.

Версия 3 и версия 4

ЧтоВерсия 3Версия 4
Имена классовControllerProductProductПространство имён Opencart\Catalog\Controller\Product и класс Product
Файлы дополненияРазбросаны по admin и catalogОдна папка extension/acme_hello/
Метод в адресеproduct/product/reviewproduct/product.review
Изменение ядраФайлы OCMODСначала события, OCMOD — в крайнем случае
PHP78.0 и новее

В выпусках 4.0.0 и 4.0.1 метод отделялся не точкой, а вертикальной чертой.

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

Объекты реестра пытаются использовать вне контроллера или модели — в обычной функции или собственном классе, — а $this->db там нет. Объекты реестра доступны только в классах, которые наследуют Controller или Model движка. Держите код работы с базой в моделях и вызывайте их из контроллеров.

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

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