Notifly в MODX
В MODX Revolution всё расширяется через плагины, которые «подписываются» на системные события. Подключим к Notifly важные точки: создание ресурса, отправка формы (FormIt), регистрация, ошибки.
Helper-сниппет
Заголовок раздела «Helper-сниппет»Создайте сниппет 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: уведомление о новой заявке
Заголовок раздела «FormIt: уведомление о новой заявке»В вызове сниппета 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:
<?phpif ($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,]);(тротлинг обязателен — поисковые боты быстро забьют канал).
Тротлинг через cacheManager
Заголовок раздела «Тротлинг через cacheManager»$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— меньше дублей.