Zend_Gdata_Calendar.xml 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22068 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.gdata.calendar">
  5. <title>Google Kalender verwenden</title>
  6. <para>
  7. Die <classname>Zend_Gdata_Calendar</classname> Klasse kann verwendet werden, um Events im
  8. Online Google Kalender Service zu sehen, erstellen, updaten und löschen.
  9. </para>
  10. <para>
  11. Siehe <ulink
  12. url="http://code.google.com/apis/calendar/overview.html">http://code.google.com/apis/calendar/overview.html</ulink>
  13. für weitere Informationen über die Google Kalender <acronym>API</acronym>.
  14. </para>
  15. <sect2 id="zend.gdata.calendar.connecting">
  16. <title>Zum Kalender Service verbinden</title>
  17. <para>
  18. Die Google Kalender <acronym>API</acronym> basiert, wie alle GData
  19. <acronym>API</acronym>s, auf dem Atom Publishing Protocol (APP), einem
  20. <acronym>XML</acronym> basierenden Format für gemanagte Web-basierte Ressourcen. Verkehr
  21. zwischen einem Client und den Google Kalender Servern läuft über <acronym>HTTP</acronym>
  22. und erlaubt sowohl authentifizierte als auch unauthentifizierte Verbindungen.
  23. </para>
  24. <para>
  25. Bevor irgendeine Transaktion stattfinden kann, muß diese Verbindung erstellt werden. Die
  26. Erstellung einer Verbindung zu den Kalender Server beinhaltet zwei Schritte: Erstellung
  27. eines <acronym>HTTP</acronym> Clients und das binden einer
  28. <classname>Zend_Gdata_Calendar</classname> Instanz an diesen Client.
  29. </para>
  30. <sect3 id="zend.gdata.calendar.connecting.authentication">
  31. <title>Authentifizierung</title>
  32. <para>
  33. Die Google Kalender <acronym>API</acronym> erlaubt den Zugriff auf beide,
  34. öffentliche und private, Kalender Feeds. Öffentliche Feeds benötigen keine
  35. Authentifizierung, aber sie können nur gelesen werden und bieten reduzierte
  36. Funktionalitäten. Private Feeds bieten die kompletteste Funktionalität benötigen
  37. aber eine authentifizierte Verbindung zu den Kalender Servern. Es gibt drei
  38. Authentifizierungs Schemas die von Google Kalender unterstützt werden:
  39. </para>
  40. <itemizedlist>
  41. <listitem>
  42. <para>
  43. <firstterm>ClientAuth</firstterm> bietet direkte Benutzername/Passwort
  44. Authentifizierung zu den Kalender Servern. Da dieses Schema erfordert das
  45. Benutzer die Anwendung mit Ihrem Passwort versorgen, ist diese
  46. Authentifizierung nur zu empfehlen wenn andere Authentifizierungs Schemas
  47. nicht anwendbar sind.
  48. </para>
  49. </listitem>
  50. <listitem>
  51. <para>
  52. <firstterm>AuthSub</firstterm> erlaubt die Authentifizierung zu den Kalender
  53. Servern über einen Google Proxy Server. Das bietet den gleichen Level von
  54. Bequemlichkeit wie ClientAuth aber ohne die Sicherheits Risiken, was es zu
  55. einer idealen Wahl für Web basierende Anwendungen macht.
  56. </para>
  57. </listitem>
  58. <listitem>
  59. <para>
  60. <firstterm>MagicCookie</firstterm> erlaubt die Authentifizierung basieren
  61. auf einer semi-zufälligen <acronym>URL</acronym> von immerhalb des
  62. Google Kalender Interfaces. Das ist das einfachste Authentifizierungs Schema
  63. das implmentiert werden kann, erzwingt aber das Benutzer ihre Sicherheits
  64. <acronym>URL</acronym> manuell empfangen, bevor sie sich authentifizieren
  65. können, und ist limitiert auf nur-lesenden Zugriff.
  66. </para>
  67. </listitem>
  68. </itemizedlist>
  69. <para>
  70. Die <classname>Zend_Gdata</classname> Bibliothek bietet Unterstützung für alle drei
  71. Authentifizierungs Schemas. Der Rest dieses Kapitels nimmt an das die vorhandenen
  72. Authentifizierungs Schemas geläufig sind und wie eine korrekte Authentifizierte
  73. Verbindung erstellt wird. Für weitere Details kann in die <link
  74. linkend="zend.gdata.introduction.authentication">Authentifizierungs
  75. Sektion</link> dieses Handbuches, oder in die <ulink
  76. url="http://code.google.com/apis/gdata/auth.html">Authentifizierungs Übersicht
  77. im Google Data <acronym>API</acronym> Entwickler Guide</ulink> gesehen werden.
  78. </para>
  79. </sect3>
  80. <sect3 id="zend.gdata.calendar.connecting.service">
  81. <title>Eine Service Instanz erstellen</title>
  82. <para>
  83. Um mit dem Google Kalender zu interagieren, bietet diese Bibliothek die
  84. <classname>Zend_Gdata_Calendar</classname> Service Klasse. Diese Klasse bietet ein
  85. übliches Interface zu den Google Data und Atom Publishing Protocol Modellen und
  86. assistiert in der Behandlung der Anfragen zum und von den Kalender Servern.
  87. </para>
  88. <para>
  89. Sobald ein Authentifizierung Schema ausgewählt wurde, besteht der nächste Schritt
  90. darin eine Instanz von <classname>Zend_Gdata_Calendar</classname> zu erstellen. Der
  91. Klassen Konstruktor nimmt eine Instanz von <classname>Zend_Http_Client</classname>
  92. als einzelnes Argument. Das bietet ein Interface für AuthSub und ClientAuth
  93. Authentifizierungen, da beide von Ihnen die Erstellung eines speziellen
  94. authentifizierten <acronym>HTTP</acronym> Clients benötigen. Wenn keine Argumente
  95. angegeben werden, wird automatisch eine unauthentifizierte Instanz von
  96. <classname>Zend_Http_Client</classname> erstellt.
  97. </para>
  98. <para>
  99. Das folgende Beispiel zeigt wie man eine Kalender Service Klasse erstellt und dabei
  100. die ClientAuth Authentifizierung verwendet:
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. // Parameter für die ClientAuth Authentifizierung
  104. $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
  105. $user = "sample.user@gmail.com";
  106. $pass = "pa$$w0rd";
  107. // Erstellt einen authentifizierten HTTP Client
  108. $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  109. // Erstellt eine Instanz des Kalender Services
  110. $service = new Zend_Gdata_Calendar($client);
  111. ]]></programlisting>
  112. <para>
  113. Ein Kalender Service der AuthSub verwendet, kann ähnlich erstellt werden, durch eine
  114. etwas längere Schreibweise:
  115. </para>
  116. <programlisting language="php"><![CDATA[
  117. /*
  118. * Empfängt die aktuelle URL so das der AuthSub Server weiß wohin er den
  119. * Benutzer umleiten soll nachdem die Authentifizierung komplett ist.
  120. */
  121. function getCurrentUrl()
  122. {
  123. global $_SERVER;
  124. // Filtert php_self um Sicherheitsprobleme zu vermeiden.
  125. $php_request_uri =
  126. htmlentities(substr($_SERVER['REQUEST_URI'],
  127. 0,
  128. strcspn($_SERVER['REQUEST_URI'], "\n\r")),
  129. ENT_QUOTES);
  130. if (isset($_SERVER['HTTPS']) &&
  131. strtolower($_SERVER['HTTPS']) == 'on') {
  132. $protocol = 'https://';
  133. } else {
  134. $protocol = 'http://';
  135. }
  136. $host = $_SERVER['HTTP_HOST'];
  137. if ($_SERVER['HTTP_PORT'] != '' &&
  138. (($protocol == 'http://' && $_SERVER['HTTP_PORT'] != '80') ||
  139. ($protocol == 'https://' && $_SERVER['HTTP_PORT'] != '443'))) {
  140. $port = ':' . $_SERVER['HTTP_PORT'];
  141. } else {
  142. $port = '';
  143. }
  144. return $protocol . $host . $port . $php_request_uri;
  145. }
  146. /**
  147. * Einen AuthSub authentifizierten HTTP Client nehmen, der den Benutzer
  148. * zum AuthSub Server zum Login umleitet wenn es notwendig ist.
  149. */
  150. function getAuthSubHttpClient()
  151. {
  152. global $_SESSION, $_GET;
  153. // Wenn es keine AuthSub Session oder einmal-benutzbares Token gibt die auf
  154. // uns warten, den Benutzer zum AuthSub Server umleiten um Ihn zu erhalten
  155. if (!isset($_SESSION['sessionToken']) && !isset($_GET['token'])) {
  156. // Parameter für den AuthSub Server
  157. $next = getCurrentUrl();
  158. $scope = "http://www.google.com/calendar/feeds/";
  159. $secure = false;
  160. $session = true;
  161. // Den Benutzer zum AuthSub server umleiten zur Anmeldung
  162. $authSubUrl = Zend_Gdata_AuthSub::getAuthSubTokenUri($next,
  163. $scope,
  164. $secure,
  165. $session);
  166. header("HTTP/1.0 307 Temporary redirect");
  167. header("Location: " . $authSubUrl);
  168. exit();
  169. }
  170. // Konvertiert ein AuthSub einmal-benutzbares Token in ein Session
  171. // Token wenn das notwendig ist
  172. if (!isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
  173. $_SESSION['sessionToken'] =
  174. Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
  175. }
  176. // An diesem Punkt sind wir authentifiziert über AuthSub und können
  177. // eine authentifizierte HTTP Client Instanz holen
  178. // Erstellt einen authentifizierte HTTP Client
  179. $client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
  180. return $client;
  181. }
  182. // -> Skript Bearbeitung beginnt hier <-
  183. // Sicher stellen das der Benutzer eine gültige Session hat, sodas der
  184. // AuthSub Session Token gespeichert werden kann sobald er vorhanden ist
  185. session_start();
  186. // Erstellt eine Instanz des Kalender Services, und leitet den Benutzer
  187. // zum AuthSub Server um wenn das notwendig ist.
  188. $service = new Zend_Gdata_Calendar(getAuthSubHttpClient());
  189. ]]></programlisting>
  190. <para>
  191. Schlußendlich, kann ein nicht authentifizierter Server erstellt werden um Ihn
  192. entweder mit öffentlichen Feeds oder MagicCookie Authentifizierung zu verwenden:
  193. </para>
  194. <programlisting language="php"><![CDATA[
  195. // Erstellt eine Instanz des Kalender Services wobei ein nicht
  196. // authentifizierter HTTP Client verwendet wird
  197. $service = new Zend_Gdata_Calendar();
  198. ]]></programlisting>
  199. <para>
  200. Es ist zu beachten das die MagicCookie Authentifizierung nicht mit der
  201. <acronym>HTTP</acronym> Verbindung unterstützt wird, sondern stattdessen während der
  202. gewählten Sichtbarkeit spezifiziert wird, während Anfragen abgeschickt werden. Siehe
  203. die folgende Sektion über das Empfangen von Events für ein Beispiel.
  204. </para>
  205. </sect3>
  206. </sect2>
  207. <sect2 id="zend.gdata.calendar_retrieval">
  208. <title>Eine Kalender Liste empfangen</title>
  209. <para>
  210. Der Kalender Service unterstützt den Empfang einer Liste von Kalendern für den
  211. authentifizierten Benutzer. Das ist die gleiche Liste von Kalendern welche im Google
  212. Kalender UI angezeigt werden, ausser das jene die als "<emphasis>hidden</emphasis>"
  213. markiert sind, auch vorhanden sind.
  214. </para>
  215. <para>
  216. Die Kalender Liste ist immer privat und es muß über eine authentifizierte Verbindung
  217. darauf zugegriffen werden. Es ist nicht möglich eine Kalender Liste eines anderen
  218. Benutzers zu erhalten und es kann nicht darauf zugegriffen werden wenn die MagicCookie
  219. Authentifizierung verwendet wird. Der Versuch auf eine Kalender Liste zuzugreifen ohne
  220. das die notwendigen Zugriffsrechte vorhanden sind, wird fehlschlagen und in einem 401
  221. (Authentifizierung benötigt) Statuc Code resultieren.
  222. </para>
  223. <programlisting language="php"><![CDATA[
  224. $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
  225. $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  226. $service = new Zend_Gdata_Calendar($client);
  227. try {
  228. $listFeed= $service->getCalendarListFeed();
  229. } catch (Zend_Gdata_App_Exception $e) {
  230. echo "Fehler: " . $e->getMessage();
  231. }
  232. ]]></programlisting>
  233. <para>
  234. Der Aufruf von <methodname>getCalendarListFeed()</methodname> erstellt eine neue Instanz
  235. von <classname>Zend_Gdata_Calendar_ListFeed</classname> die jeden vorhandenen Kalender
  236. als Instanz von <classname>Zend_Gdata_Calendar_ListEntry</classname> enthält. Nachdem
  237. der Feed empfangen wurde, können der Iterator und der Accessor die innerhalb des Feeds
  238. enthalten sind, verwendet werden um die enthaltenen Kalender zu inspizieren.
  239. </para>
  240. <programlisting language="php"><![CDATA[
  241. echo "<h1>Kalender Feed Liste</h1>";
  242. echo "<ul>";
  243. foreach ($listFeed as $calendar) {
  244. echo "<li>" . $calendar->title .
  245. " (Event Feed: " . $calendar->id . ")</li>";
  246. }
  247. echo "</ul>";
  248. ]]></programlisting>
  249. </sect2>
  250. <sect2 id="zend.gdata.event_retrieval">
  251. <title>Events erhalten</title>
  252. <para>
  253. Wie die Liste der Kalender können auch die Events empfangen werden durch Verwendung der
  254. <classname>Zend_Gdata_Calendar</classname> Service Klasse. Die zurückgegebene Event
  255. Liste ist vom Typ <classname>Zend_Gdata_Calendar_EventFeed</classname> und enthält jedes
  256. Event als Instanz von <classname>Zend_Gdata_Calendar_EventEntry</classname>. Wie vorher,
  257. erlauben die in der Instanz des Event Feeds enthaltenen Accessoren und der Iterator das
  258. individuelle Events inspiziert werden können.
  259. </para>
  260. <sect3 id="zend.gdata.event_retrieval.queries">
  261. <title>Abfragen</title>
  262. <para>
  263. Wenn Events mit der Kalender <acronym>API</acronym> empfangen werden, werden
  264. speziell erstellte Abfrage <acronym>URL</acronym>s verwendet um zu beschreiben
  265. welche Events zurückgegeben werden sollten. Die
  266. <classname>Zend_Gdata_Calendar_EventQuery</classname> Klasse vereinfacht diese
  267. Aufgabe durch automatische Erstellung einer Abfrage <acronym>URL</acronym> basierend
  268. auf den gegebenen Parametern. Eine komplette Liste dieser Parameter ist in der
  269. <ulink url="http://code.google.com/apis/gdata/reference.html#Queries">Abfrage
  270. Sektion des Google Data <acronym>API</acronym> Protokoll Referenz</ulink>
  271. enthalten. Trotzdem gibt es drei Parameter die es Wert sind speziell genannt zu
  272. werden:
  273. </para>
  274. <itemizedlist>
  275. <listitem>
  276. <para>
  277. <firstterm>User</firstterm> wird verwendet um den Benutzer zu spezifizieren
  278. dessen Kalender gesucht wird, und wird als EMail Adresse spezifiziert. Wenn
  279. kein Benutzer angegeben wurde, wird stattdessen "default" verwendet um den
  280. aktuellen authentifizierten Benutzer anzuzeigen (wenn er authentifiziert
  281. wurde).
  282. </para>
  283. </listitem>
  284. <listitem>
  285. <para>
  286. <firstterm>Visibility</firstterm> spezifiziert ob der öffentliche oder
  287. private Kalender eines Benutzers gesucht werden soll. Wenn eine nicht
  288. authentifizierte Session verwendet wird und kein MagicCookie vorhanden ist,
  289. ist nur der öffentliche Feed vorhanden.
  290. </para>
  291. </listitem>
  292. <listitem>
  293. <para>
  294. <firstterm>Projection</firstterm> spezifiziert wieviele Daten vom Server
  295. zurückgegeben werden sollen, und in welchem Format. In den meisten Fällen
  296. wird man die komplette ("full") Projektion verwenden wollen. Auch die
  297. normale ("basic") Projektion ist vorhanden, welche die meisten Meta-Daten in
  298. jedem Inhaltsfeld der Events als menschlich lesbaren Text plaziert, und die
  299. kombinierte ("composite") Projketion welche den kompletten text für jedes
  300. Kommentar entlang jedes Events inkludiert. Die kombinierte ("composite")
  301. Ansicht ist oft viel größer als die komplette ("full") Ansicht.
  302. </para>
  303. </listitem>
  304. </itemizedlist>
  305. </sect3>
  306. <sect3 id="zend.gdata.event_retrieval.start_time">
  307. <title>Events in der Reihenfolge Ihres Startzeitpunktes erhalten</title>
  308. <para>
  309. Das folgende Beispiel zeigt die Verwendung der
  310. <classname>Zend_Gdata_Query</classname> Klasse und spezifiziert den privat
  311. sichtbaren Feed, welcher eine vorhandene authentifizierte Verbindung zu den Kalender
  312. Servern benötigt. Wenn ein MagicCookie für die Authentifizierung verwendet wird,
  313. sollte die Sichtbarkeit zuerst auf "<emphasis>private-magicCookieValue</emphasis>"
  314. gesetzt werden, sobei magicCookieValue der zufälliger String ist, der erhalten wird,
  315. wenn man die private <acronym>XML</acronym> Adresse im Google Kalender UI
  316. betrachtet. Events werden chronologisch anhand des Startzeitpunktes angefragt und
  317. nur Events die in der Zukunft stattfinden werden zurückgegeben.
  318. </para>
  319. <programlisting language="php"><![CDATA[
  320. $query = $service->newEventQuery();
  321. $query->setUser('default');
  322. // Setze $query->setVisibility('private-magicCookieValue') wenn
  323. // MagicCookie Authentifizierung verwendet wird
  324. $query->setVisibility('private');
  325. $query->setProjection('full');
  326. $query->setOrderby('starttime');
  327. $query->setFutureevents('true');
  328. // Empfängt die Event Liste vom Kalender Server
  329. try {
  330. $eventFeed = $service->getCalendarEventFeed($query);
  331. } catch (Zend_Gdata_App_Exception $e) {
  332. echo "Fehler: " . $e->getMessage();
  333. }
  334. // Iteriere durch die Liste der Events und gib Sie als HTML Liste aus
  335. echo "<ul>";
  336. foreach ($eventFeed as $event) {
  337. echo "<li>" . $event->title . " (Event ID: " . $event->id . ")</li>";
  338. }
  339. echo "</ul>";
  340. ]]></programlisting>
  341. <para>
  342. Zusätzliche Eigenschaften wie ID, Autor, Wann, Event Status, Sichtbarkeit, Web
  343. Inhalt, und Inhalt, sowie andere sind innerhalb von
  344. <classname>Zend_Gdata_Calendar_EventEntry</classname> vorhanden. Siehe die <ulink
  345. url="http://framework.zend.com/apidoc/core/">Zend Framework
  346. <acronym>API</acronym> Dokumentation</ulink> und die <ulink
  347. url="http://code.google.com/apis/gdata/reference.html">Lalender Protokol
  348. Referenz</ulink> für eine komplette Liste.
  349. </para>
  350. </sect3>
  351. <sect3 id="zend.gdata.event_retrieval.date_range">
  352. <title>Events in einem speziellen Datumsbereich empfangen</title>
  353. <para>
  354. Um alle Events in einem gewünschten Bereich auszugeben, zum Beispiel vom 1. Dezember
  355. 2006 bis zum 15. Dezember 2006, müssen die folgenden zwei Zeilen im vorhergehenden
  356. Beispiel hinzugefügt werden. Es ist zu beachten das
  357. "<command>$query->setFutureevents('true')</command>" entfernt werden muß, da
  358. <property>futureevents</property> die Werte von <property>startMin</property> und
  359. <property>startMax</property> überschreibt.
  360. </para>
  361. <programlisting language="php"><![CDATA[
  362. $query->setStartMin('2006-12-01');
  363. $query->setStartMax('2006-12-16');
  364. ]]></programlisting>
  365. <para>
  366. Es ist zu beachten das <property>startMin</property> inklusive ist, wobei
  367. <property>startMax</property> exklusive ist. Als Ergebnis, werden nur die Events bis
  368. 2006-12-15 23:59:59 zurückgegeben.
  369. </para>
  370. </sect3>
  371. <sect3 id="zend.gdata.event_retrieval.fulltext">
  372. <title>Events durch eine Volltext Abfrage erhalten</title>
  373. <para>
  374. Um alle Events auszugeben welche ein spezielles Wort, zum Beispiel "Hundefutter"
  375. enthalten, muß die <methodname>setQuery()</methodname> Methode verwendet werden wenn
  376. die Abfrage erstellt wird.
  377. </para>
  378. <programlisting language="php"><![CDATA[
  379. $query->setQuery("Hundefutter");
  380. ]]></programlisting>
  381. </sect3>
  382. <sect3 id="zend.gdata.event_retrieval.individual">
  383. <title>Individuelle Events erhalten</title>
  384. <para>
  385. Individuelle Events können empfangen werden indem deren Event ID als Teil der
  386. Abfrage spezifiziert wird. Statt <methodname>getCalendarEventFeed()</methodname>
  387. auszurufen, sollte <methodname>getCalendarEventEntry()</methodname> aufgerufen
  388. werden.
  389. </para>
  390. <programlisting language="php"><![CDATA[
  391. $query = $service->newEventQuery();
  392. $query->setUser('default');
  393. $query->setVisibility('private');
  394. $query->setProjection('full');
  395. $query->setEvent($eventId);
  396. try {
  397. $event = $service->getCalendarEventEntry($query);
  398. } catch (Zend_Gdata_App_Exception $e) {
  399. echo "Fehler: " . $e->getMessage();
  400. }
  401. ]]></programlisting>
  402. <para>
  403. In einer ähnlichen Weise kann Sie, wenn die Event <acronym>URL</acronym> bekannt
  404. ist, direkt an <methodname>getCalendarEntry()</methodname> übergeben werden um ein
  405. spezielles Event zu erhalten. In diesem Fall wird kein Abfrage Objekt benötigt da
  406. die Event <acronym>URL</acronym> alle notwendigen Informationen enthält um das Event
  407. zu erhalten.
  408. </para>
  409. <programlisting language="php"><![CDATA[
  410. $eventURL = "http://www.google.com/calendar/feeds/default/private"
  411. . "/full/g829on5sq4ag12se91d10uumko";
  412. try {
  413. $event = $service->getCalendarEventEntry($eventURL);
  414. } catch (Zend_Gdata_App_Exception $e) {
  415. echo "Fehler: " . $e->getMessage();
  416. }
  417. ]]></programlisting>
  418. </sect3>
  419. </sect2>
  420. <sect2 id="zend.gdata.calendar.creating_events">
  421. <title>Events erstellen</title>
  422. <sect3 id="zend.gdata.calendar.creating_events.single">
  423. <title>Ein einmal vorkommendes Event erstellen</title>
  424. <para>
  425. Events werden einem Kalender hinzugefügt indem eine Instanz von
  426. <classname>Zend_Gdata_EventEntry</classname> erstellt wird, und diese mit den
  427. richtigen Daten bekanntgegeben wird. Die Kalender Service Instanz
  428. (<classname>Zend_Gdata_Calendar</classname>) wird dann verwendet um das Event
  429. transparent in <acronym>XML</acronym> zu konvertieren und diese an den Kalender
  430. Server zu senden.
  431. </para>
  432. <para>Mindestens die folgenden Attribute sollten gesetzt werden:</para>
  433. <itemizedlist>
  434. <listitem>
  435. <para>
  436. <firstterm>Title</firstterm> enthält die Kopfzeile die über jedem Event
  437. innerhalb der Google Kalender UI angezeigt wird.
  438. </para>
  439. </listitem>
  440. <listitem>
  441. <para>
  442. <firstterm>When</firstterm> zeigt die Dauer des Events und, optional, jede
  443. Erinnerung die mit Ihm assoziiert ist. Siehe in die nächste Sektion für mehr
  444. Informationen über dieses Attribut.
  445. </para>
  446. </listitem>
  447. </itemizedlist>
  448. <para>
  449. Andere nützliche Attribute die optional gesetzt werden können sind unter anderem:
  450. </para>
  451. <itemizedlist>
  452. <listitem>
  453. <para>
  454. <firstterm>Author</firstterm> liefert Informationen über den Benutzer der
  455. das Event erstellt hat.
  456. </para>
  457. </listitem>
  458. <listitem>
  459. <para>
  460. <firstterm>Content</firstterm> liefert zusätzliche Information über das
  461. Event und wird angezeigt wenn die Event Details innerhalb des Google
  462. Kalenders angefragt werden.
  463. </para>
  464. </listitem>
  465. <listitem>
  466. <para>
  467. <firstterm>EventStatus</firstterm> zeigt an ob ein Event bestätigt, in
  468. Wartestellung oder abgebrochen wurde.
  469. </para>
  470. </listitem>
  471. <listitem>
  472. <para>
  473. <firstterm>Hidden</firstterm> entfernt das Event von der Google Kalender UI.
  474. </para>
  475. </listitem>
  476. <listitem>
  477. <para>
  478. <firstterm>Transparency</firstterm> zeigt ob das Event Zeit auf der
  479. Frei/Belegt Liste des Benutzers benötigt.
  480. </para>
  481. </listitem>
  482. <listitem>
  483. <para>
  484. <firstterm>WebContent</firstterm> erlaubt es externe Inhalte zu verlinken
  485. und innerhalb eines Events anzubieten.
  486. </para>
  487. </listitem>
  488. <listitem>
  489. <para>
  490. <firstterm>Where</firstterm> indiziert den Ort des Events.
  491. </para>
  492. </listitem>
  493. <listitem>
  494. <para>
  495. <firstterm>Visibility</firstterm> erlaubt es das Event vor der öffentlichen
  496. Event Liste zu verstecken.
  497. </para>
  498. </listitem>
  499. </itemizedlist>
  500. <para>
  501. Für eine komplette Liste an Event Attributen, kann in die <ulink
  502. url="http://framework.zend.com/apidoc/core/">Zend Framework
  503. <acronym>API</acronym> Documentation</ulink> und die <ulink
  504. url="http://code.google.com/apis/gdata/reference.html">Kalender Protokol
  505. Referenz</ulink> gesehen werden. Attribute die mehrfache Werte enthalten können,
  506. wo wie "where", sind als Arrays implementiert und müssen korrekt erstellt werden. Es
  507. ist zu beachten das alle diese Attribute Objekte als Parameter benötigen. Der
  508. Versuch diese stattdessen als Strings oder Primitivvariablen bekanntzugeben wird in
  509. einem Fehler während der Konvertierung in <acronym>XML</acronym> führen.
  510. </para>
  511. <para>
  512. Sobald das Event bekanntgegeben wurde, kann es zum Kalender Server hochgeladen
  513. werden durch seine Übergabe als Argument zur <methodname>insertEvent()</methodname>
  514. Funktion des Kalender Services.
  515. </para>
  516. <programlisting language="php"><![CDATA[
  517. // Erstellt einen neuen Eintrag und verwendet die magische Factory
  518. // Methode vom Kalender Service
  519. $event= $service->newEventEntry();
  520. // Gibt das Event bekannt mit den gewünschten Informationen
  521. // Beachte das jedes Attribu als Instanz der zugehörenden Klasse erstellt wird
  522. $event->title = $service->newTitle("Mein Event");
  523. $event->where = array($service->newWhere("Berg Ansicht, Kalifornien"));
  524. $event->content =
  525. $service->newContent(" Das ist mein super Event. RSVP benötigt.");
  526. // Setze das Datum und verwende das RFC 3339 Format.
  527. $startDate = "2008-01-20";
  528. $startTime = "14:00";
  529. $endDate = "2008-01-20";
  530. $endTime = "16:00";
  531. $tzOffset = "-08";
  532. $when = $service->newWhen();
  533. $when->startTime = "{$startDate}T{$startTime}:00.000{$tzOffset}:00";
  534. $when->endTime = "{$endDate}T{$endTime}:00.000{$tzOffset}:00";
  535. $event->when = array($when);
  536. // Das Event an den Kalender Server hochladen
  537. // Eine Kopie des Events wird zurückgegeben wenn es am Server gespeichert wird
  538. $newEvent = $service->insertEvent($event);
  539. ]]></programlisting>
  540. </sect3>
  541. <sect3 id="zend.gdata.calendar.creating_events.schedulers_reminders">
  542. <title>Event Planungen und Erinnerungen</title>
  543. <para>
  544. Die Startzeit und Dauer eines Events werden durch die Werte seiner
  545. <property>when</property> Eigenschaften, <property>startTime</property>,
  546. <property>endTime</property>, und <property>valueString</property> ermittelt.
  547. <emphasis>StartTime</emphasis> und <emphasis>EndTime</emphasis>
  548. kontrollieren die Dauer des Events, während die <property>valueString</property>
  549. Eigenschaft aktuell nicht verwendet wird.
  550. </para>
  551. <para>
  552. Jeden Tag wiederkehrende Events können geplant werden indem nur das Datum
  553. spezifiziert und die Zeit ausgelassen wird wenn <property>startTime</property> und
  554. <property>endTime</property> gesetzt werden. Genauso können Events die keine Dauer
  555. haben spezifiziert werden indem <property>endTime</property> unterdrückt wird. In
  556. allen Fällen sollten Datums und Zeitwerte im <ulink
  557. url="http://www.ietf.org/rfc/rfc3339.txt">RFC3339</ulink> Format angegeben
  558. werden.
  559. </para>
  560. <programlisting language="php"><![CDATA[
  561. // Plane ein Event das am 05. Dezember 2007 um 14h PST stattfindet
  562. // (UTC-8) mit der Dauer einer Stunde.
  563. $when = $service->newWhen();
  564. $when->startTime = "2007-12-05T14:00:00-08:00";
  565. $when->endTime="2007-12-05T15:00:00:00-08:00";
  566. // Die "when" Eigenschaft an das Event binden
  567. $event->when = array($when);
  568. ]]></programlisting>
  569. <para>
  570. Das <property>when</property> Attribut kontrolliert auch wann Erinnerungen an einen
  571. Benutzer gesendet werden. Erinnerungen werden in einem Array gespeichert und jedes
  572. Event kann abgefragt werden um die Erinnerungen herauszufinden die mit Ihm verbunden
  573. sind.
  574. </para>
  575. <para>
  576. Damit ein <emphasis>reminder</emphasis> gültig ist, muß er zwei Attribute gesetzt
  577. haben: <property>method</property> und eine Zeit. <emphasis>Method</emphasis>
  578. akzeptiert einen der folgenden Strings: "alert", "email" oder "sms". Die Zeit sollte
  579. als Integer eingegeben werden und kann mit den Eigenschaften
  580. <property>minutes</property>, <property>hours</property>, <property>days</property>
  581. oder <property>absoluteTime</property> gesetzt werden. Trotzdem darf eine gültige
  582. Anfrage nur eines dieser Attribute gesetzt haben. Wenn eine gemischte Zeit gewünscht
  583. wird, muß der Wert in die am besten passende und vorhandene Einheit konvertiert
  584. werden. Zum Beispiel, 1 Stunde und 30 Minuten sollten als 90 Minuten angegeben
  585. werden.
  586. </para>
  587. <programlisting language="php"><![CDATA[
  588. // Erstellt ein Erinnerungs Objekt. Es sollte eine Email an den Benutzer
  589. // senden, 10 Minuten vor dem Event.
  590. $reminder = $service->newReminder();
  591. $reminder->method = "email";
  592. $reminder->minutes = "10";
  593. // Die Erinnerung einem existierenden Event als "when" Eigenschaft hinzufügen
  594. $when = $event->when[0];
  595. $when->reminders = array($reminder);
  596. ]]></programlisting>
  597. </sect3>
  598. <sect3 id="zend.gdata.calendar.creating_events.recurring">
  599. <title>Wiederkehrende Events erstellen</title>
  600. <para>
  601. Wiederkehrende Events werden auf dem gleichen Weg erstellt wie einmal stattfindende
  602. Events, ausser das ein Wiederholungs "recurrence" Attribut statt dem "where"
  603. Attribut angegeben werden muß. Das Wiederholungs Attribut sollte einen String
  604. enthalten der das Wiederholungs Pattern des Events beschreibt und das mit
  605. Eigenschaften definiert werden kann die im iCalender Standard (<ulink
  606. url="http://www.ietf.org/rfc/rfc2445.txt">RFC 2445</ulink>) beschrieben sind.
  607. </para>
  608. <para>
  609. Ausnahmen im Wiederholungs Pattern werden normalerweise durch ein ausgeprägtes
  610. <property>recurrenceException</property> Attribut spezifiziert. Trotzdem bietet der
  611. iCalender Standard ein zweites Format für die Definition von Wiederholungen, und die
  612. Möglichkeit das jedes von Ihnen verwendet werden kann und für jedes davon muß das
  613. gehandhabt werden.
  614. </para>
  615. <para>
  616. Durch die Komplexität des analysierens des Wiederholungs Patterns, sind weitere
  617. Informationen hierüber ausserhalb des Umfangs dieses Dokuments. Trotzdem können
  618. weitere Informationen im <ulink
  619. url="http://code.google.com/apis/gdata/elements.html#gdRecurrence">Kapitel über
  620. normale Elemente des Google Data <acronym>API</acronym> Entwickler
  621. Leitfadens</ulink> gefunden werden, sowie in der <acronym>RFC</acronym> 2445.
  622. </para>
  623. <programlisting language="php"><![CDATA[
  624. // Erstelle einen neuen Eintrag und verwendet die magische
  625. // Factory Methode des Kalender Services
  626. $event= $service->newEventEntry();
  627. // Gibt das Event mit den gewünschten Informationen bekannt
  628. // Es ist zu beachten das jedes Attribut als Instanz
  629. // der betreffenden Klasse erstellt wird
  630. $event->title = $service->newTitle("Mein wiederkehrendes Event");
  631. $event->where = array($service->newWhere("Palo Alto, Kalifornien"));
  632. $event->content =
  633. $service->newContent('Das ist mein anderes super Event, ' .
  634. 'das jeden Dienstag von 01.05.2007 bis ' .
  635. '04.09.2007 stattfinden. Kein RSVP benötigt.");
  636. // Setzt Dauer und Frequenz durch Spezifizierung des Wiederholungs Patterns
  637. $recurrence = "DTSTART;VALUE=DATE:20070501\r\n" .
  638. "DTEND;VALUE=DATE:20070502\r\n" .
  639. "RRULE:FREQ=WEEKLY;BYDAY=Tu;UNTIL=20070904\r\n";
  640. $event->recurrence = $service->newRecurrence($recurrence);
  641. // Das Event zum Kalender Server hochladen
  642. // Eine Kopie des Events wird zurückgegeben,
  643. // wenn es auf dem Server gespeichert wird
  644. $newEvent = $service->insertEvent($event);
  645. ]]></programlisting>
  646. </sect3>
  647. <sect3 id="zend.gdata.calendar.creating_events.quickadd">
  648. <title>QuickAdd verwenden</title>
  649. <para>
  650. QuickAdd ist ein Feature das es erlaubt Events zu erstellen indem ein frei
  651. definierter Texteintrag verwendet wird. Zum Beispie lwürde der String "Abendessen
  652. bei Joe's Dinner am Dienstag" ein Event erstellen mit dem Titel "Abendessen", dem
  653. Ort "Joe's Dinner", und dem Datum "Dienstag". Um die Vorteile von QuickAdd zu
  654. verwenden, muß eine neue <property>QuickAdd</property> Eigenschaft erstellt, auf
  655. <constant>TRUE</constant> gesetzt und der frei definierbare Text als
  656. <property>content</property> Eigenschaft gespeichert werden.
  657. </para>
  658. <programlisting language="php"><![CDATA[
  659. // Erstelle einen neuen Eintrag und verwendet die magische
  660. // Factory Methode des Kalender Services
  661. $event= $service->newEventEntry();
  662. // Gibt das Event mit den gewünschten Informationen bekannt
  663. $event->content= $service->newContent("Dinner at Joe's Diner on Thursday");
  664. $event->quickAdd = $service->newQuickAdd("true");
  665. // Das Event zum Kalender Server hochladen
  666. // Eine Kopie des Events wird zurückgegeben,
  667. // wenn es auf dem Server gespeichert wird
  668. $newEvent = $service->insertEvent($event);
  669. ]]></programlisting>
  670. </sect3>
  671. </sect2>
  672. <sect2 id="zend.gdata.calendar.modifying_events">
  673. <title>Events bearbeiten</title>
  674. <para>
  675. Sobald eine Instanz eines Events erstellt wurde, können die Attribute des Events lokal
  676. auf dem selben Weg wie bei der Erstellung des Events geänder werden. Sobald alle
  677. Änderungen komplett sind, schickt der Aufruf der <methodname>save()</methodname> Methode
  678. des Events die Änderungen an den Kalender Server und gibt eine Kopie des Events zurück
  679. wie es auf dem Server erstellt wurde.
  680. </para>
  681. <para>
  682. Im Fall das ein anderer Benutzer das Event modifiziert hat seitdem die lokale Kopie
  683. empfangen wurde, wird die <methodname>save()</methodname> Methode fehlschlagen und einen
  684. 409 (Konflikt) Status Code zurück geben. Um das zu beheben muß eine neue Kopie des
  685. Events vom Server empfangen werden bevor ein erneuter Versuch stattfindet die Änderungen
  686. wieder zu speichern.
  687. </para>
  688. <programlisting language="php"><![CDATA[
  689. // Das erste Event auf der Liste der Events eines Benutzers erhalten
  690. $event = $eventFeed[0];
  691. // Den Titel zu einem neuen Wert ändern
  692. $event->title = $service->newTitle("Wuff!");
  693. // Die Änderungen an den Server hochladen
  694. try {
  695. $event->save();
  696. } catch (Zend_Gdata_App_Exception $e) {
  697. echo "Fehler: " . $e->getMessage();
  698. }
  699. ]]></programlisting>
  700. </sect2>
  701. <sect2 id="zend.gdata.calendar.deleting_events">
  702. <title>Events löschen</title>
  703. <para>
  704. Kalender Events können entweder durch den Aufruf der <methodname>delete()</methodname>
  705. Methode des Kalender Services, und des Angebens der Bearbeitungs <acronym>URL</acronym>
  706. des Events durchgeführt werden, oder durch Aufruf der eigenen
  707. <methodname>delete()</methodname> Methode des Events.
  708. </para>
  709. <para>
  710. In jedem Fall, wird das gelöschte Event trotzdem noch am Privaten Event Feed des
  711. Benutzers aufscheinen wenn ein <property>updateMin</property> Abfrage Parameter
  712. angegeben wurde. Gelöschte Events können von normalen Events unterschieden werden weil
  713. Sie Ihre eigene <property>eventStatus</property> Eigenschaft auf
  714. "http://schemas.google.com/g/2005#event.canceled" gesetzt haben.
  715. </para>
  716. <programlisting language="php"><![CDATA[
  717. // Option 1: Events können direkt gelöscht werden
  718. $event->delete();
  719. ]]></programlisting>
  720. <programlisting language="php"><![CDATA[
  721. // Option 2: Events können gelöscht werden indem die Bearbeitungs URL
  722. // des Events zu diesem Kalender Service angegeben wird, wenn diese
  723. // bekannt ist
  724. $service->delete($event->getEditLink()->href);
  725. ]]></programlisting>
  726. </sect2>
  727. <sect2 id="zend.gdata.calendar.comments">
  728. <title>Auf Event Kommentare zugreifen</title>
  729. <para>
  730. Den die komplette Event Ansicht verwendet wird, werden Kommentare nicht direkt innerhalb
  731. eines Events gespeichert. Stattdessen enthält jedes Event eine <acronym>URL</acronym>
  732. zum dazugehörigen Kommentar Feed welcher manuell angefragt werden muß.
  733. </para>
  734. <para>
  735. Das Arbeiten mit Kommentaren ist fundamental ähnlich zum Arbeiten mit Events, mit dem
  736. einzigen signifikanten Unterschied das eine andere Feed und Event Klasse verwendet
  737. werden sollte, und das die zusätzlichen Meta-Daten für Events wie zum Beispiel "where"
  738. und "when" für Kommentare nicht existieren. Speziell wird der Author des Kommentars in
  739. der <property>author</property> Eigenschaft und der Kommentar Text in der
  740. <property>content</property> Eigenschaft gespeichert.
  741. </para>
  742. <programlisting language="php"><![CDATA[
  743. // Die normale URL vom ersten Event der Feed Liste des Benutzers extrahieren
  744. $event = $eventFeed[0];
  745. $commentUrl = $event->comments->feedLink->url;
  746. // Die Kommentarliste für das Event erhalten
  747. try {
  748. $commentFeed = $service->getFeed($commentUrl);
  749. } catch (Zend_Gdata_App_Exception $e) {
  750. echo "Fehler: " . $e->getMessage();
  751. }
  752. // Jedes Kommentar als HTML Liste ausgeben
  753. echo "<ul>";
  754. foreach ($commentFeed as $comment) {
  755. echo "<li><em>Kommentar von: " . $comment->author->name "</em><br/>" .
  756. $comment->content . "</li>";
  757. }
  758. echo "</ul>";
  759. ]]></programlisting>
  760. </sect2>
  761. </sect1>