Перейти к содержимому

Notifly в OpenCart

OpenCart — это интернет-магазин, где каждое событие означает деньги. Заказ, регистрация, товар на исходе — всё это стоит получать push мгновенно, а не проверять почту раз в час. Подключимся через систему событий OpenCart (таблица event) и небольшой OCMOD-модификатор.

Функцию notifly_send() берём общую — ту же, что и для остальных CMS. Положите её в файл system/library/notifly.php и подключите из config.php, чтобы она была доступна везде.

Самое важное событие. Ловим момент, когда заказу впервые присваивается статус (addOrderHistory), через событие catalog/model/checkout/order/addHistory/after.

Зарегистрируйте обработчик в таблице event (через админку Дополнения → События или SQL) на путь catalog/model/checkout/order/addHistory/after, указав ваш файл:

catalog/model/extension/notifly/order.php
<?php
class ModelExtensionNotiflyOrder extends Model {
public function alert(&$route, &$args, &$output) {
[$order_id, $status_id] = $args;
// Реагируем только на первый переход в «оформлен» (по умолчанию 1).
if ((int)$status_id !== 1) {
return;
}
$this->load->model('checkout/order');
$order = $this->model_checkout_order->getOrder($order_id);
if (!$order) {
return;
}
$products = $this->model_checkout_order->getOrderProducts($order_id);
$lines = [];
foreach ($products as $p) {
$lines[] = "• {$p['name']} × {$p['quantity']}";
}
notifly_send(
"🛒 Заказ #{$order_id}{$order['total']} {$order['currency_code']}",
"Покупатель: {$order['firstname']} {$order['lastname']}\n" .
"Телефон: {$order['telephone']}\n" .
"Оплата: {$order['payment_method']}\n\n" .
"Состав:\n" . implode("\n", $lines) . "\n\n" .
"Админка: index.php?route=sale/order.info&order_id={$order_id}",
9 // заказы — громкий приоритет
);
}
}

После оформления заказа остаток товаров уменьшается. Проверим товары заказа и предупредим, если что-то ушло ниже порога. Дополним тот же обработчик:

$this->load->model('catalog/product');
foreach ($products as $p) {
$product = $this->model_catalog_product->getProduct($p['product_id']);
if (!$product) {
continue;
}
if ((int)$product['quantity'] <= 3) {
notifly_send(
"📦 Мало на складе: {$product['name']}",
"Осталось: {$product['quantity']} шт.\n" .
"SKU: {$product['sku']}\n" .
"Пополнить: index.php?route=catalog/product.form&product_id={$p['product_id']}",
6
);
}
}

Событие catalog/model/account/customer/addCustomer/after срабатывает после создания аккаунта:

catalog/model/extension/notifly/customer.php
<?php
class ModelExtensionNotiflyCustomer extends Model {
public function alert(&$route, &$args, &$output) {
$data = $args[0];
notifly_send(
"👤 Новый покупатель: {$data['firstname']} {$data['lastname']}",
"Email: {$data['email']}\n" .
"Телефон: " . ($data['telephone'] ?? ''),
4
);
}
}

Чтобы не прописывать обработчики руками, оформите их как OCMOD-модификатор, который добавляет строки в таблицу event при установке:

<?xml version="1.0" encoding="utf-8"?>
<modification>
<name>Notifly Alerts</name>
<version>1.0</version>
<author>Notifly</author>
<!-- События регистрируются install-скриптом модуля -->
<file path="system/startup.php">
<operation>
<search><![CDATA[// Registry]]></search>
<add position="before"><![CDATA[
require_once(DIR_SYSTEM . 'library/notifly.php');
]]></add>
</operation>
</file>
</modification>

А сами события добавьте install-скриптом модуля (admin/controller/extension/module/notifly.php, метод install()):

$this->load->model('setting/event');
$this->model_setting_event->addEvent([
'code' => 'notifly_order',
'trigger'=> 'catalog/model/checkout/order/addHistory/after',
'action' => 'extension/notifly/order.alert',
'status' => 1,
'sort_order' => 0,
]);
$this->model_setting_event->addEvent([
'code' => 'notifly_customer',
'trigger'=> 'catalog/model/account/customer/addCustomer/after',
'action' => 'extension/notifly/customer.alert',
'status' => 1,
'sort_order' => 0,
]);

При импорте или массовом обновлении статусов заказов не заваливайте канал. Используйте встроенный кэш OpenCart:

$key = 'notifly_' . md5($title);
if ($this->cache->get($key)) {
return;
}
$this->cache->set($key, 1);
  • Заказ виден за секунды. Успеваете подтвердить заказ, пока клиент ещё онлайн.
  • Склад под контролем. Push о низком остатке — не пропустите «out of stock».
  • Не нужен платный модуль уведомлений из маркетплейса OpenCart.
  • Отдельные каналы Notifly: «заказы», «склад», «клиенты».
  • Приоритет заказа по сумме: большие чеки — приоритет 10.
  • Deep-link на заказ через extras.