■目次
概要
マニュアル
サンプルソース
解説
参考書籍
カテゴリのトップページへ
概要
マニュアル
サンプルソース
解説
参考書籍
カテゴリのトップページへ
■概要
ZendのZend_Gdataに含まれるカレンダー操作API群を使うと、比較的簡単にgoogle calendarの操作が出来ます。
PC向けのgoogle calendarはAjaxで実装されているので、Operaなど一部のブラウザではgoogle calendarが利用できないのですが、APIがあるので自分の環境にあったAjaxアプリを構築してしまえばよいのです。
PC向けのgoogle calendarはAjaxで実装されているので、Operaなど一部のブラウザではgoogle calendarが利用できないのですが、APIがあるので自分の環境にあったAjaxアプリを構築してしまえばよいのです。
■マニュアル
例によってZendの公式マニュアルが参考になります。
- 16.2. AuthSub による認証
Zend_Gdataの認証にはいくつかの方法があります。
ここでは、ウェブアプリケーションが実装する上でもっとも安全とされているAuthSubによる認証を使いますので、あらかじめ理解しておきましょう。 - 16.4. Google Calendar の使用法
■サンプルソース
<?php
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_Calendar');
Zend_Loader::loadClass('Zend_Http_Client');
/** 現在の URL を取得し、AuthSub サーバに
* 認証後のリダイレクト先を伝えられるようにします
*/
function getCurrentUrl()
{
global $_SERVER;
// php_self をフィルタリングし、セキュリティを確保します
$php_request_uri = htmlentities(substr($_SERVER['REQUEST_URI'], 0, strcspn($_SERVER['REQUEST_URI'], "\n\r")), ENT_QUOTES);
if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') {
$protocol = 'https://';
} else {
$protocol = 'http://';
}
$host = $_SERVER['HTTP_HOST'];
if ($_SERVER['HTTP_PORT'] != '' &&
(($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
$port = ':' . $_SERVER['HTTP_PORT'];
} else {
$port = '';
}
return $protocol . $host . $port . $php_request_uri;
}
/** AuthSub 認証済みの HTTP クライアントを作成し、ログインが必要なら
* ユーザを AuthSub サーバにリダイレクトします
*/
function getAuthSubHttpClient()
{
global $_SESSION, $_GET;
// AuthSub セッションあるいはワンタイムトークンがなければ、
// AuthSub サーバにリダイレクトします
if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
// AuthSub サーバへのパラメータ
$next = getCurrentUrl();
$scope = "http://www.google.com/calendar/feeds/";
$secure = false;
$session = true;
// ユーザを AuthSub サーバにリダイレクトします
$authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, $session);
header("HTTP/1.0 307 Temporary redirect");
header("Location: " . $authSubUrl);
exit();
}
// AuthSub のワンタイムトークンを、必要に応じてセッショントークンに変換します
if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
try{
$_SESSION['sessionToken'] =
Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
} catch (Zend_Gdata_App_Exception $e) {
// 念のため
return(0);
}
}
// この時点で AuthSub による認証がすんでいるので、
// 認証済みの HTTP クライアントのインスタンスを作成することができます
// 認証済みの HTTP クライアントを作成します
$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
return $client;
}
// -> スクリプトの実行はここから始まります <-
// http://code.google.com/apis/gdata/reference.html#Queries
// でユーザが有効なセッションを保持していることを確認し、
// AuthSub セッショントークンを記録します
session_start();
// Calendar サービスのインスタンスを作成し、
// 必要に応じてユーザを AuthSub サーバにリダイレクトします
if(!$client=getAuthSubHttpClient()){
print "お使いのブラウザでのリロードボタンは使用できません。<br>\n";
print "クライアント認証に失敗しました。<br>処理を中断します。<br>画面上部のリロードリンクでリロードしてね<br>\n";
}
else {
$service = new Zend_Gdata_Calendar($client);
if(!$service){
print "認証できません・・・<br>\n";
}
else {
$query = $service->newEventQuery();
$query->setUser('default');
// MagicCookie 認証の場合は $query->setVisibility('private-magicCookieValue') とします
$query->setVisibility('private');
$query->setProjection('full');
$query->setOrderby('starttime');
$query->setFutureevents('true');
// カレンダーサーバからイベントの一覧を取得します
try {
$eventFeed = $service->getCalendarEventFeed($query);
} catch (Zend_Gdata_App_Exception $e) {
echo "エラー: " . $e->getResponse();
}
// リストの内容を順に取得し、HTML のリストとして出力します
print "■カレンダー名:" . $eventFeed->title->text . "<br>\n";
print "■最終更新:" . $eventFeed->updated->text . "<br>\n";
print "■所有者情報<br>\n";
echo "<ul>";
foreach($eventFeed->author as $author){
echo "<li>" . $author->name->text . " (mail address: " . $author->email->text . ")</li>";
}
echo "</ul>";
print "■カレンダーエントリ<br>\n";
echo "<ul>";
foreach ($eventFeed->entry as $event) {
$event_url = $event->id->text;
echo "<li>" . $event->title->text . " (<a target=\"_blank\" href=\"{$event_url}\">イベント情報XMLをダウンロード</a>)</li>";
}
echo "</ul>";
}
}
?>
■解説
Google WX320K Calendarが動作サンプルとなっていますので、動きが確認できます。
基本的にはZendのマニュアルページで16.4. Google Calendar の使用法紹介されているサンプルを加工したものです。
ただし、データ表示処理に一部誤りがあったり、エラー処理に抜けがあったりするので、そのあたりを変更・追加してみました。
ポイントとしては、「絶対にあるはずがない」ってことは考えない方がいい、ということ。
まあ、プログラムを作る上での基本です。
サンプルですが、
リマインダ設定しているので、対象メールをWX320Kに自動転送するようにしておけば、なお便利です。
WX320Kで使いたかったのでシンプルな仕様にしてみましたが、PC専用のリッチなAjaxアプリに組み込んだりすることももちろん簡単に出来ます。
蛇足ですが、WX320Kで使用する場合は、スモールスクリーンまたはフルスクリーンモードでないとAuthSub認証が行えないので、ケータイモードでは使えません。
基本的にはZendのマニュアルページで16.4. Google Calendar の使用法紹介されているサンプルを加工したものです。
ただし、データ表示処理に一部誤りがあったり、エラー処理に抜けがあったりするので、そのあたりを変更・追加してみました。
ポイントとしては、「絶対にあるはずがない」ってことは考えない方がいい、ということ。
まあ、プログラムを作る上での基本です。
サンプルですが、
- パーソナルスケジュールの一覧表示(タイトル、場所(地図リンク付き)、時間)
- 新規予定追加(日時指定、リマインダ自動設定)
リマインダ設定しているので、対象メールをWX320Kに自動転送するようにしておけば、なお便利です。
WX320Kで使いたかったのでシンプルな仕様にしてみましたが、PC専用のリッチなAjaxアプリに組み込んだりすることももちろん簡単に出来ます。
蛇足ですが、WX320Kで使用する場合は、スモールスクリーンまたはフルスクリーンモードでないとAuthSub認証が行えないので、ケータイモードでは使えません。
■参考書籍
(データ提供:Amazon.co.jp)


