Разработка кастомного модуля OpenCart
Недавно к нам обратился владелец магазина на OpenCart: стандартная корзина не поддерживала гибкую систему скидок по группам клиентов. Потребовался модуль, который автоматически применял бы скидку 10% для оптовиков и 5% для постоянных покупателей. Встроенные механизмы OpenCart не позволяли реализовать такую логику без доработок. Мы написали кастомный модуль, который учитывает группы, проверяет историю заказов и динамически рассчитывает скидку. В результате владелец получил рост среднего чека на 15% за счёт персонализации.
Это лишь один из множества сценариев, когда готовые расширения бессильны. Кастомный модуль — это уникальный код, который точно отражает бизнес-логику вашего магазина. Мы создаём модули любой сложности: от простых витринных блоков до интеграций с 1С, ERP и кастомными платёжными шлюзами. За 10+ лет мы разработали более 30 модулей для OpenCart 2.x, 3.x и 4.x, что позволило накопить обширную базу готовых решений и избежать типовых ошибок.
Какие типы расширений существуют в OpenCart?
OpenCart 4.x структурирует расширения по типам:
| Тип | Назначение | Примеры использования |
|---|---|---|
module |
Блоки на витрине | Баннеры, хиты продаж, выборки товаров |
payment |
Платёжные шлюзы | Приём карт, PayPal, Apple Pay |
shipping |
Методы доставки | Расчёт стоимости через API СДЭК, Почты РФ |
total |
Позиции в итоговой сумме | Скидки, сборы, налоги, подарочные сертификаты |
report |
Отчёты в панели администратора | Статистика продаж, поведенческие отчёты |
event |
Обработчики событий (хуки) | Модификация страниц без правки ядра |
theme |
Темы оформления | Полная смена дизайна |
language |
Языковые пакеты | Переводы интерфейса |
Большинство кастомных задач решается через module (витрина) или event (интеграции, модификаторы бизнес-логики).
Сравнение модулей и событий: что выбрать?
| Параметр | Модуль | Событие |
|---|---|---|
| Назначение | Добавление нового функционала | Модификация существующего |
| Сложность | Средняя (полноценный MVC) | Низкая (только обработчик) |
| Гибкость | Высокая (свои контроллеры, модели) | Ограниченная (только перехват) |
| Пример | Блок «Товары из той же категории» | Добавление поля в форму заказа |
Если нужно что-то принципиально новое — выбирайте модуль. Если нужно слегка подкорректировать стандартное поведение — событие. Кастомный модуль в 3 раза эффективнее готового расширения для нестандартной логики, так как не содержит лишнего кода.
Как разработать кастомный модуль OpenCart?
Рассмотрим создание модуля, показывающего товары из той же категории. Это типовой кейс для улучшения cross-sell на странице товара.
1. Admin Controller — управление настройками модуля:
<?php namespace Opencart\Admin\Controller\Extension\Myvendor\Module; class RelatedCategory extends \Opencart\System\Engine\Controller { public function index(): void { $this->load->language('extension/myvendor/module/related_category'); $this->document->setTitle($this->language->get('heading_title')); $data['limit'] = $this->config->get('module_related_category_limit') ?: 6; $data['status'] = $this->config->get('module_related_category_status'); $data['action'] = $this->url->link( 'extension/myvendor/module/related_category.save', 'user_token=' . $this->session->data['user_token'] ); $this->response->setOutput($this->load->view( 'extension/myvendor/module/related_category', $data )); } public function save(): void { $this->load->language('extension/myvendor/module/related_category'); if ($this->request->server['REQUEST_METHOD'] == 'POST') { $this->load->model('setting/setting'); $this->model_setting_setting->editSetting('module_related_category', [ 'module_related_category_status' => $this->request->post['status'], 'module_related_category_limit' => (int) $this->request->post['limit'], ]); $this->response->redirect($this->url->link( 'marketplace/extension', 'user_token=' . $this->session->data['user_token'] . '&type=module' )); } } } 2. Catalog Model — получение товаров из той же категории:
<?php namespace Opencart\Catalog\Model\Extension\Myvendor\Module; class RelatedCategory extends \Opencart\System\Engine\Model { public function getProductsFromSameCategory(int $productId, int $limit): array { $query = $this->db->query(" SELECT DISTINCT p.product_id, pd.name, p.image, p.price, p.tax_class_id FROM oc_product p JOIN oc_product_description pd ON p.product_id = pd.product_id AND pd.language_id = '" . (int) $this->config->get('config_language_id') . "' JOIN oc_product_to_category ptc ON p.product_id = ptc.product_id WHERE ptc.category_id IN ( SELECT category_id FROM oc_product_to_category WHERE product_id = '" . $productId . "' ) AND p.product_id != '" . $productId . "' AND p.status = 1 AND p.date_available <= NOW() ORDER BY RAND() LIMIT " . $limit . " "); return $query->rows; } } 3. Система событий (Events) — альтернативный способ встраивания логики без изменения стандартных файлов. Например, чтобы добавить блок на страницу товара, зарегистрируем событие:
$this->load->model('setting/event'); $this->model_setting_event->addEvent([ 'code' => 'myvendor_related_category', 'description' => 'Add category products to product page', 'trigger' => 'catalog/controller/product/product/after', 'action' => 'extension/myvendor/event/product.after', 'status' => true, 'sort_order' => 0, ]); В обработчике after можно инжектировать HTML-код блока прямо в вывод страницы. Обратите внимание: в OpenCart 4 используется неймспейсинг и PSR-4 автозагрузка. Код модуля должен следовать правилам OpenCart developer documentation. Также существует стандартная система OCMOD для развёртывания модулей: файлы упаковываются в ZIP с ocmod.xml, что упрощает установку.
Почему стоит заказать разработку модуля у нас?
Мы разработали более 30 кастомных модулей для OpenCart от версии 2.x до 4.x — от простых блоков до интеграций с 1С и ERP. Предоставляем гарантию на код, документацию и поддержку после установки. Вы получаете модуль, который не конфликтует с другими расширениями и соответствует стандартам кодирования OpenCart. Свяжитесь с нами для оценки вашего проекта — мы предложим оптимальное решение и назовём сроки.
Что входит в разработку модуля?
| Этап | Описание |
|---|---|
| Анализ требований | Уточнение бизнес-логики, интеграций, ограничений |
| Проектирование | Архитектура модуля, выбор типа (module/event), прототип |
| Разработка | Написание кода контроллеров, моделей, шаблонов, событий |
| Тестирование | Проверка на разных версиях OpenCart, Edge-кейсы |
| Установка и настройка | Деплой на сервер, настройка параметров в админке |
| Документация | Инструкция по установке, настройке и эксплуатации |
| Обучение | Консультация администратора магазина |
Сроки разработки
| Тип модуля | Сроки |
|---|---|
| Простой витринный блок (без настроек) | 1-2 дня |
| Модуль с настройками в админке + вывод | 2-3 дня |
| Платёжный шлюз (новый провайдер) | 3-5 дней |
| Метод доставки с расчётом через API | 2-4 дня |
| Интеграция с внешней системой (1С, ERP) | 3-5 дней |
| Кастомная логика ценообразования | 3-5 дней |
Стоимость рассчитывается индивидуально, исходя из сложности задач. Получите консультацию — мы ответим на вопросы и поможем определиться с архитектурой модуля.







