Zend_Feed_Writer.xml 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22392 -->
  3. <!-- Reviewed: 22392 -->
  4. <sect1 id="zend.feed.writer">
  5. <title>Zend_Feed_Writer</title>
  6. <sect2 id="zend.feed.writer.introduction">
  7. <title>Einführung</title>
  8. <para>
  9. <classname>Zend_Feed_Writer</classname> ist die Bruderkomponente zu
  10. <classname>Zend_Feed_Reader</classname> und verantwortlich für die Erzeugung von
  11. Feeds für die Ausgabe. Sie unterstützt die Atom 1.0 Spezifikation
  12. (<acronym>RFC</acronym> 4287) und <acronym>RSS</acronym> 2.0 wie vom
  13. <acronym>RSS</acronym> Advisory Board (<acronym>RSS</acronym> 2.0.11) spezifiziert. Es
  14. weicht nicht von diesen Standards ab. Trotzdem bietet es ein einfaches System der
  15. Erweiterung, welches es erlaubt jede Erweiterung und jedes Modul für jede der zwei
  16. Spezifikationen zu implementieren, wenn diese nicht von Haus aus angeboten werden.
  17. </para>
  18. <para>
  19. In vieler Hinsicht ist <classname>Zend_Feed_Writer</classname> das Gegenteil von
  20. <classname>Zend_Feed_Reader</classname>. Während <classname>Zend_Feed_Reader</classname>
  21. darauf abzielt, eine einfach zu verwendende Architektur zur Verfügung zu stellen,
  22. die sich durch Getter-Methoden auszeichnet, stellt <classname>Zend_Feed_Writer</classname> ähnlich
  23. benannte Setter oder Mutatoren bereit. Das stellt sicher, dass die <acronym>API</acronym> keine
  24. weitere Lernkurve aufwirft, wenn sich jemand bereits mit
  25. <classname>Zend_Feed_Reader</classname> auskennt.
  26. </para>
  27. <para>
  28. Als Ergebnis dieses Designs ist der Rest nämlich einleuchtend. Hinter den Kulissen wird jedes
  29. Datenset eines <classname>Zend_Feed_Writer</classname>-Daten-Containers während der
  30. Darstellungszeit in ein DOMDocument-Objekt übersetzt, indem die
  31. notwendigen Feed-Elemente verwendet werden. Für jeden unterstützten Feed-Typen gibt es
  32. beide, sowohl einen Atom 1.0 als auch einen <acronym>RSS</acronym> 2.0 Renderer. Die
  33. Verwendung der DOMDocument-Klasse statt einer Templatelösung hat viele Vorteile.
  34. Der offensichtlichste ist die Möglichkeit das DOMDocument zu
  35. exportieren, um es weiter zu bearbeiten und sich auf <acronym>PHP</acronym>
  36. <acronym>DOM</acronym> für die korrekte und richtige Darstellung zu verlassen.
  37. </para>
  38. <para>
  39. Wie bei <classname>Zend_Feed_Reader</classname> ist
  40. <classname>Zend_Feed_Writer</classname> ein alleinstehender Ersatz für
  41. <classname>Zend_Feed</classname>s Builder-Architektur und nicht kompatibel mit diesen
  42. Klassen.
  43. </para>
  44. </sect2>
  45. <sect2 id="zend.feed.writer.architecture">
  46. <title>Architektur</title>
  47. <para>
  48. Die Architektur von <classname>Zend_Feed_Writer</classname> ist sehr einfach. Es hat
  49. zwei Kernsets von Klassen: Daten-Container und Renderer.
  50. </para>
  51. <para>
  52. Der Container enthält die Klassen <classname>Zend_Feed_Writer_Feed</classname> und
  53. <classname>Zend_Feed_Writer_Entry</classname>. Die Einstiegsklassen können bei jeder
  54. Feed-Klasse angehängt werden. Der einzige Zweck dieses Containers ist es, Daten über den
  55. zu erstellenden Feed zu sammeln, indem ein einfaches Interface von Setter-Methoden
  56. verwendet wird. Diese Methoden führen einige Test zur Datenprüfung durch. Zum Beispiel
  57. prüft er übergebene <acronym>URI</acronym>s, Datum, usw. Diese Prüfungen sind nicht an
  58. einen der Feed-Standarddefinitionen gebunden. Das Container-Objekt enthält auch Methoden, welche die
  59. schnelle Darstellung und den Export des endgültigen Feeds erlauben und sie können auf
  60. Wunsch wiederverwendet werden.
  61. </para>
  62. <para>
  63. Zusätzlich zu den hauptsächlichen Datencontainerklassen gibt es zwei Atom 2.0
  64. spezifische Klassen. <classname>Zend_Feed_Writer_Source</classname> und
  65. <classname>Zend_Feed_Writer_Deleted</classname>. Die erstere implementiert Atom 2.0
  66. Quell-Elemente, welche Feed-Metadaten der Quelle für spezielle Einträge im verwendeten
  67. Feed enthalten (z.B. wenn der aktuelle Feed nicht die originale Quelle des Eintrags
  68. enthält). Die letztere implementiert Atom Tombstones <acronym>RFC</acronym> und erlaubt
  69. es Feeds, Referenzen zu Einträgen zu haben, welche bereits gelöscht wurden.
  70. </para>
  71. <para>
  72. Während es zwei hauptsächliche Datencontainer-Typen gibt, gibt es vier Renderer - zwei
  73. passende Container-Renderer pro unterstütztem Feedtyp. Jeder Renderer akzeptiert einen
  74. Container, und basierend auf seinem Container versucht er ein gültiges Feed-Markup zu
  75. erstellen. Wenn der Renderer nicht in der Lage ist, ein gültiges Feed-Markup zu
  76. erstellen, möglicherweise weil dem Container ein obligatorischer Datenpunkt fehlt, dann
  77. wird er dies melden, indem eine <classname>Exception</classname> geworfen wird. Während es
  78. möglich ist <classname>Exception</classname>s zu ignorieren, würde dies die
  79. standardmäßige Schutzvorrichtung entfernen, welche sicherstellt, dass gültige Daten gesetzt
  80. wurden, um einen komplett gültigen Feed darzustellen.
  81. </para>
  82. <para>
  83. Um dies etwas genauer zu erklären, kann man ein Set von Datencontainern für einen Feed
  84. erstellen, wobei es einen Feed-Container gibt, in dem einige Entry-Container hinzugefügt
  85. wurden und ein Deleted (gelöschter) Container. Dies formt eine Datenhierarchie, die
  86. einen normalen Feed nachstellt. Wenn die Darstellung durchgeführt wird, dann übergibt
  87. diese Hierarchie ihre Teile den betreffenden Darstellern und die partiellen Feeds (alle
  88. DOMDocuments) werden dann zusammen geworfen, um einen kompletten Feed zu erstellen. Im
  89. Falle von Source oder Deleted (Tomestone) Containern werden diese nur für Atom 2.0
  90. dargestellt und für <acronym>RSS</acronym> ignoriert.
  91. </para>
  92. <para>
  93. Da das System in Datencontainer und Renderer aufgeteilt ist, sind Erweiterungen
  94. interessant. Eine typische Erweiterung, welche Namespaced Feeds und Entry Level
  95. Elemente bietet, muss selbst exakt die gleiche Architektur reflektieren, z.B. anbieten
  96. von Feed und Entry Level Daten Containern und passenden Renderern. Das ist
  97. glücklicherweise keine komplexe Integrationsarbeit, da alle Erweiterungsklassen einfach
  98. registriert und automatisch von den Kernklassen verwendet werden. Wir kommen später in
  99. diesem Kapitel im Detail zu den Erweiterungen.
  100. </para>
  101. </sect2>
  102. <sect2 id="zend.feed.writer.getting.started">
  103. <title>Beginnen</title>
  104. <para>
  105. Die Verwendung von <classname>Zend_Feed_Reader</classname> ist so einfach wie das Setzen
  106. von Daten und dem Ausführen des Renderers. Hier ist ein Beispiel um einen minimalen Atom
  107. 1.0 Feed zu erstellen. Dies demonstriert dass jeder Feed oder Eintrag einen eigenen
  108. Container verwendet.
  109. </para>
  110. <programlisting language="php"><![CDATA[
  111. /**
  112. * Den Eltern Feed erstellen
  113. */
  114. $feed = new Zend_Feed_Writer_Feed;
  115. $feed->setTitle('Paddy\'s Blog');
  116. $feed->setLink('http://www.example.com');
  117. $feed->setFeedLink('http://www.example.com/atom', 'atom');
  118. $feed->addAuthor(array(
  119. 'name' => 'Paddy',
  120. 'email' => 'paddy@example.com',
  121. 'uri' => 'http://www.example.com',
  122. ));
  123. $feed->setDateModified(time());
  124. $feed->addHub('http://pubsubhubbub.appspot.com/');
  125. /**
  126. * Einen oder mehrere Einträge hinzufügen. Beachten das Einträge
  127. * manuell hinzugefügt werden müssen sobald Sie erstellt wurden
  128. */
  129. $entry = $feed->createEntry();
  130. $entry->setTitle('All Your Base Are Belong To Us');
  131. $entry->setLink('http://www.example.com/all-your-base-are-belong-to-us');
  132. $entry->addAuthor(array(
  133. 'name' => 'Paddy',
  134. 'email' => 'paddy@example.com',
  135. 'uri' => 'http://www.example.com',
  136. ));
  137. $entry->setDateModified(time());
  138. $entry->setDateCreated(time());
  139. $entry->setDescription(
  140. 'Die Schwierigkeiten erklären Spiele ins englische zu portieren.'
  141. );
  142. $entry->setContent(
  143. 'Ich schreibe diesen Artikel nicht. Das Beispiel ist lang genug ;).');
  144. $feed->addEntry($entry);
  145. /**
  146. * Den ergebenden Feed in Atom 1.0 darstellen und $out zuordnen. Man kann
  147. * "atom" mit "rss" ersetzen um einen RSS 2.0 feed zu erstellen
  148. */
  149. $out = $feed->export('atom');
  150. ]]></programlisting>
  151. <para>
  152. Die dargestellt Ausgabe sollte folgende sein:
  153. </para>
  154. <programlisting language="xml"><![CDATA[
  155. <?xml version="1.0" encoding="utf-8"?>
  156. <feed xmlns="http://www.w3.org/2005/Atom">
  157. <title type="text">Paddy's Blog</title>
  158. <subtitle type="text">Writing about PC Games since 176 BC.</subtitle>
  159. <updated>2009-12-14T20:28:18+00:00</updated>
  160. <generator uri="http://framework.zend.com" version="1.10.0alpha">
  161. Zend_Feed_Writer
  162. </generator>
  163. <link rel="alternate" type="text/html" href="http://www.example.com"/>
  164. <link rel="self" type="application/atom+xml"
  165. href="http://www.example.com/atom"/>
  166. <id>http://www.example.com</id>
  167. <author>
  168. <name>Paddy</name>
  169. <email>paddy@example.com</email>
  170. <uri>http://www.example.com</uri>
  171. </author>
  172. <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
  173. <entry>
  174. <title type="html"><![CDATA[All Your Base Are Belong To
  175. Us]]]]><![CDATA[></title>
  176. <summary type="html">
  177. <![CDATA[Exposing the difficultly of porting games to
  178. English.]]]]><![CDATA[>
  179. </summary>
  180. <published>2009-12-14T20:28:18+00:00</published>
  181. <updated>2009-12-14T20:28:18+00:00</updated>
  182. <link rel="alternate" type="text/html"
  183. href="http://www.example.com/all-your-base-are-belong-to-us"/>
  184. <id>http://www.example.com/all-your-base-are-belong-to-us</id>
  185. <author>
  186. <name>Paddy</name>
  187. <email>paddy@example.com</email>
  188. <uri>http://www.example.com</uri>
  189. </author>
  190. <content type="html">
  191. <![CDATA[I am not writing the article.
  192. The example is long enough as is ;).]]]]><![CDATA[>
  193. </content>
  194. </entry>
  195. </feed>
  196. ]]></programlisting>
  197. <para>
  198. Das ist ein vollkommen gültiges Beispiel für Atom 1.0. Es sollte erwähnt werden, dass das
  199. Weglassen von obligatorischen Teilen der Daten, wie dem Titel, zu einer
  200. <classname>Exception</classname> führt, wenn diese als Atom 1.0 dargestellt werden.
  201. Anders ist das bei <acronym>RSS</acronym> 2.0, wo ein Titel weggelassen werden
  202. kann, solange eine Beschreibung vorhanden ist. Dadurch werden Exceptions geworfen, die
  203. sich zwischen beiden Standards abhängig vom Renderer unterscheiden, der verwendet wird.
  204. Vom Design her wird <classname>Zend_Feed_Writer</classname> keinen ungültigen Feed für
  205. einen Standard übersetzen, außer der End-Benutzer entscheidet sich bewusst, alle Exceptions
  206. zu ignorieren. Diese eingebaute Sicherheit wurde hinzugefügt, um
  207. sicherzustellen, dass sich Benutzer ohne tiefe Kenntnisse der betreffenden
  208. Spezifikationen keine Sorgen machen müssen.
  209. </para>
  210. </sect2>
  211. <sect2 id="zend.feed.writer.setting.feed.data.points">
  212. <title>Die Datenpunkte eines Feeds setzen</title>
  213. <para>
  214. Bevor ein Feed dargestellt werden kann, müssen zuerst die dafür notwendigen Daten
  215. gesetzt werden. Hierbei wird eine einfache Setter-artige
  216. <acronym>API</acronym> verwendet, welche auch als initiale Methode für die Prüfung
  217. von Daten herhält, wenn diese gesetzt werden. Vom Design her entspricht die
  218. <acronym>API</acronym> stark der von <classname>Zend_Feed_Reader</classname>, um
  219. Unklarheiten und Unsicherheiten zu vermeiden.
  220. </para>
  221. <note>
  222. <para>
  223. Benutzer haben angemerkt, dass das Nichtvorhandensein einer einfachen
  224. Array-Schreibweise für Eingabedaten zu langen Codeabschnitten führt. Das wird in
  225. zukünftigen Versionen behoben.
  226. </para>
  227. </note>
  228. <para>
  229. <classname>Zend_Feed_Writer</classname> bietet diese <acronym>API</acronym> über seine
  230. Datencontainerklassen <classname>Zend_Feed_Writer_Feed</classname> und
  231. <classname>Zend_Feed_Writer_Entry</classname> an (nicht zu erwähnen die Atom 2.0
  232. spezifischen Erweiterungsklassen). Diese Klassen speichern nahezu alle
  233. Feed-Daten in einer vom Typ unabhängigen Art, was bedeutet, dass man jeden Datencontainer
  234. mit jedem Renderer wiederverwenden kann, ohne dass zusätzliche Arbeit notwendig ist. Beide
  235. Klassen sind auch offen für Erweiterungen, was bedeutet, dass eine Erweiterung ihre
  236. eigenen Containerklassen definieren kann, welche bei den Basis-Containerklassen als
  237. Erweiterung registriert sind und geprüft werden, sobald irgendein Methodenaufruf die
  238. <methodname>__call()</methodname> Methode des Basiscontainers auslöst.
  239. </para>
  240. <para>
  241. Hier ist eine Zusammenfassung der Kern-<acronym>API</acronym> für Feeds. Man sollte
  242. beachten, dass sie nicht nur die Standards für <acronym>RSS</acronym> und Atom umfasst,
  243. sondern auch eine Anzahl von Erweiterungen, welche in
  244. <classname>Zend_Feed_Writer</classname> enthalten sind. Die Benennung dieser
  245. Erweiterungsmethoden ist recht generisch - alle Erweiterungsmethoden arbeiten auf dem gleichen
  246. Level wie die Kern-<acronym>API</acronym>, da wir es erlauben, jedes Erweiterungsobjekt
  247. separat zu empfangen wenn das notwendig ist.
  248. </para>
  249. <para>
  250. Die <acronym>API</acronym> für Daten auf Level des Feeds ist in
  251. <classname>Zend_Feed_Writer_Feed</classname> enthalten. Zusätzlich zu der anbei
  252. beschriebenen <acronym>API</acronym>, implementiert die Klasse auch die Interfaces
  253. <classname>Countable</classname> und <classname>Iterator</classname>.
  254. </para>
  255. <table>
  256. <title>API Methoden auf Feed Level</title>
  257. <tgroup cols="2">
  258. <tbody>
  259. <row>
  260. <entry><methodname>setId()</methodname></entry>
  261. <entry>
  262. Setzt eine eindeutige ID, die mit diesem Feed assoziiert ist. Für Atom
  263. 1.0 ist das ein atom:id Element, und für <acronym>RSS</acronym> 2.0 wird
  264. es als guid Element hinzugefügt. Diese sind optional, solange ein Link
  265. hinzugefügt wird, wenn z.B. der Link als ID gesetzt ist.
  266. </entry>
  267. </row>
  268. <row>
  269. <entry><methodname>setTitle()</methodname></entry>
  270. <entry>Setzt den Titel des Feeds.</entry>
  271. </row>
  272. <row>
  273. <entry><methodname>setDescription()</methodname></entry>
  274. <entry>Setzt die textuelle Beschreibung des Feeds.</entry>
  275. </row>
  276. <row>
  277. <entry><methodname>setLink()</methodname></entry>
  278. <entry>
  279. Setzt eine <acronym>URI</acronym> zur <acronym>HTML</acronym>-Website,
  280. welche die gleichen oder ähnliche Informationen wie dieser Feed
  281. enthält (z.B. wenn der Feed von einem Blog ist, sollte er die
  282. <acronym>URI</acronym> des Blogs anbieten, unter der die
  283. <acronym>HTML</acronym>-Version der Einträge gelesen werden können).
  284. </entry>
  285. </row>
  286. <row>
  287. <entry><methodname>setFeedLinks()</methodname></entry>
  288. <entry>
  289. Fügt einen Link zu einem <acronym>XML</acronym>-Feed hinzu, entweder der
  290. erzeugte Feed oder eine alternative <acronym>URI</acronym> zeigen auf
  291. den gleichen Feed, aber in einem anderen Format. Es ist mindestens
  292. notwendig einen Link zum erstellten Feed zu inkludieren, damit dieser
  293. eine identifizierbare endgültige <acronym>URI</acronym> hat, welche es
  294. dem Client erlaubt, Änderungen des Orts mitzubekommen, ohne dass dauernde
  295. Umleitungen notwendig sind. Dieser Parameter ist ein Array von Arrays,
  296. wobei jedes Unter-Array die Schlüssel "type" und "uri" enthält. Der Typ
  297. sollte "atom", "rss" oder "rdf" sein.
  298. </entry>
  299. </row>
  300. <row>
  301. <entry><methodname>addAuthors()</methodname></entry>
  302. <entry>
  303. Setzt die Daten für Autoren. Der Parameter ist ein Array von Arrays,
  304. wobei jedes Unter-Array die Schlüssel "name", "email" und "uri"
  305. enthalten kann. Der Wert "uri" ist nur für Atom Feeds anwendbar, da
  306. <acronym>RSS</acronym> keine Möglichkeit enthält diese anzuzeigen. Für
  307. <acronym>RSS</acronym> 2.0 werden bei der Darstellung zwei Elemente
  308. erzeugt - ein Autorelement, welches die Referenz zur Email und
  309. dem Namen in Klammern enthält und ein Dublin Core Creator Element, welches nur
  310. den Namen enthält.
  311. </entry>
  312. </row>
  313. <row>
  314. <entry><methodname>addAuthor()</methodname></entry>
  315. <entry>
  316. Setzt die Daten für einen einzelnen Autor und folgt demselben
  317. Array-Format wie vorher für ein einzelnes Unter-Array beschrieben.
  318. </entry>
  319. </row>
  320. <row>
  321. <entry><methodname>setDateCreated()</methodname></entry>
  322. <entry>
  323. Setzt das Datum, an dem dieser Feed erstellt wurde. Generell nur
  324. für Atom anwendbar, wo es das Datum beschreibt, zu der die Ressource,
  325. die von dem Atom 1.0 Dokument beschrieben wird, erstellt wurde. Der
  326. erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
  327. <classname>Zend_Date</classname>-Objekt sein.
  328. </entry>
  329. </row>
  330. <row>
  331. <entry><methodname>setDateModified()</methodname></entry>
  332. <entry>
  333. Setzt das Datum, an dem dieser Feed das letzte Mal geändert wurde. Der
  334. erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
  335. <classname>Zend_Date</classname>-Objekt sein.
  336. </entry>
  337. </row>
  338. <row>
  339. <entry><methodname>setLastBuildDate()</methodname></entry>
  340. <entry>
  341. Setzt das Datum an dem der Feed das letzte mal erstellt wurde. Der
  342. erwartete Parameter kann ein <acronym>UNIX</acronym> Timestamp oder ein
  343. <classname>Zend_Date</classname> Objekt sein. Das wird nur für
  344. <acronym>RSS</acronym> 2.0 Feeds dargestellt und wird automatisch als
  345. aktuelles Datum dargestellt wenn er nicht explizit gesetzt wird.
  346. </entry>
  347. </row>
  348. <row>
  349. <entry><methodname>setLanguage()</methodname></entry>
  350. <entry>
  351. Setzt die Sprache des Feeds. Diese wird unterdrückt, solange sie nicht
  352. gesetzt ist.
  353. </entry>
  354. </row>
  355. <row>
  356. <entry><methodname>setGenerator()</methodname></entry>
  357. <entry>
  358. Erlaubt es einen Generator zu setzen. Der Parameter sollte ein Array
  359. sein, welches die Schlüssel "name", "version" und "uri" enthält. Wenn er
  360. unterdrückt wird, wird ein standardmäßiger Generator hinzugefügt, welcher
  361. auf <classname>Zend_Feed_Writer</classname>, die aktuelle Version des
  362. Zend Framework und die <acronym>URI</acronym> des Frameworks verweist.
  363. </entry>
  364. </row>
  365. <row>
  366. <entry><methodname>setCopyright()</methodname></entry>
  367. <entry>Setzt eine Copyright-Notiz, die mit dem Feed assoziiert ist.</entry>
  368. </row>
  369. <row>
  370. <entry><methodname>addHubs()</methodname></entry>
  371. <entry>
  372. Akzeptiert ein Array von Pubsubhubbub Hub Endpunkten, die im Feed als
  373. Atom-Links dargestellt werden, damit PuSH-Abonnenten den eigenen Feed
  374. abbonieren können. Es ist zu beachten, dass man einen Pubsubhubbub
  375. Herausgeber implementieren muss, damit Real-Time-Updates ermöglicht
  376. werden. Ein Herausgeber kann implementiert werden, indem
  377. <classname>Zend_Feed_Pubsubhubbub_Publisher</classname> verwendet wird.
  378. Die Methode <methodname>addHub()</methodname> erlaubt es gleichzeitig
  379. nur einen Hub hinzuzufügen.
  380. </entry>
  381. </row>
  382. <row>
  383. <entry><methodname>addCategories()</methodname></entry>
  384. <entry>
  385. Akzeptiert ein Array an Kategorien für die Darstellung, wobei jedes
  386. Element selbst ein Array ist, dessen mögliche Schlüssel "term", "label"
  387. und "scheme" enthalten. "term" ist typischerweise der Name einer
  388. Kategorie, welche für die Aufnahme in einer <acronym>URI</acronym>
  389. passen. "label" kann ein menschenlesbarer Name einer Kategorie sein,
  390. der spezielle Zeichen unterstützt (er wird während der Darstellung
  391. kodiert) und ist ein benötigter Schlüssel. "scheme" (im
  392. <acronym>RSS</acronym> auch die Domain genannt) ist optional, muss aber
  393. eine gültige <acronym>URI</acronym> sein. Die Methode
  394. <methodname>addCategory()</methodname> erlaubt es gleichzeitig nur eine
  395. Kategorie hinzuzufügen.
  396. </entry>
  397. </row>
  398. <row>
  399. <entry><methodname>setImage()</methodname></entry>
  400. <entry>
  401. Akzeptiert ein Array an Metadaten für Bilder für ein
  402. <acronym>RSS</acronym> Bild oder ein Atom Logo. Atom 1.0 benötigt nur
  403. eine <acronym>URI</acronym>. <acronym>RSS</acronym> 2.0 benötigt eine
  404. <acronym>URI</acronym>, einen <acronym>HTML</acronym> Link, und einen
  405. Bildtitel. <acronym>RSS</acronym> 2.0 kann optional eine Breite, eine
  406. Höhe und eine Beschreibung des Bildes senden. Die Array Parameter können
  407. Sie enthalten indem die folgenden Schlüssel verwendet werden:
  408. <property>uri</property>, <property>link</property>,
  409. <property>title</property>, <property>description</property>,
  410. <property>height</property> und <property>width</property>. Der
  411. <acronym>RSS</acronym> 2.0 <acronym>HTML</acronym> Link sollte auf die
  412. <acronym>HTML</acronym> Quellseite des Feeds zeigen.
  413. </entry>
  414. </row>
  415. <row>
  416. <entry><methodname>createEntry()</methodname></entry>
  417. <entry>
  418. Gibt eine neue Instanz von <classname>Zend_Feed_Writer_Entry</classname>
  419. zurück. Das ist der Daten Container auf der Ebene des Eintrags. Neue
  420. Einträge müssen <methodname>addEntry()</methodname> explizit aufrufen, um
  421. Einträge für die Darstellung hinzuzufügen.
  422. </entry>
  423. </row>
  424. <row>
  425. <entry><methodname>addEntry()</methodname></entry>
  426. <entry>
  427. Fügt eine Instanz von <classname>Zend_Feed_Writer_Entry</classname> zum
  428. aktuellen Feed Container für die Darstellung hinzu.
  429. </entry>
  430. </row>
  431. <row>
  432. <entry><methodname>createTombstone()</methodname></entry>
  433. <entry>
  434. Gibt eine neue Instanz von
  435. <classname>Zend_Feed_Writer_Deleted</classname> zurück. Das ist der
  436. Daten Container auf Level des Atom 2.0 Tombstone. Neue Einträge werden
  437. dem aktuellen Feed nicht automatisch zugeordnet. Man muss also
  438. <methodname>addTombstone()</methodname> explizit aufrufen um den
  439. gelöschten Eintrag für die Darstellung hinzuzufügen.
  440. </entry>
  441. </row>
  442. <row>
  443. <entry><methodname>addTombstone()</methodname></entry>
  444. <entry>
  445. Fügt dem aktuellen Feed Container eine Instanz von
  446. <classname>Zend_Feed_Writer_Deleted</classname> für die Darstellung
  447. hinzu.
  448. </entry>
  449. </row>
  450. <row>
  451. <entry><methodname>removeEntry()</methodname></entry>
  452. <entry>
  453. Akzeptiert einen Parameter, der den Array-Index eines Eintrags
  454. bestimmt, welcher vom Feed zu entfernen ist.
  455. </entry>
  456. </row>
  457. <row>
  458. <entry><methodname>export()</methodname></entry>
  459. <entry>
  460. Exportiert die komplette Datenhierarchie in einen <acronym>XML</acronym>
  461. Feed. Die Methode has zwei Parameter. Der erste ist der Feedtyp,
  462. entweder "atom" oder "rss". Der zweite in ein optionaler Boolean-Wert, der
  463. zeigt ob Exceptions geworfen werden oder nicht. Er ist standardmäßig
  464. <constant>TRUE</constant>.
  465. </entry>
  466. </row>
  467. </tbody>
  468. </tgroup>
  469. </table>
  470. <note>
  471. <para>
  472. Zusätzlich zu diesen Settern gibt es passende Getter, um Daten von den
  473. Eintrags-Daten-Containern zu erhalten. Zum Beispiel gibt es zu
  474. <methodname>setImage()</methodname> eine passende
  475. </para>
  476. </note>
  477. <!-- remaining feed stuff -->
  478. </sect2>
  479. <sect2 id="zend.feed.writer.setting.entry.data.points">
  480. <title>Setzen der Datenpunkte für Einträge</title>
  481. <para>
  482. Hier ist eine Zusammenfassung der Kern-<acronym>API</acronym> für Einträge und Elemente.
  483. Man sollte beachten, dass dies nicht nur die Standards für <acronym>RSS</acronym> und
  484. Atom umfasst, sondern auch eine Anzahl von Erweiterungen, welche in
  485. <classname>Zend_Feed_Writer</classname> enthalten sind. Die Benennung dieser
  486. Erweiterungsmethoden ist recht generisch - alle Erweiterungsmethoden arbeiten auf der
  487. gleichen Ebene wie die Kern-<acronym>API</acronym>, da wir es zulassen, jedes
  488. Erweiterungsobjekt separat zu empfangen, wenn das notwendig ist.
  489. </para>
  490. <para>
  491. Die <acronym>API</acronym> auf Level des Eintrags ist in
  492. <classname>Zend_Feed_Writer_Entry</classname> enthalten.
  493. </para>
  494. <table>
  495. <title>API-Methoden auf Eintragsebene</title>
  496. <tgroup cols="2">
  497. <tbody>
  498. <row>
  499. <entry><methodname>setId()</methodname></entry>
  500. <entry>
  501. Setzt eine eindeutige ID, die mit diesem Eintrag assoziiert ist. Für
  502. Atom 1.0 ist das ein atom:id Element und für <acronym>RSS</acronym> 2.0
  503. wird es als guid-Element hinzugefügt. Diese sind optional, solange ein
  504. Link hinzugefügt wird, wenn z.B. der Link als ID gesetzt ist.
  505. </entry>
  506. </row>
  507. <row>
  508. <entry><methodname>setTitle()</methodname></entry>
  509. <entry>Setzt den Titel des Eintrags.</entry>
  510. </row>
  511. <row>
  512. <entry><methodname>setDescription()</methodname></entry>
  513. <entry>Setzt die textuelle Beschreibung des Eintrags.</entry>
  514. </row>
  515. <row>
  516. <entry><methodname>setContent()</methodname></entry>
  517. <entry>Setzt den Inhalt des Eintrags.</entry>
  518. </row>
  519. <row>
  520. <entry><methodname>setLink()</methodname></entry>
  521. <entry>
  522. Setzt eine <acronym>URI</acronym> zur <acronym>HTML</acronym>-Website,
  523. welche die gleichen oder ähnliche Informationen wie dieser Eintrag
  524. enthält (z.B. wenn der Feed von einem Blog ist, sollte er die
  525. <acronym>URI</acronym> des Blog Artikels anbieten, unter welcher die
  526. <acronym>HTML</acronym>-Version des Eintrags gelesen werden kann).
  527. </entry>
  528. </row>
  529. <row>
  530. <entry><methodname>setFeedLinks()</methodname></entry>
  531. <entry>
  532. Fügt einen Link zu einem <acronym>XML</acronym>-Feed hinzu, entweder der
  533. erzeugte Feed oder eine alternative <acronym>URI</acronym>, dieauf
  534. den gleichen Feed zeigt, aber in einem anderen Format. Es wird
  535. empfohlen, mindestens einen Link zum erstellten Feed zu aufzunehmen,
  536. damit dieser eine erkennbare endgültige <acronym>URI</acronym> hat,
  537. welche es dem Client erlaubt, Ortswechsel mitzubekommen, ohne
  538. dass dauernde Umleitungen notwendig sind. Dieser Parameter ist ein Array
  539. von Arrays, wobei jedes Unter-Array die Schlüssel "type" und "uri"
  540. enthält. Der Typ sollte "atom", "rss" oder "rdf" sein. Wenn der Typ
  541. weggelassen wird, ist er standardmäßig mit dem Typ identisch, mit dem
  542. der Feed dargestellt wird.
  543. </entry>
  544. </row>
  545. <row>
  546. <entry><methodname>addAuthors()</methodname></entry>
  547. <entry>
  548. Setzt die Daten für Autoren. Der Parameter ist ein Array von Arrays
  549. wobei jedes Unter-Array die Schlüssel "name", "email" und "uri"
  550. enthalten kann. Der Wert "uri" ist nur für Atom-Feeds anwendbar, da
  551. <acronym>RSS</acronym> keine Möglichkeit enthält, diese anzuzeigen. Für
  552. <acronym>RSS</acronym> 2.0 werden bei der Darstellung zwei Elemente
  553. erzeugt - ein Autorelement, welches die Referenz zur Email und den Namen
  554. in Klammern enthält und ein Dublin Core Creator Element, welches nur
  555. den Namen enthält.
  556. </entry>
  557. </row>
  558. <row>
  559. <entry><methodname>addAuthor()</methodname></entry>
  560. <entry>
  561. Setzt die Daten für einen einzelnen Autor und folgt demselben Format
  562. wie vorher für ein einzelnes Unter-Array beschrieben.
  563. </entry>
  564. </row>
  565. <row>
  566. <entry><methodname>setDateCreated()</methodname></entry>
  567. <entry>
  568. Setzt das Datum, an dem dieser Feed erstellt wurde. Generell nur
  569. für Atom anwendbar, wo es das Datum beschreibt an dem die Ressource,
  570. die von dem Atom 1.0 Dokument beschrieben wird, erstellt wurde. Der
  571. erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
  572. <classname>Zend_Date</classname>-Objekt sein. Wenn es nicht angegeben
  573. wird, dann wird das verwendete Datum das aktuelle Datum und die aktuelle
  574. Zeit sein.
  575. </entry>
  576. </row>
  577. <row>
  578. <entry><methodname>setDateModified()</methodname></entry>
  579. <entry>
  580. Setzt das Datum, an dem dieser Feed das letzte Mal geändert wurde. Der
  581. erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
  582. <classname>Zend_Date</classname>-Objekt sein. Wenn es nicht angegeben
  583. wird, dann wird das verwendete Datum das aktuelle Datum und die aktuelle
  584. Zeit sein.
  585. </entry>
  586. </row>
  587. <row>
  588. <entry><methodname>setCopyright()</methodname></entry>
  589. <entry>
  590. Setzt eine Copyright-Notiz, welche mit dem Feed assoziiert wird.
  591. </entry>
  592. </row>
  593. <row>
  594. <entry><methodname>setCategories()</methodname></entry>
  595. <entry>
  596. Akzeptiert ein Array von Kategorien für die Darstellung, wobei jedes
  597. Element selbst ein Array ist, dessen möglich Schlüssel "term", "label"
  598. und "scheme" enthalten. "term" ist typischerweise der Name einer
  599. Kategorie, welche für die Aufnahme in einer <acronym>URI</acronym>
  600. passen. "label" kann ein menschenlesbarer Name einer Kategorie sein,
  601. der spezielle Zeichen unterstützt (er wird während der Darstellung
  602. kodiert) und ist ein benötigter Schlüssel. "scheme" (im
  603. <acronym>RSS</acronym> auch die Domain genannt) ist optional, muss aber
  604. eine gültige <acronym>URI</acronym> sein.
  605. </entry>
  606. </row>
  607. <row>
  608. <entry><methodname>setCommentCount()</methodname></entry>
  609. <entry>
  610. Setzt die Anzahl an Kommentaren, welche mit diesem Eintrag verbunden
  611. sind. Die Darstellung unterscheidet sich zwischen <acronym>RSS</acronym>
  612. und Atom 2.0 abhängig vom benötigten Element oder Attribut.
  613. </entry>
  614. </row>
  615. <row>
  616. <entry><methodname>setCommentLink()</methodname></entry>
  617. <entry>
  618. Setzt einen Link zu einer <acronym>HTML</acronym> Seite, welche
  619. Kommentare enthält, die mit diesem Eintrag assoziiert sind.
  620. </entry>
  621. </row>
  622. <row>
  623. <entry><methodname>setCommentFeedLink()</methodname></entry>
  624. <entry>
  625. Setzt einen Link zu einem <acronym>XML</acronym>-Feed, der Kommentare
  626. enthält, welche mit diesem Eintrag assoziiert sind. Der Parameter ist
  627. ein Array, welches die Schlüssel "uri" und "type" enthält, wobei der
  628. Typ entweder "rdf", "rss" oder "atom" ist.
  629. </entry>
  630. </row>
  631. <row>
  632. <entry><methodname>setCommentFeedLinks()</methodname></entry>
  633. <entry>
  634. Das gleiche wie <methodname>setCommentFeedLink()</methodname>, außer
  635. dass sie ein Array von Arrays akzeptiert, wobei jedes Unterarray die von
  636. <methodname>setCommentFeedLink()</methodname> erwarteten Parameter
  637. enthält.
  638. </entry>
  639. </row>
  640. <row>
  641. <entry><methodname>setEncoding()</methodname></entry>
  642. <entry>
  643. Setzt die Kodierung des Textes des Eintrags. Diese ist standardmäßig
  644. <acronym>UTF-8</acronym>, welche auch die bevorzugte Kodierung ist.
  645. </entry>
  646. </row>
  647. </tbody>
  648. </tgroup>
  649. </table>
  650. <note>
  651. <para>
  652. Zusätzlich zu diesen Settern gibt es passende Getter, um Daten von den
  653. Eintrags-Daten-Containern zu erhalten.
  654. </para>
  655. </note>
  656. </sect2>
  657. </sect1>