События MODX
fcOnGetEventList
Событие срабатывает после формирования списка событий. Даёт возможность отредактировать текущий список событый или сформировать новый список пользовательских событий перед выводом в календарь.
В плагине доступен объект $calendar
с методами getEvents()
и setEvents(array)
. Метод getEvents()
получает массив событий. Метод getEvents(array)
сохраняет новый список событий, указанный в переданном массиве.
1. Пример плагина, добавляющего пользовательское событие к списку событий.
switch ($modx->event->name) { case 'fcOnGetEventList': // Зачитываем массив событий $events = $calendar->getEvents(); $start = 'today 13:00'; // Варианты: strtotime('today 13:00') или date('Y-m-d H:i', strtotime('today 13:00')) $end = 'today 15:00'; // Допустимые форматы описаны в документации (http://php.net/manual/ru/datetime.formats.relative.php) // Добавляем свое событие $events[] = array( 'title' => 'Пользовательское событие', 'description' => 'Описание пользовательского события', 'start' => $start, 'end' => $end, 'allDay' => false, // Длится не целый день 'color' => '#000000', // Цвет события 'private' => false, // Событие не личное 'user' => 2, // Автор события 'google' => false, // Не гугл 'className' => 'dark-theme' // 'dakr-theme' - для темного фона, 'light-theme' - для светлого. Можно указывать любой свой класс. ); // Сохраняем измененный массив событий $calendar->setEvents($events); break; }
В календаре в ячейке текущего дня должно появится пользовательское событие из плагина.
У объекта $calendar
есть метод getConfig()
, позволяющий получить некоторые параметры календаря. Например, можно узнать инстанс календаря, для которого формируется список.
Это может пригодится, если на странице вызывается несколько сниппетов календаря, а добавить событие нужно только в определённый. Для этого нужно выполнить проверку экземпляра календаря, указанного в параметре instance.
... if ($calendar->getConfig('instance') == 'my_instance_calendar') { //Добавляем событие } ...
Можно выполнять действия в зависимости от вида календаря.
... // Добавляем событие только для календаря в режиме дня if ($calendar->getConfig('view') == 'agendaDay') { .... } ...
Параметры конфига, доступные в методе $calendar->getConfig()
:
- instance — инстанс календаря для текущего списка событий.
- view — вид календаря - месяц, неделя, месяц (month, agendaWeek, agendaDay)
- defaultDuration — длительность события по-умолчанию.
- eventOverlap — разрешает событиям пересекаться. Работает только для неповторяющихся событий.
- dateFormat — формат даты. Используется при формировании списка событий для вывода событий в виде списка.
- timeFormat — формат времени. Используется при формировании списка событий для вывода событий в виде списка.
2. Пример плагина, который формируется календарь публикаций ресурсов, автором которых является текущий пользователь.
switch ($modx->event->name) { case 'fcOnGetEventList': $events = $resources = array(); $query = $modx->newQuery('modResource'); $query->select('pagetitle, description,publishedon,createdby'); $query->where(array('deleted'=>0, 'published'=>1, 'createdby'=>$modx->user->id)); if ($query->prepare() && $query->stmt->execute()) { $resources = $query->stmt->fetchAll(PDO::FETCH_ASSOC); } foreach($resources as $resource) { $end = date('Y-m-d H:i', $resource['publishedon']) . ' +5 hour'; $events[] = array( 'title' => html_entity_decode($resource['pagetitle']), 'description' => $resource['description'], 'start' => date('Y-m-d H:i', $resource['publishedon']), // можно просто $resource['publishedon']) 'end' => strtotime($end), // можно в UNIX формате 'allDay' => false, 'color' => '#C00000', 'private' => true, 'user' => $resource['createdby'], 'google' => false, 'className' => 'dark-theme', ); } $calendar->setEvents($events); break; }
fcOnGetNotifications
Событие срабатывает при формировании списка событий, о которых нужно уведомить. Оно позволяет изменить или заново сформировать уведомления. Как и в событии fcOnGetEventList, в плагине доступен объект $calendar
. Уведомления сработают для всех событий, указанных в методе setEvents(array)
. Т.е. указанный массив - это список событий, о которых нужно уведомить. Для каждого события можно определить свой способ уведомлений (на сайте или по почте) и свой шаблон уведомлений для того и для другого способа.
Доступные переменные:
- $calendar — объект календаря.
- $resource — id текущего ресурса, который просматривает пользователь.
- $date — текущая дата клиента с учётом временного пояса пользователя.
Пример плагина, который выводит уведомление, если пользователь находится на определённом ресурсе.
switch ($modx->event->name) { case 'fcOnGetNotifications': if ($resource == 100)) { $events = array(); // Базовые уведомления не учитываем. Формируем новый список уведомлений. $events[] = array( 'title' => 'Пробное уведомление', 'field' => '', // Можно указывать собственные поля, которые потом можно использовать в своём чанке уведомления. 'start' => '2016-07-09 20:00:00', 'user' => 1, // Пользователь для уведомления по почте. В данном примере не пригодится, т.к. email уведомления отключены. // Настройка уведомлений для этого события. Переопределяет системные настройки. 'onlineNotification' => true, // Включаем уведомление на сайте. 'emailNotification' => false, // Отключаем email уведомление. 'tplNotification' => 'myNotificationChunk', // Название чанка для уведомлений на сайте. Можно указывать @INLINE. 'tplEmailNotification' => "@INLINE <h2>Уведомление</h2>\n <p>Вы получили уведомление о событии.</p>", // Чанк для уведомлений по почте. ); $calendar->setEvents($events); } break; }
Для всех событий, указанных в массиве $events
, будут выведены уведомления согласно настройкам.
Пример альтернативного использования
Можно раз в 5/10 минут выводить пользователю какое-нибудь сообщение. Пишем в этом плагине куку со сроком истечения 5 минут и проверяем — истекло, выводим сообщение.
fcOnGetEvent
Это событие срабатывает при открытии диалога события. Позволяет переопределить значения полей события. Переменные, доступные в плагине:
- $event — объект события с доступными свойствами id, title, description, calendar, start_date, start_time, end_date, end_time, allDay, private, notify, notify_before, repeated, editable.
- $config — массив настроек. Значения настроек описаны выше.
- $mode — действие над событием:
- new — создание нового события:
- edit — изменение события;
- view — для пользовательских событий и событий, запрещённых для редактирования.
Пример плагина, который изменяет данные события перед выводом его в диалоге.
switch ($modx->event->name) { case 'fcOnGetEvent': $event->title = 'Новый заголовок'; $event->description = 'Новое описание', $event->start_date = "01.05.2016"; $event->start_time = "10:00"; $event->end_date = "01.05.2016"; $event->end_time = "20:00"; if ($config['instance'] != 'my_instance') { // Для определенного календаря запрещаем редактировать событие $event->editable = false; } // Переопределяем шаблон диалога $event->tpl = "myDialogChunk"; // Имя чанка или @INLINE шаблон. break; }
При необходимости можно отменить открытие диалога - $modx->event->output('Вызов диалога запрещён!');
fcOnSaveEvent
Это событие срабатывает непосредственно перед сохранением события календаря. В плагине доступны следующие переменные:
- $event — объект события с доступными свойствами id, title, description, calendar, start, end, allDay, private, notify, repeated, external.
- $config — массив настроек. Значения настроек описаны выше.
- $mode — действие над событием:
- new — создание нового события:
- edit — изменение события;
- move — перемещение события;
- resize — ресайз события (мышкой).
Сохранение можно отменить.
switch ($modx->event->name) { case 'fcOnSaveEvent': if (!$modx->user->isMember('GreatPeople')) { // Отменяем сохранение $modx->event->output('Редактирование разрешено только избранным!'); } else { // Меняем календарь у события $event->calendar = 2; } break; }
Можно проверить, является ли событие перетаскиваемым через $event->draggable
.
fcOnRemoveEvent
Срабатывает перед удалением события календаря. В плагине доступен объект $event
и массив настроек $config
. Возможно отменить удаление.
switch ($modx->event->name) { case 'fcOnGetEvent': if ($config['instance'] != 'my_instance') { // Отменяем удаление $modx->event->output('Из этого календаря запрещено удалять события!'); } break; }