たちまちメモる

開発中に気になったことをメモしてます。

応急処置でFullCalendar v1をGoogleカレンダーAPI V3に対応して延命してみる。

あくまで動けばOK!というレベルの応急処置の話なので
この記事を真似しても動かないと言われても責任はとれません。

ちなみに修正してみたのはFullCalendarのver1.6.4で作ったGoogleカレンダーです。




動作サンプル
古いfullcalendarのGoogleカレンダー表示を修正してみる


FullCalendar v1 のGoogleカレンダー延命でやったこと

gcal.jsの書き換え

応急処置で書き換えたgcal.js
http://tachimachi.hmkt.me/141121_legacy_calendar_api_bugfix/dl/gcal.fix2014Nov.js
※元のコードと比較しやすいようにあえてファイルの名前を変えてます。




変更点まとめ

古いv1のgcal.jsとコード比較しながら記事を見てみるとわかりやすいです。

Windows環境向けですがコード比較ソフトはWinMergeとかおすすめ
WinMerge 日本語版


公開APIキー設定用の変数追加

変数の値は自分のGoogle公開APIキーに書き換えてください。

var YOUR_GOOGLE_API_KEY = '**************';

Google公開用APIキーの作り方は前回記事を参照。

ノーマークでXデー(Google Calendar API v2終了日)を迎えてしまった件。 - たちまちメモる

 


APIのURLをひっかける正規表現の変更
fc.sourceNormalizers.push(function(sourceOptions) {
  if (sourceOptions.dataType == 'gcal' ||
    sourceOptions.dataType === undefined &&
    (sourceOptions.url || '').match(/^(http|https):\/\/(www.google.com|www.googleapis.com)\/calendar\/(feed|v3)\//)) {
      sourceOptions.dataType = 'gcal';
      if (sourceOptions.editable === undefined) {
        sourceOptions.editable = false;
      }
    }
});

 


予定リストを取得する部分(関数 transformOptions)の書き換え

前回の記事の件でAPIにアクセスするURLやら戻り値が変わっていることが判明したので
ごっそり書き換えてます。

Ajaxの戻り値参考↓
Events - Google Calendar API — Google Developers

function transformOptions(sourceOptions, start, end) {

  var success = sourceOptions.success;
  var data = $.extend({}, sourceOptions.data || {}, {
    'start-min': formatDate(start, 'u'),
    'start-max': formatDate(end, 'u'),
    'singleevents': true,
    'max-results': 9999
  });
  
  var ctz = sourceOptions.currentTimezone;
  if (ctz) {
    data.ctz = ctz = ctz.replace(' ', '_');
  }
  console.log(sourceOptions.url + '?key='+ YOUR_GOOGLE_API_KEY +'&singleEvents=true');
  return $.extend({}, sourceOptions, {
    url: sourceOptions.url + '?key='+ YOUR_GOOGLE_API_KEY +'&singleEvents=true',
    dataType: 'jsonp',
    data: data,
    startParam: false,
    endParam: false,
    success: function(data) {
      var events = [];
      if (data.items) {
        $.each(data.items, function(i, entry) {
          if(entry.status == 'confirmed'){
            var startStr = (typeof(entry.start.date) != 'undefined') ? entry.start.date : entry.start.dateTime;
            var start = parseISO8601(startStr, true);
            var endStr = (typeof(entry.end.date) != 'undefined') ? entry.end.date : entry.end.dateTime;
            var end = parseISO8601(endStr, true);
            var allDay = startStr.indexOf('T') == -1;
            var url = entry.htmlLink;
            if (ctz) {
              url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
            }

            if (allDay) {
              addDays(end, -1); // make inclusive
            }
            events.push({
              id: entry.id,
              title: entry.summary,
              url: url,
              start: start,
              end: end,
              allDay: allDay,
              location:entry.location,
              description: entry.description
            });
          }
        });
      }
      var args = [events].concat(Array.prototype.slice.call(arguments, 1));
      var res = applyAll(success, this, args);
      if ($.isArray(res)) {
        return res;
      }
      return events;
    }
  });
  
}