Написание модуля для opencart 3.x

Пользовательская часть модуля

Контроллер модуля catalog/controller/extension/module/example.php

Создание контроллера пользовательской части похоже на административную, только не нужно сохранять настройки, нужно только написать код, который вывводит информацию в зависимости от того включен модуль или нет.


class ControllerExtensionModuleExample extends Controller {
  public function index() {
    // Загружаем "модель"
    $this->load->model('extension/module/example');
    $data = array();
    // Загружаем настройки (для проверки включен модуль или нет)
    $data = $this->model_extension_module_example->LoadSettings();
    // Загружаем языковой файл
    $data += $this->load->language('extension/module/example');
    // Хлебные крошки
    $data[] = array(
      'text' => $this->language->get('text_home'),
      'href' => $this->url->link('common/home')
    );
    $data[] = array(
      'text' => $data,
      'href' => $this->url->link('extension/module/example')
    );
    // Загружаем остальное
    $data = $this->load->controller('common/column_left');
    $data = $this->load->controller('common/column_right');
    $data = $this->load->controller('common/content_top');
    $data = $this->load->controller('common/content_bottom');
    $data = $this->load->controller('common/footer');
    $data = $this->load->controller('common/header');
    // Выводим на экран
    $this->response->setOutput($this->load->view('extension/module/example', $data));
  }
}

Модель модуля catalog/model/extension/module/example.php

В нашем примере модель пользовательской части маленькая, т.к. нужно лищь прочитать одну настройку.

class ModelExtensionModuleExample extends Model {
  // Загрузка настроек из базы данных
  public function LoadSettings() {
    return $this->config->get('module_example_status');
  }
}

Языковой файл модуля catalog/langugage/ru-ru/extension/module/example.php

$_ = 'Пример модуля';
$_  = 'Пример модуля на OpenCart 3.x';
$_    = 'Модуль выключен';

Административная часть или бэкенд модуля

Переводы

Переводы Opencart хранятся в каталоге languages, они довольно примитивны и представляют собой PHP файлы содержащие массив $_. В этом массиве прописываются ключи-значения, и, собственно, всё!

В каждой языковой директории имеется файл с названием кода языка (например, languages/ru-ru/ru-ru.php), в котором содержатся общесистемные переводы, а также региональные настройки.

Каждый модуль Opencart должен обладать одноимённым файлом переводов, в котором необходимо наличие секции heading_title, значение этой секции используется для вывода названия модуля в списке модулей:

Контроллер

Настало время разработки контроллера для админки. Для этого создадим файл example.php в директории admin/controller/extension/module:

Обратите внимание на префикс ControllerExtensionModule в названии нашего класса — Controller даёт загрузчику понять что он имеет дело с контроллером, ExtensionModule — что класс лежит в директории extension/module. Теперь давайте создадим свой action с названием index

Этот метод можно считать входной функцией модуля (как функция main в C):

Теперь давайте создадим свой action с названием index. Этот метод можно считать входной функцией модуля (как функция main в C):

Как видите, Opencart помимо готовых переводов, предоставляет также и несколько общих контроллеров, которые используются для добавления интерфейсных частей вроде шапки и подвала.

Представление или шаблон

Opencart не использовал внешних шаблонизаторов вплоть до третьей версии (там прикрутили twig), и по сути шаблоны, это такая мешанина html + php.

У такой связки есть только один минус — она позволяет говнокодить и использовать php в шаблоне не по назначению.


Давайте создадим шаблон для нашего модуля — view/template/extension/module/example.tpl:

Отлично!

Административная часть модуля готова, давайте протестируем её. Для этого можно пойти двумя путями.

  1. Традиционный способ, унаследованный из первых версий движка: просто копируем содержимое папки upload в корень установленного Opencart
  2. Более удобный для дистрибуции: упаковываем папку upload в ZIP архив с названием <имя_модуля>.ocmod.zip и устанавливаем модуль штатным установщиком Opencart.

Во время разработки более удобен способ с простым копированием файлов, однако, распространять свой модуль лучше всего в виде *.ocmod.zip файла.

Bash tip:

Для удобного и быстрого копирования всех файлов нашего модуля в движок, можно воспользоваться командой rsync:

А для быстрого создания нужного нам архива можно воспользоваться консольной версией zip:

После того как модуль будет внедрён одним из способов в систему, нужно его установить (находим его в разделе «дополнения/дополнения» и кликаем по зелёной кнопке установки). Кроме того, поскольку наш модуль подразумевает возможность вставки через интерфейс настройки шаблонов, нужно его активировать (переходим в редактирование модуля и выбираем статус «включено»): 

На заметку

Управление статусом нужно только тем модулям, которые можно встраивать через макеты. В обратном случае вовсе необязательно вообще реализовывать поддержку статуса.

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


Однако, сейчас вы не увидите никаких изменений на странице, поскольку мы не написали ни строки управляющего кода для фронтенд части (catalog).

Концептуальной разницы между admin/catalog частями модуля почти нет, стоит только упомянуть, что в панели администрирования нет такого понятия как «тема» — там все представления располагаются сразу в папке template.

Фронтендная часть модуля подразумевает такую структуру файлов представления: view/theme/default/template/extension/module.

Пользовательская часть (или фронтенд)

Контроллер

Помните, я упоминал контроллеры, которые возвращают отрендеренные шаблоны, а не устанавливают их в объект Response?

Для фронтенда мы воспользуемся именно таким способом вывода содержимого − catalog/controller/extension/module/example.php:

При выводе модуля, прикреплённого в макете, Opencart вызывает индексный экшн (метод index). В нём мы проверяем — существует-ли кастомное представление в текущей теме сайта ($this->config->get(‘config_template’)), и если существует, то оно и будет загружено, если нет, то будет использовано представление из темы default.

Таким образом мы позволяем пользователям нашего модуля гибко изменять шаблоны модуля согласно своим требованиям.

А вот и наше стандартное представление − catalog/view/theme/default/template/extension/module/example.tpl:

Когда вы запакуете и установите обновлённую версию нашего модуля, то получите что−то в таком духе:

Подведём итог

Мы разработали абсолютно бесполезный, но собственный модуль для Opencart 2. Рассмотрели базовые принципы разработки и некоторые подводные камни.

В следующей статье я планирую рассказать о системе OCmod/VQmod, показать что это, зачем и как использовать.


Помните — Opencart это свободное программное обеспечение, поэтому вы можете самостоятельно изучать и модифицировать его в своих целях.

Создание архива для загрузки модуля установщиком расширений

Когда модуль полностью готов, его лучше оформить в виде архивного файла, который OpenCart может загрузить и установить в систему. Для этого нужно создать папку upload и поместить в нее все файлы модуля со всей структурой папок в которых они находятся. Затем папку нужно упаковать в zip-архив с именем название_модуля.ocmod.zip. В примере выше получится архив example.ocmod.zip.

Скачать пример модуля example.ocmod.zip создание которого было описано выше.

Теперь модуль готов для автоустановки установщиком расширений.

После установки модуля он появляется в списке модулей.

Модуль нужно активировать нажав на зеленую кнопку со знаком «плюс», после чего можно зайти в настройки модуля через синюю кнопку со знаком «карандаш».

В модуле можно менять одну настройку — статус (выключено/включено), а в пользовательской части мы заходим по адресу index.php?route=extension/module/example и наблюдаем за изменениями в зависимости от настройки модуля.


С этим читают