SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend FrameworkでGoogleアプリケーションを使い倒す

PHPアプリケーションからGoogle Calendarを利用しよう(後編)

Zend FrameworkでGoogleアプリケーションを使い倒す(3)

  • X ポスト
  • このエントリーをはてなブックマークに追加

カレンダーイベントの取得

 以下、イベントの取得部分にかかわるサンプルコードです。

[リスト2]index.php(抜粋)
// カレンダーリストごとに処理
foreach ($listFeed as $list) {

    // カレンダーリストのidの取得
    $listId = $list->id;
    // カレンダーのユーザー名取得
    $user = substr($listId, strrpos($listId, "/") + 1);

    // クエリにパラメータ設定【 1 】
    $query = $serviceCal->newEventQuery();
    $query->setUser($user);
    $query->setVisibility('private');
    $query->setProjection('full');
    $query->setOrderby('starttime');
    $query->setSortorder('descend');

    // イベントフィードの取得【 2 】
    try {
        $eventFeed = $serviceCal->getCalendarEventFeed($query);
        print $eventFeed->getEditLink();
    } catch (Zend_Gdata_App_Exception $e) {
        echo "エラー: " . $e->getMessage();
    }

    // 取得したイベントの数だけループ
    foreach ($eventFeed as $event) {
        // 一つのイベントフィードから必要な情報を取得【 3 】
        $date = date('Y/m/d', strtotime($event->when[0]->startTime));
        $startTime = date('H:i:s', strtotime($event->when[0]->startTime));
        $endTime = date('H:i:s', strtotime($event->when[0]->endTime));
        $title = $event->title;
        $eventId = $event->id;
        $author = $event->content;

        // htmlテーブルに取得した情報を表示
        echo "<form method='POST'>";
        echo "<tr>";
        echo "<td>" . $date . "</td>";
        echo "<td>" . $startTime . "</td>";
        echo "<td>" . $endTime . "</td>";
        echo "<td>" . $title . "</td>";
        echo "<td>" . $author . "</td>";
        echo "<td><button type='submit' name='updateEvent'>編集</button></td>";
        echo "<td><button type='submit' name='deleteEvent'>削除</button></td>";
        echo "</tr>";
        echo "<input type='hidden' name='targetEventId' value='" . $eventId . "'>";
        echo "<input type='hidden' name='targetTitle' value='" . $title . "'>";
        echo "</form>";
    }
    echo "</table>";
    echo "<br />";
    echo "<br />";

}

クエリにパラメータ設定【 1 】

 カレンダーイベントを取得するために、Zend_Gdata_EventQueryオブジェクトを作成します。これは欲しいイベントを要求するためのクエリURLを作成するためのオブジェクトです。

[リスト3]index.php(抜粋)
// クエリにパラメータ設定【 1 】
$query = $serviceCal->newEventQuery();
$query->setUser($user);
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$query->setSortorder('descend');

 上記パラメータをセットすることで次のようなURLが生成されます。これは「$query->getQueryUrl()」を実行することで確認できます。

[リスト4]生成されるURL
http://www.google.com/calendar/feeds/【$user】/private/full?orderby=starttime&sortorder=descend

 上記ユーザー部分($user)ですが、ここでカレンダーリストを識別するための文字列が入ります。これはブラウザからアクセスするGoogleカレンダーサービスの画面では「カレンダーID」として確認できます。Googleカレンダーにアクセスし、[マイカレンダーの下部にある設定リンク]-[各カレンダー名のリンク]-[カレンダーのアドレス欄]で確認できます)。

 通常は'default'を指定することで現在ログインしているユーザーのカレンダーリストを指定しますが、今回のサンプルでは複数のカレンダーリストを扱っているため、カレンダーリストの識別が必要になります。$userにあたる文字列はカレンダーリストのidから抽出しています。

[リスト5]index.php(抜粋)
// カレンダーリストのidの取得
$listId = $list->id;
// カレンダーのユーザー名取得
$user = substr($listId, strrpos($listId, "/") + 1);

 $listIdには「http://www.google.com/calendar/feeds/default/【カレンダーを識別するID】」が入っています。カレンダーを識別する名前を抽出するためにこの文字列の最後の「/」の位置を特定し、それ以降を文字列として切り出して$userに格納しています。

 クエリはZend_Gdata_Queryオブジェクトとして表され、そのサブクラスを使用することでさまざまな要求を行うことができます。上記含め主なクエリパラメータを紹介します。

クエリパラメータを設定するメソッド
クエリパラメータ 内容 引数 設定内容
setFutureevents 未来のイベントのみ表示するか true 未来のみ表示
false(デフォルト値) 過去も表示
setOrderby フィードの並び順 starttime フィードの開始日時順
lastmodified(デフォルト値) 更新順
setProjection 取得したいデータの種類や量 full すべて
basic メタデータ情報を各イベントのcontentフィールドの可読形式で格納
composite fullとほとんど同じだがコメント情報も含める
setQuery 指定した文字列を含むイベントを取得 文字列
setSortorder フィードのソート順 descend(デフォルト値) 日付の新しい順
ascend 日付の古い順
setStartMax 指定した日付を除きこれより古いイベントを取得 日付
setStartMin 指定した日時を含めこれより新しいイベントを取得 日付
setUser どのユーザーのカレンダーを検索するか defaul(デフォルト値) 現在ログインしているユーザー
ユーザー名 その指定したユーザー
setVisibility カレンダーの種類 public 公開カレンダー
private 非公開カレンダー

 クエリパラメータにはこれ以外にもGoogleカレンダーに特化したパラメータや、全サービスで共通のパラメータなどさまざまあります。

イベントフィードの取得【 2 】

 Zend_Gdata_CalenderオブジェクトのgetCalendarEventFeedメソッドの引数に、先ほどのクエリオブジェクトを与えることで、イベントフィードであるZend_Gdata_Calendar_EventFeedオブジェクトを取得できます。

[リスト6]index.php(抜粋)
try {
    $eventFeed = $serviceCal->getCalendarEventFeed($query);
    print $eventFeed->getEditLink();
} catch (Zend_Gdata_App_Exception $e) {
    echo "エラー: " . $e->getMessage();
}

 getCalendarEventFeedメソッドの引数にはEventQueryオブジェクトでなく、それによって生成されるURLにあたる文字列を引数として与えても構いません。

 EventFeedオブジェクトに格納されるデータはブラウザでクエリURLを入力することでXMLファイルとして確認できます。

[リスト7]取得したイベントフィード(抜粋)
<feed>
  <id>http://www.google.com/calendar/feeds/default/private/full</id>
  <updated>2009-02-13T14:21:06.000Z</updated>
  <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
  <title type="text">【Googleのアカウント】</title>
  <subtitle type="text">【Googleのアカウント】</subtitle>
  <link rel="alternate" type="text/html" href="http://www.google.com/calendar/embed?src=【Googleのアカウント】"/>
  <link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/private/full"/>
  <link rel="http://schemas.google.com/g/2005#batch" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/private/full/batch"/>
  <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/private/full?max-results=25&sortorder=descend&orderby=starttime"/>
  <author>
    <name>【Googleに登録したユーザー名】</name>
    <email>【Googleのアカウント】</email>
  </author>
  <generator version="1.0" uri="http://www.google.com/calendar">Google Calendar</generator>
  <openSearch:totalResults>5</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>25</openSearch:itemsPerPage>
  <gCal:timezone value="Asia/Tokyo"/>
  <gCal:timesCleaned value="0"/>
  <entry>
    <id>http://www.google.com/calendar/feeds/default/private/full/【ID】</id>
    <published>2009-02-13T14:18:16.000Z</published>
    <updated>2009-02-13T14:18:16.000Z</updated>
    <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/g/2005#event"/>
    <title type="text">ネットワーク勉強会</title>
    <content type="text">小林</content>
    <link rel="alternate" type="text/html" href="http://www.google.com/calendar/event?eid=【イベントID】" title="alternate"/>
    <link rel="self" type="application/atom+xml" href="http://www.google.com/calendar/feeds/default/private/full/【ID】"/>
    <author>
      <name>【Googleに登録したユーザー名】</name>
      <email>【Googleのアカウント】</email>
    </author>
    <gd:comments>
      <gd:feedLink href="http://www.google.com/calendar/feeds/default/private/full/【ID】/comments"/>
    </gd:comments>
    <gd:eventStatus value="http://schemas.google.com/g/2005#event.confirmed"/>
    <gd:visibility value="http://schemas.google.com/g/2005#event.default"/>
    <gd:transparency value="http://schemas.google.com/g/2005#event.opaque"/>
    <gCal:uid value="【ID】@google.com"/>
    <gCal:sequence value="0"/>
    <gd:when startTime="2009-02-13T16:00:00.000+09:00" endTime="2009-02-13T17:00:00.000+09:00">
      <gd:reminder minutes="10" method="email"/>
      <gd:reminder minutes="10" method="alert"/>
    </gd:when>
    <gd:who rel="http://schemas.google.com/g/2005#event.organizer" valueString="【Googleに登録したユーザー名】" email="【Googleのアカウント】"/>
    <gd:where valueString=""/>
  </entry>

  (entryタブの繰り返し)

</feed>

一つのイベントフィードから必要な情報を取得【 3 】

 取得したイベントフィードの一つのエントリから必要となる情報を取得します。今回はイベントの対象日、開始時間、終了時間、タイトル、イベントのID、登録者(Googleカレンダーサービス上は詳細欄ですが、今回はここをイベント登録者として使用します)を取得します。

 イベントフィードであるZend_Gdata_Calendar_EventFeedオブジェクトにはイベントであるZend_Gdata_Calendar_Eventオブジェクトが配列として格納されていますので、一つ一つforeach文にて取得します。

[リスト8]index.php(抜粋)
// 取得したイベントの数だけループ
foreach ($eventFeed as $event) {
    // 一つのイベントフィードから必要な情報を取得【 3 】
    $date = date('Y/m/d', strtotime($event->when[0]->startTime));
    $startTime = date('H:i:s', strtotime($event->when[0]->startTime));
    $endTime = date('H:i:s', strtotime($event->when[0]->endTime));
    $title = $event->title;
    $eventId = $event->id;
    $author = $event->content;

    // htmlテーブルに取得した情報を表示
    (略)
    }

 各イベントであるZend_Gdata_Calendar_Eventオブジェクトには、そのイベントの多数の情報が格納されています。「イベントオブジェクト->プロパティ」で指定することで次のような情報を取得できます。

Zend_Gdata_Calendar_Eventオブジェクトのプロパティ
プロパティ 内容
author 登録者
content 詳細
id イベントのID
title タイトル。必須項目
visibility 公開か非公開か
when 期間。必須項目
where 場所

 また、whenプロパティについてはさらにサブプロパティがあります。

whenプロパティのサブプロパティ
プロパティ 内容
startTime RFC3339形式で指定する開始時刻
endTime RFC3339形式で指定する終了時刻
valueString 文字列で指定する期間("This Afternoon"など)
reminders リマインダ

 remindersプロパティにもサブプロパティがあります。リマインダそのものは一つのイベントにつき5つまで指定することができますが、時間に関するminuitehoursdaysabsoluteTimeはどれか一つに統一する必要があります。

remindersプロパティのサブプロパティ
プロパティ 内容
method 通知方法。alert、emailもしくはsms
minutes 何分前に送信するか
hours 何時間前に送信するか
days 何日前に送信するか
absoluteTime 指定した時刻

次のページ
登録にかかわるサンプルコード

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Zend FrameworkでGoogleアプリケーションを使い倒す連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 森山 絵美 (モリヤマ エミ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3886 2009/05/21 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング