1 <?xml version="1.0" encoding="UTF-8"?>
3 <!-- EN-Revision: 20779 -->
4 <sect1 id="zend.gdata.calendar">
5 <title>Google Calendar の使用法</title>
7 <classname>Zend_Gdata_Calendar</classname>
8 クラスを使うと、Google Calendar サービスで
9 イベントの閲覧や作成、更新、削除ができるようになります。
12 Google Calendar <acronym>API</acronym> についての詳細な情報は
13 <ulink url="http://code.google.com/apis/calendar/overview.html">http://code.google.com/apis/calendar/overview.html</ulink>
16 <sect2 id="zend.gdata.calendar.connecting">
17 <title>Calendar サービスへの接続</title>
19 Google Calendar <acronym>API</acronym> は、その他の GData <acronym>API</acronym> と同様に
20 Atom Publishing Protocol (APP) を使用しています。これは、<acronym>XML</acronym>
21 ベースのフォーマットでウェブのリソースを管理するための仕組みです。
22 クライアントと Google Calendar サーバとの間のやり取りは
23 <acronym>HTTP</acronym> で行われ、認証済みの接続と未認証の接続の両方が利用できます。
28 カレンダーサーバとの接続は、まず <acronym>HTTP</acronym> クライアントを作成して
29 <classname>Zend_Gdata_Calendar</classname>
30 サービスのインスタンスをそこにバインドするという手順で行います。
32 <sect3 id="zend.gdata.calendar.connecting.authentication">
35 Google Calendar <acronym>API</acronym> を使用すると、公開カレンダーだけでなく
36 プライベートカレンダーのフィードにもアクセスできます。
38 認証しない場合は読み込み専用となり、機能が制限されます。
39 プライベートフィードでは完全な機能が使用できますが、
41 Google Calendar がサポートしている認証方式は、次の 3 通りです。
46 <firstterm>ClientAuth</firstterm>
50 ユーザ自身がアプリケーションにパスワードを教える必要があるので、
51 これは他の方式が使えない場合にのみ使用するようにしましょう。
56 <firstterm>AuthSub</firstterm>
57 は、Gooble のプロキシサーバを経由してカレンダーサーバとの認証を行ないます。
58 これは ClientAuth と同じくらい便利に使用でき、
66 <firstterm>MagicCookie</firstterm>
67 は、Google Calendar インターフェイス内の
68 半ランダムな <acronym>URL</acronym> にもとづいた認証を行なう方法です。
69 この方法は、実装するのが一番簡単です。しかし、
70 ユーザ自身が安全な <acronym>URL</acronym> を事前に取得しないと認証できません
77 <classname>Zend_Gdata</classname> ライブラリは、
79 これ以降の説明は、認証方式については理解しており
80 適切な認証方式で接続できるようになっていることを前提として進めていきます。
82 <link linkend="zend.gdata.introduction.authentication">認証に関するセクション</link>
84 <ulink url="http://code.google.com/apis/gdata/auth.html">Google Data <acronym>API</acronym> Developer's Guide
85 の Authentication Overview</ulink>
89 <sect3 id="zend.gdata.calendar.connecting.service">
90 <title>サービスのインスタンスの作成</title>
92 Google Calendar を使用するためのクラスとして、このライブラリでは
93 <classname>Zend_Gdata_Calendar</classname> を用意しています。
94 このクラスは Google Data や Atom Publishing Protocol
96 カレンダーサーバとのリクエストのやりとりを支援します。
100 <classname>Zend_Gdata_Calendar</classname> のインスタンスを作成します。
101 このクラスのコンストラクタには、引数として
102 <classname>Zend_Http_Client</classname> のインスタンスを渡します。
103 これは、AuthSub 認証および ClientAuth 認証へのインターフェイスを提供します。
104 これらの認証を使用する場合には、認証済みの <acronym>HTTP</acronym> クライアントが必要です。
106 <classname>Zend_Http_Client</classname>
107 のインスタンスを自動的に作成して使用します。
110 以下の例は、ClientAuth 認証を使用して Calendar サービスを作成するものです。
112 <programlisting language="php"><![CDATA[
113 // ClientAuth 認証用のパラメータ
114 $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
115 $user = "sample.user@gmail.com";
118 // 認証済みの HTTP クライアントを作成します
119 $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
121 // Calendar サービスのインスタンスを作成します
122 $service = new Zend_Gdata_Calendar($client);
125 AuthSub を使用する Calendar サービスを作成するのもほぼ同様ですが、
128 <programlisting language="php"><![CDATA[
130 * 現在の URL を取得し、AuthSub サーバに
131 * 認証後のリダイレクト先を伝えられるようにします
133 function getCurrentUrl()
137 // php_self をフィルタリングし、セキュリティを確保します
139 htmlentities(substr($_SERVER['REQUEST_URI'],
141 strcspn($_SERVER['REQUEST_URI'], "\n\r")),
144 if (isset($_SERVER['HTTPS']) &&
145 strtolower($_SERVER['HTTPS']) == 'on') {
146 $protocol = 'https://';
148 $protocol = 'http://';
150 $host = $_SERVER['HTTP_HOST'];
151 if ($_SERVER['HTTP_PORT'] != '' &&
152 (($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
153 ($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
154 $port = ':' . $_SERVER['HTTP_PORT'];
158 return $protocol . $host . $port . $php_request_uri;
162 * AuthSub 認証済みの HTTP クライアントを作成し、ログインが必要なら
163 * ユーザを AuthSub サーバにリダイレクトします
165 function getAuthSubHttpClient()
167 global $_SESSION, $_GET;
169 // AuthSub セッションあるいはワンタイムトークンがなければ、
170 // AuthSub サーバにリダイレクトします
171 if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
172 // AuthSub サーバへのパラメータ
173 $next = getCurrentUrl();
174 $scope = "http://www.google.com/calendar/feeds/";
178 // ユーザを AuthSub サーバにリダイレクトします
180 $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
184 header("HTTP/1.0 307 Temporary redirect");
186 header("Location: " . $authSubUrl);
191 // AuthSub のワンタイムトークンを、必要に応じてセッショントークンに変換します
192 if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
193 $_SESSION['sessionToken'] =
194 Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
197 // この時点で AuthSub による認証がすんでいるので、
198 // 認証済みの HTTP クライアントのインスタンスを作成できます
200 // 認証済みの HTTP クライアントを作成します
201 $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
205 // -> スクリプトの実行はここから始まります <-
207 // ユーザが有効なセッションを保持していることを確認し、
208 // AuthSub セッショントークンを記録します
211 // Calendar サービスのインスタンスを作成し、
212 // 必要に応じてユーザを AuthSub サーバにリダイレクトします
213 $service = new Zend_Gdata_Calendar(getAuthSubHttpClient());
215 <para>未認証のサーバを作成して、公開フィードへのアクセスや MagicCookie 認証で使用できます。</para>
216 <programlisting language="php"><![CDATA[
217 // Calendar サービスのインスタンスを、
218 // 未認証の HTTP クライアントで作成します
220 $service = new Zend_Gdata_Calendar();
223 MagicCookie 認証は <acronym>HTTP</acronym> 接続で提供するものではなく、
224 クエリを送信する際の可視性を指定するものです。
225 以下にあるイベント取得の例を見てみましょう。
229 <sect2 id="zend.gdata.calendar_retrieval">
230 <title>カレンダーリストの取得</title>
233 認証済みのユーザのカレンダーの一覧を取得する機能があります。
234 これは Google Calendar の画面に表示される一覧と同じですが、
235 "<code>hidden</code>" とマークされているものも取得できるという点が異なります。
238 カレンダーリストは常に非公開なので、認証済み接続でアクセスする必要があります。
239 別のユーザのカレンダーリストを取得したり、MagicCookie
240 認証でアクセスしたりすることはできません。
241 適切な認証情報を持たずにカレンダーリストにアクセスしようとすると、
242 その処理は失敗し、ステータスコード 401 (Authentication Required) を返します。
244 <programlisting language="php"><![CDATA[
245 $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
246 $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
247 $service = new Zend_Gdata_Calendar($client);
250 $listFeed= $service->getCalendarListFeed();
251 } catch (Zend_Gdata_App_Exception $e) {
252 echo "エラー: " . $e->getMessage();
256 <methodname>getCalendarListFeed()</methodname> をコールすると
257 <classname>Zend_Gdata_Calendar_ListFeed</classname>
258 の新しいインスタンスを作成します。この中には、使用できるカレンダーの一覧が
259 <classname>Zend_Gdata_Calendar_ListEntry</classname>
261 フィードを取得したら、それを使用して中身を取得できます。
263 <programlisting language="php"><![CDATA[
264 echo "<h1>カレンダーリストのフィード</h1>";
266 foreach ($listFeed as $calendar) {
267 echo "<li>" . $calendar->title .
268 " (Event Feed: " . $calendar->id . ")</li>";
273 <sect2 id="zend.gdata.event_retrieval">
274 <title>イベントの取得</title>
277 <classname>Zend_Gdata_Calendar</classname>
280 <classname>Zend_Gdata_Calendar_EventFeed</classname>
282 <classname>Zend_Gdata_Calendar_EventEntry</classname>
284 先ほどの例と同様の方法で、個々のイベントの情報を取得できます。
286 <sect3 id="zend.gdata.event_retrieval.queries">
289 Calendar <acronym>API</acronym> でイベントを取得する際には、
290 クエリ <acronym>URL</acronym> を用いてほしいイベントを指定します。
291 <classname>Zend_Gdata_Calendar_EventQuery</classname> クラスは、
292 指定したパラメータに基づいたクエリ <acronym>URL</acronym>
293 を自動的に作成することでこの作業の手間を軽減します。
295 <ulink url="http://code.google.com/apis/gdata/reference.html#Queries">
296 Google Data <acronym>API</acronym>s Protocol Reference の Queries セクション</ulink>
303 <firstterm>User</firstterm>
304 は、誰のカレンダーを検索するのかをメールアドレスで指定します。
305 省略した場合は "default" を使用します。
306 これは、現在認証されているユーザ (認証済みの場合)
312 <firstterm>Visibility</firstterm>
322 <firstterm>Projection</firstterm>
323 は、サーバから返されるデータの件数とフォーマットを指定します。
324 たいていの場合は "full" を指定することになるでしょう。
325 "basic" を指定すると、ほとんどのメタデータ情報を
326 各イベントの content フィールドの可読形式で格納します。
327 "composite" を指定すると、各イベントについてのコメントも情報に付加します。
334 <sect3 id="zend.gdata.event_retrieval.start_time">
335 <title>開始時刻順によるイベントの取得</title>
338 <classname>Zend_Gdata_Query</classname> を使用して非公開フィードを指定しています。
340 認証に MagicCookie を使用している場合は、可視性は
341 "<code>private-magicCookieValue</code>"
342 としなければなりません。magicCookieValue
343 のところは、Google Calendar で非公開
344 <acronym>XML</acronym> アドレスを閲覧した際に取得したランダムな文字列となります。
348 <programlisting language="php"><![CDATA[
349 $query = $service->newEventQuery();
350 $query->setUser('default');
351 // MagicCookie 認証の場合は
352 // $query->setVisibility('private-magicCookieValue') とします
353 $query->setVisibility('private');
354 $query->setProjection('full');
355 $query->setOrderby('starttime');
356 $query->setFutureevents('true');
358 // カレンダーサーバからイベントの一覧を取得します
360 $eventFeed = $service->getCalendarEventFeed($query);
361 } catch (Zend_Gdata_App_Exception $e) {
362 echo "エラー: " . $e->getMessage();
365 // リストの内容を順に取得し、HTML のリストとして出力します
367 foreach ($eventFeed as $event) {
368 echo "<li>" . $event->title . " (Event ID: " . $event->id . ")</li>";
373 ID や author、when、event status、visibility、web content、
374 そして content などのさまざまなプロパティが
375 <classname>Zend_Gdata_Calendar_EventEntry</classname>
377 <ulink url="http://framework.zend.com/apidoc/core/">Zend Framework
378 <acronym>API</acronym> ドキュメント</ulink>
380 <ulink url="http://code.google.com/apis/gdata/reference.html">Calendar Protocol Reference</ulink>
384 <sect3 id="zend.gdata.event_retrieval.date_range">
385 <title>指定した日付の範囲からのイベントの取得</title>
387 指定した範囲、たとえば 2006 年 12 月 1 日から
388 2006 年 12 月 15 日までのすべてのイベントを表示するには、
389 先ほどのサンプルに次の 2 行を追加します。
390 "<code>$query->setFutureevents('true')</code>"
392 <code>futureevents</code>
394 <code>startMin</code>
396 <code>startMax</code>
399 <programlisting language="php"><![CDATA[
400 $query->setStartMin('2006-12-01');
401 $query->setStartMax('2006-12-16');
404 <code>startMin</code>
406 <code>startMax</code>
407 は含まれないことに注意しましょう。上の例の場合、
408 2006-12-15 23:59:59 までのイベントが対象となります。
411 <sect3 id="zend.gdata.event_retrieval.fulltext">
412 <title>全文検索によるイベントの取得</title>
414 指定した単語、たとえば "dogfood"
416 <methodname>setQuery()</methodname>
419 <programlisting language="php"><![CDATA[
420 $query->setQuery("dogfood");
423 <sect3 id="zend.gdata.event_retrieval.individual">
424 <title>特定のイベントの取得</title>
426 特定のイベントを取得する場合は、そのイベントの ID
428 <methodname>getCalendarEventFeed()</methodname>
430 <methodname>getCalendarEventEntry()</methodname>
433 <programlisting language="php"><![CDATA[
434 $query = $service->newEventQuery();
435 $query->setUser('default');
436 $query->setVisibility('private');
437 $query->setProjection('full');
438 $query->setEvent($eventId);
441 $event = $service->getCalendarEventEntry($query);
442 } catch (Zend_Gdata_App_Exception $e) {
443 echo "エラー: " . $e->getMessage();
447 同様に、もしそのイベントの <acronym>URL</acronym> がわかっているのなら、
448 それを直接 <methodname>getCalendarEntry()</methodname>
449 に渡して特定のイベントを取得することもできます。
451 必要な情報は、イベントの <acronym>URL</acronym> にすべて含まれているからです。
453 <programlisting language="php"><![CDATA[
454 $eventURL = "http://www.google.com/calendar/feeds/default/private"
455 . "/full/g829on5sq4ag12se91d10uumko";
458 $event = $service->getCalendarEventEntry($eventURL);
459 } catch (Zend_Gdata_App_Exception $e) {
460 echo "エラー: " . $e->getMessage();
465 <sect2 id="zend.gdata.calendar.creating_events">
466 <title>イベントの作成</title>
467 <sect3 id="zend.gdata.calendar.creating_events.single">
468 <title>一度だけのイベントの作成</title>
471 <classname>Zend_Gdata_EventEntry</classname> のインスタンスを作成して
472 そこに適切なデータを代入します。カレンダーサービスのインスタンス
473 (<classname>Zend_Gdata_Calendar</classname>) はそのデータを <acronym>XML</acronym>
474 に変換し、カレンダーサーバに POST します。
475 イベントを作成するには、AuthSub 認証あるいは
476 ClientAuth 認証でカレンダーサーバと接続する必要があります。
478 <para>最低限設定しなければならない属性は、次のとおりです。</para>
482 <firstterm>Title</firstterm>
483 は、Google Calendar でイベントの見出しとして表示される内容です。
488 <firstterm>When</firstterm>
490 オプションで、リマインダーを関連付けることができます。
491 この属性については、次のセクションで詳しく説明します。
495 <para>その他、オプションで設定できる属性は次のようになります。</para>
499 <firstterm>Author</firstterm>
500 は、そのイベントを作成したユーザについての情報です。
505 <firstterm>Content</firstterm>
507 Google Calendar でそのイベントの詳細情報を開いたときに表示されます。
512 <firstterm>EventStatus</firstterm>
513 はそのイベントが確認済み (confirmed)
514 なのか仮の予定 (tentative) なのか、
515 あるいは取り消された (canceled) を表します。
520 <firstterm>Hidden</firstterm>
521 は、そのイベントを Google Calendar 上で非表示にします。
526 <firstterm>Transparency</firstterm>
527 は、そのイベントをユーザの予定表に反映させるかどうかを指定します。
532 <firstterm>WebContent</firstterm>
533 は、そのイベント内で外部のコンテンツへのリンクを指定します。
538 <firstterm>Where</firstterm>
544 <firstterm>Visibility</firstterm>
545 は、そのイベントを公開リスト上では非表示にします。
551 <ulink url="http://framework.zend.com/apidoc/core/">Zend Framework <acronym>API</acronym>
554 <ulink url="http://code.google.com/apis/gdata/reference.html">Calendar
555 Protocol Reference</ulink>
557 where のように複数の値を持つことのある属性は配列で実装しています。
558 それにあわせて適切な形式にする必要があります。これらの属性には、
559 パラメータとしてオブジェクトを渡さなければならないことに注意しましょう。
560 文字列などを渡そうとすると、<acronym>XML</acronym> への変換時にエラーとなります。
563 イベントの情報を設定したら、それをカレンダーサーバにアップロードします。
565 <methodname>insertEvent()</methodname> 関数の引数としてそのイベントを渡します。
567 <programlisting language="php"><![CDATA[
568 // カレンダーサービスのマジックメソッドで、新規エントリを作成します
569 $event= $service->newEventEntry();
572 // 各属性は、対応するクラスのインスタンスとして作成されることに注意しましょう
573 $event->title = $service->newTitle("My Event");
574 $event->where = array($service->newWhere("Mountain View, California"));
576 $service->newContent(" This is my awesome event. RSVP required.");
578 // RFC 3339 形式で日付を指定します
579 $startDate = "2008-01-20";
580 $startTime = "14:00";
581 $endDate = "2008-01-20";
585 $when = $service->newWhen();
586 $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
587 $when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";
588 $event->when = array($when);
590 // イベントをカレンダーサーバにアップロードします
591 // サーバに記録したイベントのコピーが返されます
592 $newEvent = $service->insertEvent($event);
595 <sect3 id="zend.gdata.calendar.creating_events.schedulers_reminders">
596 <title>イベントのスケジュールおよびリマインダー</title>
598 イベントの開始時刻と期間は <code>when</code> プロパティによって決まります。
600 <code>startTime</code>、<code>endTime</code>
601 および <code>valueString</code>
603 <code>StartTime</code> および <code>EndTime</code>
604 がイベントの期間を表します。一方 <code>valueString</code>
609 <code>startTime</code>
613 同様に、期間がゼロのイベントを作成する場合は
614 <code>endTime</code> を省略します。
616 <ulink url="http://www.ietf.org/rfc/rfc3339.txt">RFC3339</ulink>
619 <programlisting language="php"><![CDATA[
620 // 2007 年 12 月 5 日の午後 2 時 (UTC-8) から
622 $when = $service->newWhen();
623 $when->startTime = "2007-12-05T14:00:00-08:00";
624 $when->endTime="2007-12-05T15:00:00:00-08:00";
626 // when プロパティをイベントに追加します
627 $event->when = array($when);
630 <code>when</code> 属性では、
631 ユーザへのリマインダーをいつ送信するかを指定することもできます。
632 リマインダーは配列形式で保存し、各イベントには
633 5 つまでのリマインダーを関連づけることができます。
636 <code>reminder</code> を指定するには、少なくともふたつの属性
637 <code>method</code> と time を指定する必要があります。
638 <code>method</code> には "alert"、"email"
639 あるいは "sms" を文字列で指定します。time
641 <code>minutes</code>、<code>hours</code>、<code>days</code>
643 <code>absoluteTime</code> を指定します。
644 しかし、指定するのはこれらの中のどれかひとつのみとしなければなりません。
645 複数の単位が必要な場合は、一番小さい単位に換算して指定します。
646 たとえば、1 時間 30 分の場合は 90 分と指定しなければなりません。
648 <programlisting language="php"><![CDATA[
649 // 新しいリマインダーオブジェクトを作成します。
650 // 予定の 10 分前に、メールでメッセージを送るようにします
651 $reminder = $service->newReminder();
652 $reminder->method = "email";
653 $reminder->minutes = "10";
655 // 既存のイベントの when プロパティにリマインダーを適用します
656 $when = $event->when[0];
657 $when->reminders = array($reminder);
660 <sect3 id="zend.gdata.calendar.creating_events.recurring">
661 <title>繰り返し発生するイベントの作成</title>
664 一回しか発生しないイベントの場合と同じです。
665 ただ、when 属性の代わりに recurrence 属性を指定する必要があります。
666 recurrence 属性は、そのイベントの繰り返しパターンを文字列で指定します。
667 この文字列は、iCalendar の標準規格 (
668 <ulink url="http://www.ietf.org/rfc/rfc2445.txt">RFC 2445</ulink>
673 <code>recurrenceException</code> 属性で指定します。
674 しかし、iCalendar の標準規格では第二の繰り返しパターンを定義できます。
678 繰り返しパターンの解析は複雑なので、詳細はこのドキュメントでは扱いません。
680 <ulink url="http://code.google.com/apis/gdata/elements.html#gdRecurrence">Google
681 Data <acronym>API</acronym>s Developer Guide の Common Elements セクション</ulink>
682 あるいは <acronym>RFC</acronym> 2445 を参照ください。
684 <programlisting language="php"><![CDATA[
685 // カレンダーサービスのマジックメソッドで、新規エントリを作成します
686 $event= $service->newEventEntry();
689 // 各属性は、対応するクラスのインスタンスとして作成されることに注意しましょう
690 $event->title = $service->newTitle("My Recurring Event");
691 $event->where = array($service->newWhere("Palo Alto, California"));
693 $service->newContent(' This is my other awesome event, ' .
694 ' occurring all-day every Tuesday from .
695 '2007-05-01 until 207-09-04. No RSVP required.');
697 // 繰り返しパターンの期間と頻度を指定します
699 $recurrence = "DTSTART;VALUE=DATE:20070501\r\n" .
700 "DTEND;VALUE=DATE:20070502\r\n" .
701 "RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904\r\n";
703 $event->recurrence = $service->newRecurrence($recurrence);
705 // イベントをカレンダーサーバにアップロードします
706 // サーバに記録したイベントのコピーが返されます
707 $newEvent = $service->insertEvent($event);
710 <sect3 id="zend.gdata.calendar.creating_events.quickadd">
711 <title>QuickAdd の使用法</title>
713 QuickAdd とは、自由形式のテキストでイベントを作成する機能のことです。
714 たとえば、"Dinner at Joe's Diner on Thursday" という文字列を指定すると、
715 タイトルが "Dinner"、場所が "Joe's Diner"、日付が "Thursday"
716 のイベントが作成されます。QuickAdd 機能を使用するには、
717 <code>QuickAdd</code> プロパティを <constant>TRUE</constant> に設定し、
718 任意のテキストを <code>content</code> プロパティに指定します。
720 <programlisting language="php"><![CDATA[
721 // カレンダーサービスのマジックメソッドで、新規エントリを作成します
722 $event= $service->newEventEntry();
725 $event->content= $service->newContent("Dinner at Joe's Diner on Thursday");
726 $event->quickAdd = $service->newQuickAdd("true");
728 // イベントをカレンダーサーバにアップロードします
729 // サーバに記録したイベントのコピーが返されます
730 $newEvent = $service->insertEvent($event);
734 <sect2 id="zend.gdata.calendar.modifying_events">
735 <title>イベントの変更</title>
738 新しいイベントを作成する場合と同じようにしてその属性を変更できます。
739 変更が完了したら、そのイベントの <methodname>save()</methodname>
740 メソッドをコールすると、変更内容をカレンダーサーバにアップロードします。
741 そして、更新後のイベントのコピーを返します。
744 イベントを取得した後で別のユーザがそのイベントを変更していた場合、
745 <methodname>save()</methodname> は失敗し、ステータスコード 409 (Conflict)
747 変更を加える直前に最新のコピーを取得する必要があります。
749 <programlisting language="php"><![CDATA[
750 // ユーザのイベントリストから最初のイベントを取得します
751 $event = $eventFeed[0];
754 $event->title = $service->newTitle("Woof!");
759 } catch (Zend_Gdata_App_Exception $e) {
760 echo "エラー: " . $e->getMessage();
764 <sect2 id="zend.gdata.calendar.deleting_events">
765 <title>イベントの削除</title>
767 カレンダーのイベントを削除する方法には二通りあります。
768 ひとつはカレンダーサービスの <methodname>delete()</methodname>
769 メソッドにそのイベントの編集用 <acronym>URL</acronym> を指定する方法、
770 もうひとつはそのイベント自身の <methodname>delete()</methodname>
774 どちらの場合も、クエリのパラメータ <code>updateMin</code>
776 プライベートイベントフィードとして残ります。
777 削除されたイベントと通常のイベントを区別するには
778 <code>eventStatus</code> プロパティを確認します。
780 "http://schemas.google.com/g/2005#event.canceled"
783 <programlisting language="php"><![CDATA[
784 // 方法 1: イベントを直接削除します
787 <programlisting language="php"><![CDATA[
789 // 削除したいイベントの編集 URL を渡します
790 $service->delete($event->getEditLink()->href);
793 <sect2 id="zend.gdata.calendar.comments">
794 <title>イベントのコメントへのアクセス</title>
796 full イベントビューでは、コメントはイベントのエントリに保存されません。
797 その代わりとして、各イベントにはコメントの <acronym>URL</acronym> が含まれており、
798 それを使用して手動でコメントを取得することになります。
801 コメントの操作方法は、イベントの場合とよく似ています。
802 ただ、使用するフィードクラスやエントリクラスは異なります。
803 またイベントのメタデータにある where や when
804 といったプロパティはコメントにはありません。コメントの発言者は
805 <code>author</code> プロパティに、そしてコメントの本文は
806 <code>content</code> プロパティに格納されます。
808 <programlisting language="php"><![CDATA[
809 // コメントの URL を、フィードリストの最初のイベントから取得します
810 $event = $eventFeed[0];
811 $commentUrl = $event->comments->feedLink->url;
813 // そのイベントのコメント一覧を取得します
815 $commentFeed = $service->getFeed($commentUrl);
816 } catch (Zend_Gdata_App_Exception $e) {
817 echo "エラー: " . $e->getMessage();
820 // 各コメントを HTML のリストで出力します
822 foreach ($commentFeed as $comment) {
823 echo "<li><em>Comment By: " . $comment->author->name "</em><br/>" .
824 $comment->content . "</li>";