Zend_Gdata_Calendar.xml 38 KB

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