2011-07-11 68 views
4

我準備在使用PHP/MySQL的在線應用程序中使用基於JQuery的FullCalendar,並注意到在執行週期性事件時,您必須爲每次重複(使用相同的ID)在事件數組中放置一個新項目,像這樣:通過PHP/MySQL在FullCalendar中實施週期性事件的最佳方式是什麼?

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加載頁面(如果用戶只是打開日曆查看一個月)。不酷。

必須有更好的方式......有沒有人有自己的經驗呢?

+0

你是如何在數據庫中存儲這些事件的?您可以根據日曆上的操作對這些事件進行ajax加載,但通過調度許多AJAX調用,您可能會承受更長的加載時間,而不是僅僅傳遞一次較大的結果(HTTP握手與gzip數據傳輸相比非常慢)。您可以在「下個月」事件中選擇僅相關日期和ajax加載新事件。 – ghayes

+0

這就是我的擔心......我不想用許多AJAX調用來重載服務器,但是我也想避免使用上面顯示的Events數組填充可能有成千上萬個事件的頁面。我希望在某個地方有一些快樂的媒介。順便說一下,這些事件基本上都存儲在MySQL中......每個人都有一個開始日期,一個重複(每日,每週,每月等)和一個可選結束日期。 – Michael

回答

8

FullCalender將默認使用lazyFetching獲取當前時間幀的事件。通常,這意味着只有當用戶切換當前月份時纔會發送ajax呼叫。您可以通過關閉緩存降低服務器負載:

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

此外,你應該優化你的SQL服務器上只獲取給定的時間內事件:

FullCalendar將確定日期範圍之需要事件並且將在GET參數中傳遞這些信息。 ......下面是FullCalendar可能會訪問一個網址:

/myfeed.php?start=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 

這樣,您只需發送回完整日曆,即可適用於當前視圖。

+0

正是我期待的答案。謝謝ghayes! – Michael

+0

2013年仍然是一個很好的答案... thx讓我走上正確的道路...... – mondjunge

相關問題