modUserMessage плагин на событие

Добрый день сообщество. Есть идея попробовать реализовать сообщения для пользователей бэкенда на фронтенде. Для этого хочется попробовать использовать SSE (Server-sent events).

Для его реализации нужно решить пару вопросов.

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. Клиент вешает listener

const 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 и нарисовать где-то в интерфейсе.
Vladimir Alekhin
21 декабря 2020, 14:40
modx.pro
149
0

Комментарии: 0

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0