fullCalendar - календарь с большими возможностями

Этот календарь основан на той же javascript-библиотеке, что и myCalendar, но имеет более широкие возможности.

Основные возможности

  • Неограниченное количество календарей. Настройка и управление календарями находится в меню "Приложения".
  • Настраиваемое уведомление о наступающем событии на почту и на сайте.
  • Повторяющиеся события.
  • Личные события, просмотр которых другим пользователям можно отключить.
  • Пользовательские события.

Управление календарями

Для того, чтобы вывести события на сайте, нужно сначала создать календарь. Делается это в админке в меню Приложения->fullCalendar.
Тут же можно указать ряд настроек: цвет текста, цвет события, класс календаря.

Для Google календаря отмечаем соответствующий чекбокс и вводим название календаря, которое нужно получить в кабинете разработчиков Google. Как это сделать описано тут. Не забываем при этом про системную настройку, в которой указываем ключ Google Calendar API Key.

После того как календарь создан, можно вызывать сниппет. В параметре calendars через запятую указываем id календарей, события которых нужно вывести в календаре на сайте

// Выводить события календаря с id = 1 
[[!fullCalendar? &calendars=`1`]]

Термины

Чтобы не было путаницы определимся с названиями. Календарь, который выводится на сайте в виде HTML таблицы, будем называть просто календарём. А календарь, который создается в админке, будет календарь-объект.

В календаре можно показывать события как одного календаря-объекта, так и нескольких. Для этого в параметре calendars через запятую нужно указать id необходимых календарей-объектов, как обычных так и гугл календарей. Соответственно, при создании события в диалоге можно выбрать календарь-объект, для которого создаётся данное событие.

Также возможно вообще не указывать календарь-объект при вызове сниппета, а использовать для подгрузки событий плагин, в котором определять свои события, не привязанные к календарю-объекту. Например, в нём можно формировать события из ресурсов. Правда в этом режиме будет не доступно редактирование событий.

На странице сниппет fullCalendar можно вызывать несколько раз. В этом случае каждому такому вызову нужно давать уникальное название, которое указывается в параметре instance. Для одного календаря instance можно не указывать.

[[!fullCalendar? &instance=`calendar1` &calendars=`1`]]
[[!fullCalendar? &instance=`calendar2` &calendars=`2,3`]]

Уведомления

Функционал уведомлений состоит из 2 частей: онлайн уведомления и уведомления по почте. За онлайн уведомления отвечает плагин. Поэтому, на какой бы страничке сайта вы не находились, плагин сообщит о наступлении события всплывающим окошком, а также продублирует уведомление на почту по следующей логике:

  • — если у события есть автор, то уведомляем его,
  • — если автора нет (аноним), то уведомляем текущего авторизованного пользователя,
  • — если текущий пользователь не авторизован, то отбой.

Для управления уведомлениями есть 2 системные настройки:

  • Онлайн-уведомления — включает/отключает уведомление на сайте.
  • Уведомления по почте — включает/отключает уведомление по почте.

Такие события имеют css-класс notified-event для дополнительной настройки. В календаре они помечаются иконкой будильника (см. картинку ниже).

Есть еще скрипт для cron'а, который можно запускать по расписанию. Находится он в папке core/components/fullcalendar/cron/notify.php. Сейчас он работает, чтобы оповещать о событиях, которые произойдут в текущий день. Запускать его можно в полночь. Алгоритм можно прописать любой. Думаю, программисту это не составит труда.

Создание и изменение событий

Создать событие можно 5-ю способами:

  • кликнуть на ячейке календаря;
  • выделить диапазон ячеек;
  • кликнуть на кнопку + в шапке календаря (если выведена);
  • кликнуть на кнопку создания события, выведенную сниппетом fcCreateEvent.
  • перетащить HTML элемент события в календарь (если используются внешние события).

Откроется диалог создания события.

В зависимости от текущего вида календаря определяются некоторые поля в диалоге. Например, если текущий вид календаря "Месяц", то в диалоге устанавливается чекбокс "Целый день", а поля со временем дизейблятся. Такое событие будет отображаться в блоке "Весь день" в верхней части календаря, при условии, что этот блок не отключён. Если кликнуть на ячейку в текущем виде "Неделя" или "День", то автоматически определятся даты и время начала и окончания события. За начало берутся данные из ячейки, а окончание определяется согласно параметру defaultDuration, в котором указывается длительность события по-умолчанию. Минимальная длительность события 30 мин.

Также создать событие можно выделив диапазон ячеек. В этом случае даты определятся по границам выделения.

Если у текущего календаря указано несколько календарей-объектов в параметре calendars, то в диалоге можно выбрать, к какому календарю-объекту будет относится создаваемое событие. Если нужно выделить событие другим цветом, то выбрать его можно кликнув на квадрат справа от заголовка. Если цвет не указать, то событие будет окрашено в цвет, указанный у календаря-объекта.

Обязательными полями являются "Заголовок", "Календарь" и дата начала. Остальные поля заполняются по желанию.

Если вы хотите использовать теги HTML в описании события, то нужно создать системную настройку fullcalendar.allowed_tags и в ней указать разрешённые теги в формате функции strip_tags() .

Личные события

Если пользователь авторизован, то он может пометить данное событие как личное. Такие события при вызове календаря с параметром showPrivate=`0` посторонним пользователям отображаться не будут. Но даже если разрешить выводить в календаре личные сообщения (showPrivate=`1`), то редактировать их сможет только сам автор и админ, авторизованный в бэкэнде. Для неавторизованных пользователей чекбокс "Личное" недоступен. Таким образом, для разных пользователей в одном и том же календаре будут отображаться разные события.

Таким событиям добавляется класс private-event.

Уведомление

При необходимости можно включить режим уведомления и указать за сколько нужно это уведомление выполнить. Тут надо отметить, что уведомление сработает, если пользователь находится на сайте вне зависимости от того, на какой странице он находится (при условии, что уведомления включены). Чтобы уведомления работали и для пользователей вне сайта, нужно самостоятельно настроить скрипт для cron, описанный выше.

Повторяющиеся события

Если событие должно повторяться с определённой периодичностью, то нужно отметить соответствующий чекбокс и выбрать нужный период повторения. Доступные варианты — повтор каждый день, каждую неделю, каждый месяц, каждый год. Также можно указать предел, после которого событие повторяться не будет. Отличить повторяющиеся события от обычных можно по значку цикла.

Повторяющиеся события также имеют свой класс repeated-event, который можно менять в своем файле стилей.

Удаление событий

Удалить событие можно двумя способами. Первый способ - это нажать крестик в верхнем правом углу события. Удаляется оно после подтверждения. Второй способ - нажать кнопку "Удалить" в диалоге редактирования события.

Перетаскиваемые события

Перетаскиваемые (drag-n-drop) события представляют собой HTML блоки, которые можно перетаскивать в календарь. При этом в календаре создаются соответствующие события. Подробное описание можно найти тут.

Список событий

События можно выводить отдельным списком. Выводить события можно или на конкретную дату, или ограничить периодом. За это отвечает отдельный сниппет fcGetEvents. Списков на странице можно выводить сколько угодно. Если редактирование в списке разрешено (readOnly=`0`), то события можно изменять и удалять. Сами списки обновляемые. Т.е. если событие добавлено кнопкой "Добавить событие" или в календаре, который находится на этой же странице, то оно появится и в списке. Подробнее можно прочитать в документации.

Права на операции с событиями

Чтобы иметь возможность создавать, изменять и удалять события, календарь должен быть в режиме редактирования. Для этого параметр readOnly должен быть выставлен в 0. Также можно запретить незарегистрированным пользователям любые операции с событиями кроме просмотра. Для этого нужно указать параметр allowGuestEdit=`0`.

События javascript

В дополнении fullCalandar есть 8 яваскрипт событий, которые отвечают за интерактив:

  • fc_event_saved
  • fc_event_removed
  • fc_event_click
  • fc_event_resize
  • fc_event_receive_error
  • fc_event_receive_success
  • fc_event_notify
  • fc_event_render
  • fc_event_after_render
  • fc_calendar_after_render
Первые два события срабатывают после сохранения и удаления события календаря соответственно. Использовать их можно для выполнения каких-то своих задач. Для этого нужно повесить соответствующий обработчик в своём файле скрипта. В обработчике доступен объект события.

$(document).on('fc_event_saved', function(event, object) {
    # object - это объект события календаря
    alert('Событие ' + object.title + ' сохранено.');
});

Событие fc_event_click срабатывает при клике на событие календаря. В обработчике этого яваскрипт события можно переопределить поведение календаря. Например, заменить стандартный диалог редактирования на свой или вообще его отменить.

$(document).on('fc_event_click', function(e, event, view) {
    # event - это объект события календаря
    console.log(event);
    // Отмена стандартного диалога
    event.preventClick = true;
    // api для собственной реализации редактирования события
});

Событие fc_event_resize срабатывает при ресайзе события. В обработчике можно отменить это действие.

$(document).on('fc_event_resize', function(e, event, delta) {
    # event - это объект события календаря, delta - объект 
    // Отмена стандартного поведения
    event.preventResize = true;
});

События fc_event_receive_error и fc_event_receive_success относятся к перетаскиваемым событиям. Первое срабатывает в случае ошибки при перетаскивании. Второе — в случае успешного результата. Кстати, добавление можно отменить:

$(document).on('fc_event_receive_success', function (e, event) {
    # e - javascript event, event - это объект события календаря
    $('#'+event.instance).fullCalendar('removeEvents', event._id); // Удаляем событие только из разметки (его ещё нет в базе)
    e.stopImmediatePropagation(); // Отменяем выполнение других javascript событий
    alert('По вторникам добавлять события нельзя.');
});

А вот пример, как можно вывести диалог при дропе события на календарь:

<script>
    $(document).on('fc_event_receive_success', function (e, event) {
        // e - javascript event, event - это объект события календаря
        fullCalendar.openDialog(event).done(function(event){ console.log(event); }).fail(function(error){ alert(error); });
    });
</script>

Диалог вызывается методом opeDialog() объекта fullCalendar. Причём возвращает он промис (promise). Поэтому у него доступны 2 метода:

  • done() — регистрирует функцию, которая выполнится в случае успеха. В нём доступен javascript объект события.
  • fail() — регистрирует функцию, которая будет выполнена в случае ошибки от сервера или при нажатии кнопки "Закрыть" диалога события.

Событие fc_event_notify срабатывает, когда есть уведомление. В обработчике можно изменить полученное уведомление или вообще отменить его вывод.

Событие fc_event_render пригодится, если нужно изменить процесс отображения через jQuery метод css(). В обработчик передаются 3 агрумента - event, element и view. Event — это объект событие календаря. Element — это jQuery объект, который используется для отображения события в календаре. View — это объект текущего вида.

Событие fc_event_after_render срабатывает сразу после того, как событие отображено в календаре. Это событие можно использовать для управления всплывающей подсказкой qTip2. Можно переинициализировать подсказки со своими настройками.

<script>
    $(document).on('fc_event_after_render', function (jsEvent, event, element, view) {
        // Переопределение подсказки
        element.qtip({
            overwrite: true,
            content: {
                title: event.calendarName,
                text: event.description
            },
            position: {
                my: 'bottom center',
                at: 'top center',
                target: element
            },
            show: {
                delay:200,
                target: element,
                solo: true
            },
            style: {
                classes: 'qtip-bootstrap'
            }
        });
</script>

Можно переопределить только определённые свойства подсказки

<script>
    $(document).on('fc_event_after_render', function (jsEvent, event, element, view) {
        // Переопределение заголовка подсказки    
        element.qtip('option', 'content.title', 'Новый заголовок');
        // Переопределение текста подсказки    
        element.qtip('option', 'content.text', 'Новый текст');
    });
</script>

Событие fc_calendar_after_render срабатывает, когда все события отрендерены. В обработчике доступны агрументы instance и view.

Использовать эти методы не обязательно. Они пригодятся, если нужно выполнить дополнительные действия.

Серверные события MODX

fullCalendar добавляет события для плагинов MODX, благодаря которым открываются большие возможности по управлению событиями календаря:

  • fcOnGetEvent — срабатывает при открытии диалога при клике на событие. Можно переопределить значения полей события.
  • fcOnGetEventList — срабатывает после формирования списка событий. Даёт возможность отредактировать текущий список событый или сформировать новый список пользовательских событий перед выводом в календарь.
  • fcOnGetNotifications — срабатывает при проверке событий, о который нужно уведомить. Позволяет изменить или заново сформировать уведомления.
  • fcOnSaveEvent — срабатывает непосредственно перед сохранением события календаря. Позволяет отменить сохранение.
  • fcOnRemoveEvent — срабатывает перед удалением события календаря. Возможно отменить удаление.

Примеры этих событий в плагинах можно посмотреть в описании событий.

Системные настройки

Ключ По-умолчанию Описание
fullcalendar.allowed_tags Разрешённые теги в описании события в формате функции strip_tags(). Если данное настройки нет, то создайте её самостоятельно.
fullcalendar.assets_url {assets_url}components/fullcalendar/ Url к файлам стилей и скриптов календаря.
fullcalendar.date_format '%d.%m.%Y' Формат даты для вывода в диалоге события. Доступные значения можно посмотреть тут.
fullcalendar.default_css default.css Основной файл стилей календаря. Можно указать свой или оставить пустым. Тогда загружать стили нужно самостоятельно.
fullcalendar.default_js default.js Основной файл скриптов календаря. Можно указать свой или оставить пустым. Тогда загружать скрипты нужно самостоятельно..
fullcalendar.email_notification true Включает уведомление зарегистрированного пользователя о событии по почте.
fullcalendar.google_calendar_api_key API ключ Google календаря.
fullcalendar.load_jquery true Разрешает загрузку библиотеки jQuery.
fullcalendar.load_jquery_ui true Разрешает загрузку библиотеки jQuery UI.
fullcalendar.notify_freq 60 Частота уведомлений в секундах.
fullcalendar.online_notification true Включает уведомление о событии на сайте.
fullcalendar.time_format '%H:%M' Формат времени для вывода в диалоге события.
Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.