通过PHP/MySQL在FullCalendar中实现重复事件的最佳方法是什么?

Mic*_*ael 4 php mysql jquery fullcalendar

我正准备在使用PHP/MySQL的在线应用程序中使用基于JQuery的FullCalendar,并注意到在实现重复事件时,必须在事件数组中为每次重复发生一个新项目(使用相同的ID),如下所示:

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
    }
]
Run Code Online (Sandbox Code Playgroud)

好的,这不是什么大不了的事.使用MySQL,我只会在事件循环中输入很多次,如果它没有结束日期,那么将来可能会从该事件的开始日期开始100次.但现在我正在用一堆甚至可能不需要的JavaScript加载页面(如果用户只打开日历看一个月).不酷.

必须有一个更好的方法......有没有人有自己的经验?

gha*_*yes 8

默认情况下,FullCalender将使用lazyFetching获取当前时间范围的事件.通常,这意味着您只能在用户切换当前月份时发送ajax调用.您可以通过关闭缓存来减少服务器负载:

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

此外,您应该优化服务器上​​的SQL以仅在给定时间范围内获取事件:

FullCalendar将确定它需要事件的日期范围,并将在GET参数中传递该信息....这是FullCalendar可能访问的URL:

/myfeed.php?start=1262332800&end=1265011200&_=1263178646

如果在SQL中使用这些get参数,则会大大减少发送给客户端所需的数据:

SELECT *
FROM events
WHERE start > PARAMS_START_DATE AND end < PARAMS_END_DATE
Run Code Online (Sandbox Code Playgroud)

显然,这在使用重复事件时不会那么简洁,例如(伪代码):

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
Run Code Online (Sandbox Code Playgroud)

这样,您只需发回适用于当前视图的完整日历即可.