События 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,createdon');
        $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;
}
Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.