2011-07-11 7 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日のように、終了日を持たない場合は、ループを複数回繰り返します。しかし今、私は、(ユーザーが1カ月を見るためにカレンダーを開いただけで)必要のないJavaScriptをたくさん載せています。クールではありません。

もっと良い方法があるはずです...誰もこれについて自分の経験を持っていますか?

+0

どのようにこれらのイベントをデータベースに保存していますか?カレンダーのアクションに基づいてこれらのイベントをajaxロードすることはできますが、大規模な結果を1回だけ渡す(HTTPハンドシェイクはgzipデータ転送に比べて非常に遅い)よりも多くのAJAX呼び出しを送出することにより、ロード時間が長くなる可能性があります。関連する日付のみを選択し、「次の月」のイベントで新しいイベントをajax-loadすることができます。 – ghayes

+0

それは私の心配でした...私は多くのAJAX呼び出しでサーバーを過負荷にしたくないのですが、上記のイベント配列を使用した場合、何千ものイベントになる可能性があるページを埋めることも避けたかったのです。どこかに幸せな媒体があることを期待していました。ちなみに、イベントは基本的にMySQLに格納されています...それぞれには開始日、繰り返し(毎日、毎週、毎月など)、オプションの終了日があります。 – Michael

答えて

8

FullCalenderは、デフォルトでlazyFetchingを使用して現在のタイムフレームのイベントを取得します。一般的に、これは、ユーザーが現在の月を切り替えるときにのみajaxコールを送信することを意味します。あなただけの特定の時間枠内のイベントを取得するために、サーバー上のSQLを最適化する必要があり、また、

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

:あなたはキャッシュをオフにすることで、サーバーの負荷を軽減することができます

FullCalendarは、日付範囲を決定することその情報をGETパラメータに渡して渡します。あなたはこれらがあなたのSQLのパラメータを取得使用する場合は、「、

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

:...ここでFullCalendarが訪れるかもしれないURLです大幅にデータを削減するでしょう、あなたはクライアントに送信する必要があります。定期的なイベントを使用している場合は明らか

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年の素晴らしい答え...正しい道で私を得るための... – mondjunge

関連する問題