Бесплатно
Загрузите дополнение из админки вашего сайта.
Как загрузить?
Как загрузить?
UniversalEventBus — двусторонняя шина событий для MODX: сервер публикует событие в браузер, а браузер передаёт действие на сервер. Никаких внешних realtime-сервисов, аккаунтов и подписок: transport работает на том же сервере, что и сайт.
Adaptive transport для shared-хостинга
Совместимость
Использование
Обычный переход по ссылке с browser-событием ждёт запись на сервер лишь ограниченное время, затем новая страница дочитывает событие по cursor.
Adaptive transport для shared-хостинга
- Активная вкладка использует ограниченный по времени SSE с heartbeat; MODX загружается один раз на соединение.
- После простоя SSE закрывается, а клиент переходит на короткий cursor polling с backoff. Между такими запросами PHP worker свободен.
- Скрытая вкладка transport не держит; BroadcastChannel оставляет одно соединение на browser profile и передаёт события остальным вкладкам.
- События сохраняются в локальной таблице до TTL. Cursor и eventId дают упорядоченную доставку и дедупликацию, а новая страница может дочитать событие после навигации.
- PHP-session lock освобождается до SSE-цикла, поэтому stream не блокирует корзину, checkout и AJAX.
Совместимость
- Версия 1.x — MODX 2.6–2.8, PHP 7.4+.
- Версия 2.x — MODX 3.0+, PHP 8.1+.
- Для обратной совместимости доступен legacy transport через настройку ueb_transport=legacy.
Использование
- Создайте плагин MODX, подключите его к нужному системному событию и вызовите EventBus:
$autoload = $modx->getOption('core_path') . 'components/universaleventbus/vendor/autoload.php';
if (is_file($autoload)) { require_once $autoload; }
(new \UniversalEventBus\EventBus($modx))->handleEvent($modx->event->name);- Во фронтенде слушайте DOM-событие eventbus; browser event отправляется атрибутом data-ueb-event.
document.addEventListener('eventbus', (event) => {
console.log(event.detail.data);
});
<a href="/next" data-ueb-event="click">Следующая страница</a>Обычный переход по ссылке с browser-событием ждёт запись на сервер лишь ограниченное время, затем новая страница дочитывает событие по cursor.
1.3.1-rc
- FIX: кука контекста снова ставится на домен основного контекста, а не на его первый символ. fetch(PDO::FETCH_COLUMN) возвращает значение колонки строкой, а обращение [0] брало из неё первый символ: setContextCookie отправлял домен вида "s", браузер такую куку отбрасывал. На сайтах, где витрины разведены по поддоменам одного домена, контекст из-за этого не переживал переход на соседний поддомен и откатывался к основному — вместе с языком и site_url. На однодоменных сайтах дефект не проявлялся.
1.3.0-rc
- FEATURE: adaptive local transport без внешних сервисов. Активная вкладка держит bounded SSE с heartbeat, после idle переходит на короткий cursor polling с backoff, скрытая вкладка не держит PHP worker. BroadcastChannel оставляет один transport на browser profile.
- FEATURE: события хранятся до TTL в локальной таблице ueb_events с cursor и UUID; SSE освобождает PHP session lock до цикла. Событие не удаляется при первом чтении, поэтому новая страница или вкладка может дочитать его до TTL.
- FIX: click по обычной ссылке с data-ueb-event ждёт запись события не дольше ueb_navigation_timeout и перед переходом останавливает transport текущей страницы. Это устраняет гонку отменённого fetch при выгрузке документа.
1.2.6-pl
- FIX: keepalive у fetch-запросов eventbus.js включается только по явному флагу (paramsObj.keepalive / data-ueb-params / config.keepalive) либо когда страница уже скрывается (visibilityState=hidden). Раньше keepalive:true стоял на всех запросах: по спецификации Fetch суммарное тело всех keepalive-запросов страницы ограничено 64 КБ, превышение давало TypeError: Failed to fetch и терялись события.
1.2.5-pl
- Логирование переведено с файлов (logs/*.txt) на mxLogger. Хелпер Logging делегирует записи сервису mxLogger (если установлен), иначе молчит и один раз предупреждает в журнале MODX. Перевод затронул EventBus и QueueManager.
- Гейты: ueb_debug (вкл/выкл) + новая настройка ueb_log_level (минимальный уровень debug|info|warning|error, по умолчанию error; единый приёмник mxLogger, включено из коробки). Консистентно с mxLogger.min_level. QueueManager теперь учитывает ueb_debug (раньше new Logging() без гейта).
- Тэги: базовые universaleventbus + events, этапные order (orderData), queue (очередь). Воронка processuid = «universaleventbus»+md5(branch) — события одной сессии/ветки склеиваются в mxLogger одним процессом.
- Сигнатура Logging::write сохранена (позиционные method/msg/data), добавлены параметры $level и $tags. Уровни: дампы resourceData/orderData/SQL — debug; пустая ветка/данные очереди — warning.
- ВНИМАНИЕ: перед сборкой настройку ueb_log_level создать в менеджере (namespace universaleventbus) — сборка тянет настройки из БД стенда.
1.2.4-pl
- Вынес contextCookieName в системные настройки (ueb_context_cookie_name).
- Добавил проверку существования контекста перед переключением.
1.2.3-pl
- Исправление ошибок.
1.2.2-pl
- Исправление ошибок.
1.2.1-pl
- Добавил возможность явно передать контекст в метод handleEvent().
1.2.0-pl
- Мелкие правки.
1.2.0-beta7
- Изменил логику смены контекста.
- Добавил систему гарантированной доставки сообщений.
- Добавил в ответ при отправке браузерного события информацию о добавлении события в очередь.
- Оптимизировал работу компонент при нескольких открытых вкладках.
- Поменял доступность свойства EventBus::contextCookieName.
1.2.0-beta6
- Поместил создание экземпляра класса EventBus в метод обработчик события DOMContentLoaded.
1.2.0-beta5
- Сделал свойство EventBus::isBot публичным.
1.2.0-beta4
- Исправил ошибку в методе execute() при возврате строки.
- Добавил возможность передавать в менеджер очередей опции при добавлении элемента в очередь.
1.2.0-beta3
- Исправил получение данных о конкретном элементе корзины.
1.2.0-beta2
- Добавил возможность транслитерации полей товара в orderData.
- Изменил обработку открытий и закрытий элементов.
1.2.0-beta
- Добавил возможность транслитерации полей товара в productsData.
- Добавил получение данных модификации при использовании msOptionsPrice2.
1.1.0-beta4
- Мелкие правки.
1.1.0-beta3
- Добавил возможность использовать методы execute() и getSQL().
- Добавил возможность определять страницу по переданному в параметрах uri.
1.1.0-beta2
- Добавил возможность пересылать сообщения между пользователями.
- Добавил возможность программно отправлять события на сервер.
1.1.0-beta
- Добавил отправку браузерных событий на сервер.
1.0.0-beta2
- Добавил ESLint.
- Добавил информацию о корзине.
- Поменял приоритет для события OnLoadWebDocument.
- Убрал любые манипуляции с данными на фронтенде.
1.0.0-beta
- Первая сборка.




Последние обсуждения в сообществе MODX.pro