modUserMessage плагин на событие
Добрый день сообщество. Есть идея попробовать реализовать сообщения для пользователей бэкенда на фронтенде. Для этого хочется попробовать использовать SSE (Server-sent events).
Для его реализации нужно решить пару вопросов.
1. Как в modx поймать событие когда modUserMessage создан?
2. Если это не возможно, как грамотно изменить файлы ядра с классом modUserMessage, что бы при создании он инициировал кастомный event который мы ему напишем?
3. Не изобретаю ли я велосипед? Нет ли в ядре modx таких механизмов SSE (как те же Custom events и modRestService, которые можно начать реализовывать самому, не зная что они есть в ядре).
Попробую описать как пока видно реализацию подобного:
1. Срабатывает событие при создании объекта modUserMessage (вопрос номер 1), передав в событие объект сообщения.
2. Статичный php плагин который назначен на это событие начинает работу.
В JS есть переменная в которой хранится id пользователяsomeuservar. Если пришедшее в data.user = someuservar значит нам пора спросить AJAXом все объекты modUserMessage для нашего пользователя с статусом read = 0. Обернуть это в html и нарисовать где-то в интерфейсе.
Для его реализации нужно решить пару вопросов.
1. Как в modx поймать событие когда modUserMessage создан?
2. Если это не возможно, как грамотно изменить файлы ядра с классом modUserMessage, что бы при создании он инициировал кастомный event который мы ему напишем?
3. Не изобретаю ли я велосипед? Нет ли в ядре modx таких механизмов SSE (как те же Custom events и modRestService, которые можно начать реализовывать самому, не зная что они есть в ядре).
Попробую описать как пока видно реализацию подобного:
1. Срабатывает событие при создании объекта modUserMessage (вопрос номер 1), передав в событие объект сообщения.
2. Статичный php плагин который назначен на это событие начинает работу.
$eventName = $modx->event->name;
switch($eventName) {
case 'SomeEventResolvedInFirstQuestion':
if (!empty($options->message)) {
header("Cache-Control: no-cache");
header("Content-Type: text/event-stream");
echo "event: MessageNotification\n";
$curDate = date(DATE_ISO8601);
echo 'data: {"message_id":"' .$options->message->id .'" ,"user":"' . $options->message->recipient.'","time": "' . $curDate . '"}';
echo "\n\n";
ob_end_flush();
flush();
}
break;
}
if ( connection_aborted() ) break;
3. Клиент вешает listenerconst evtSource = new EventSource("path/to/plugin/static.php");
evtSource.onmessage = function(e) {
console.log("Сообщение: " + e.data);
};
В JS есть переменная в которой хранится id пользователяsomeuservar. Если пришедшее в data.user = someuservar значит нам пора спросить AJAXом все объекты modUserMessage для нашего пользователя с статусом read = 0. Обернуть это в html и нарисовать где-то в интерфейсе.