Zend_Gdata_Calendar.xml 39 KB

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