【问题标题】:What's the best way to implement recurring events in FullCalendar via PHP/MySQL?通过 PHP/MySQL 在 FullCalendar 中实现重复事件的最佳方法是什么?
【发布时间】:2011-10-02 11:47:30
【问题描述】:

我正准备在我的在线应用程序中使用 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
    }
]

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

必须有更好的方法......有人有自己的经验吗?

【问题讨论】:

  • 您如何将这些事件存储在您的数据库中?您可以根据日历上的操作对这些事件进行 ajax 加载,但与只传递一次较大的结果相比,调度许多 AJAX 调用可能会遭受更长的加载时间(与 gzip 数据传输相比,HTTP 握手非常慢)。您可以在“下个月”事件中仅选择相关日期并 ajax-load 新事件。
  • 那是我的担心...我不想用许多 AJAX 调用使服务器超载,但我也想避免在使用事件时用可能有数千个事件填充页面数组如上所示。我希望在某个地方有一些快乐的媒介。顺便说一句,事件基本上都存储在 MySQL 中……每个事件都只有一个开始日期、一个重复周期(每天、每周、每月等)和一个可选的结束日期。

标签: php jquery mysql fullcalendar


【解决方案1】:

FullCalender 默认使用lazyFetching 获取当前时间范围内的事件。通常,这意味着您只会在用户退出当前月份时发送 ajax 调用。您可以通过关闭缓存来减少服务器负载:

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

此外,您应该优化服务器上​​的 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

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

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

这样,您只需将适用于当前视图的内容发送回完整日历。

【讨论】:

  • 正是我希望的答案。谢谢 ghayes!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多