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

Notifly в MODX

В MODX Revolution всё расширяется через плагины, которые «подписываются» на системные события. Подключим к Notifly важные точки: создание ресурса, отправка формы (FormIt), регистрация, ошибки.

Создайте сниппет notiflySend в админке MODX:

<?php
/* notiflySend(&$modx, string $title, string $message, int $priority = 5) */
$url = $modx->getOption('notifly.url');
$token = $modx->getOption('notifly.token');
if (!$url || !$token) return '';
$body = json_encode([
'title' => mb_substr($title, 0, 200),
'message' => mb_substr($message, 0, 1500),
'priority' => $priority,
], JSON_UNESCAPED_UNICODE);
$ch = curl_init("$url/message?token=$token");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => $body,
CURLOPT_TIMEOUT => 5,
]);
curl_exec($ch);
curl_close($ch);
return '';

В разделе «Система → Системные настройки» создайте две настройки с ключами notifly.url и notifly.token.

Создайте плагин NotiflyResource и привяжите к событиям OnDocFormSave:

<?php
$action = $mode === modSystemEvent::MODE_NEW ? 'создан' : 'обновлён';
$title = "📄 Ресурс $action: " . $resource->get('pagetitle');
$msg = "ID: " . $resource->get('id') . "\n" .
"URL: " . $modx->makeUrl($resource->get('id'), '', '', 'full') . "\n" .
"Автор: " . $modx->user->get('username');
$modx->runSnippet('notiflySend', [
'title' => $title,
'message' => $msg,
'priority' => 4,
]);

(в реальной реализации notiflySend лучше вызывать как обычную PHP-функцию, но runSnippet — самый простой способ).

В вызове сниппета FormIt есть параметр &hooks — добавьте свой хук notiflyForm:

[[!FormIt?
&hooks=`email,notiflyForm,redirect`
&emailTpl=`mailFormTpl`
...
]]

Сниппет notiflyForm:

<?php
$values = $hook->getValues();
unset($values['spam-test']);
$lines = [];
foreach ($values as $k => $v) {
if (is_string($v)) $lines[] = "$k: $v";
}
$modx->runSnippet('notiflySend', [
'title' => "✉️ Заявка с сайта",
'message' => implode("\n", $lines),
'priority' => 7,
]);
return true;

Плагин NotiflyUser, событие OnUserFormSave:

<?php
if ($mode !== modSystemEvent::MODE_NEW) return;
$modx->runSnippet('notiflySend', [
'title' => "👤 Новый пользователь: " . $user->get('username'),
'message' => "Email: " . $user->Profile->get('email') . "\n" .
"ID: " . $user->get('id'),
'priority' => 5,
]);

Событие OnPageNotFound:

<?php
$modx->runSnippet('notiflySend', [
'title' => "🚧 404: " . $_SERVER['REQUEST_URI'],
'message' => "Referer: " . ($_SERVER['HTTP_REFERER'] ?? '-') . "\n" .
"UA: " . ($_SERVER['HTTP_USER_AGENT'] ?? '-'),
'priority' => 3,
]);

(тротлинг обязателен — поисковые боты быстро забьют канал).

$cache = $modx->cacheManager->getCacheProvider();
$key = 'notifly_t_' . md5($title);
if ($cache->get($key)) return true;
$cache->set($key, 1, 60);
  • MODX-сайты часто запускают на «слабых» VPS. Push в момент создания заявки = быстрый ответ клиенту.
  • Контроль за модераторами. Каждое изменение ресурса — событие.
  • Оперативный SEO-фидбек. Поток 404 → видно проблемные ссылки.
  • Кастомный TV (Template Variable) с тегом notify — слать только если автор явно поставил галочку.
  • Один общий плагин с match() по $modx->event->name — меньше дублей.