Какой лучший способ реализовать повторяющиеся события в FullCalendar через PHP / MySQL? - PullRequest
4 голосов
/ 11 июля 2011

Я готовлюсь использовать FullCalendar на основе JQuery в своем онлайн-приложении с использованием PHP / MySQL и заметил, что при реализации повторяющихся событий вы должны помещать новый элемент в массив событий для каждого повторения (используя тот же идентификатор) , вот так:

events: [
    {
        id: 999,
        title: 'Repeating Event',
        start: new Date(y, m, d-1, 16, 0),
        allDay: false
    },
    {
        id: 999,
        title: 'Repeating Event',
        start: new Date(y, m, d+6, 16, 0),
        allDay: false
    },
    {
        id: 999,
        title: 'Repeating Event',
        start: new Date(y, m, d+13, 16, 0),
        allDay: false
    }
]

Хорошо, так что это не имеет большого значения. Используя MySQL, я просто передам событие, зацикленное несколько раз, например, 100 в будущем с даты начала этого события, если оно не имеет даты окончания. Но теперь я загружаю страницу с кучей JavaScript, который может даже не понадобиться (если пользователь просто открывает календарь, чтобы увидеть один месяц). Не круто.

Должен быть лучший способ ... У кого-нибудь есть собственный опыт с этим?

1 Ответ

8 голосов
/ 11 июля 2011

FullCalender по умолчанию извлекает события для текущего таймфрейма, используя lazyFetching. Как правило, это означает, что вы отправляете вызов ajax только тогда, когда пользователь выключает текущий месяц. Вы можете уменьшить нагрузку на сервер, отключив кеширование:

$('#calendar').fullCalendar({
    events: {
    url: '/myfeed.php',
    cache: true
  }
});

Кроме того, вам следует оптимизировать SQL на сервере, чтобы получать события только в течение определенного периода времени:

FullCalendar определит диапазон дат, для которого ему нужны события, и передаст эту информацию в параметрах GET. ... Вот URL, который может посетить FullCalendar:

/ myfeed.php? Начать = 1262332800 & конец = 1265011200 & _ = 1263178646

Если вы используете эти параметры получения в своем SQL, вы значительно сократите объем данных, которые нужно отправить клиенту:

SELECT *
FROM events
WHERE start > PARAMS_START_DATE AND end < PARAMS_END_DATE

Очевидно, что при использовании повторяющихся событий это будет не так кратко, например, вы можете (в псевдокоде):

recurring_events.each do |recurring_event|
  running_date = recurring_event.starts_on
  while running_date < PARAMS_END_DATE
    if running_date > PARAMS_START_DATE
      events.push { :event => event.id, :date => running.date, ... }
    end
    running_date = running_date + recurring_event.frequency_as_days
  end
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...