Основные понятия
Прежде чем писать код, полезно знать пять слов, которые встречаются в каждом уроке: MVC-L, реестр, дополнение, событие и версия. Каждому позже посвящены свои уроки — здесь только то, что они означают.
MVC-L
Каждая страница собирается из четырёх файлов, у каждого одна задача:
| Буква | Часть | Задача | Папка |
|---|---|---|---|
| M | Модель | Запросы к базе данных | model |
| V | Шаблон | HTML на Twig | view/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/review | product/product.review |
| Изменение ядра | Файлы OCMOD | Сначала события, OCMOD — в крайнем случае |
| PHP | 7 | 8.0 и новее |
В выпусках 4.0.0 и 4.0.1 метод отделялся не точкой, а вертикальной чертой.
Частая ошибка
Объекты реестра пытаются использовать вне контроллера или модели — в обычной функции или собственном классе, — а $this->db там нет. Объекты реестра доступны только в классах, которые наследуют Controller или Model движка. Держите код работы с базой в моделях и вызывайте их из контроллеров.