<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 22392 -->
<!-- Reviewed: 22392 -->
<sect1 id="zend.feed.writer">
    <title>Zend_Feed_Writer</title>

    <sect2 id="zend.feed.writer.introduction">
        <title>Einführung</title>

        <para>
            <classname>Zend_Feed_Writer</classname> ist die Bruderkomponente zu
            <classname>Zend_Feed_Reader</classname> und verantwortlich für die Erzeugung von
            Feeds für die Ausgabe. Sie unterstützt die Atom 1.0 Spezifikation
            (<acronym>RFC</acronym> 4287) und <acronym>RSS</acronym> 2.0 wie vom
            <acronym>RSS</acronym> Advisory Board (<acronym>RSS</acronym> 2.0.11) spezifiziert. Es
            weicht nicht von diesen Standards ab. Trotzdem bietet es ein einfaches System der
            Erweiterung, welches es erlaubt jede Erweiterung und jedes Modul für jede der zwei
            Spezifikationen zu implementieren, wenn diese nicht von Haus aus angeboten werden.
        </para>

        <para>
            In vieler Hinsicht ist <classname>Zend_Feed_Writer</classname> das Gegenteil von
            <classname>Zend_Feed_Reader</classname>. Während <classname>Zend_Feed_Reader</classname>
            darauf abzielt, eine einfach zu verwendende Architektur zur Verfügung zu stellen,
            die sich durch Getter-Methoden auszeichnet, stellt <classname>Zend_Feed_Writer</classname> ähnlich
            benannte Setter oder Mutatoren bereit. Das stellt sicher, dass die <acronym>API</acronym> keine
            weitere Lernkurve aufwirft, wenn sich jemand bereits mit
            <classname>Zend_Feed_Reader</classname> auskennt.
        </para>

        <para>
            Als Ergebnis dieses Designs ist der Rest nämlich einleuchtend. Hinter den Kulissen wird jedes
            Datenset eines <classname>Zend_Feed_Writer</classname>-Daten-Containers während der
            Darstellungszeit in ein DOMDocument-Objekt übersetzt, indem die
            notwendigen Feed-Elemente verwendet werden. Für jeden unterstützten Feed-Typen gibt es
            beide, sowohl einen Atom 1.0 als auch einen <acronym>RSS</acronym> 2.0 Renderer. Die
            Verwendung der DOMDocument-Klasse statt einer Templatelösung hat viele Vorteile.
            Der offensichtlichste ist die Möglichkeit das DOMDocument zu
            exportieren, um es weiter zu bearbeiten und sich auf <acronym>PHP</acronym>
            <acronym>DOM</acronym> für die korrekte und richtige Darstellung zu verlassen.
        </para>

        <para>
            Wie bei <classname>Zend_Feed_Reader</classname> ist
            <classname>Zend_Feed_Writer</classname> ein alleinstehender Ersatz für
            <classname>Zend_Feed</classname>s Builder-Architektur und nicht kompatibel mit diesen
            Klassen.
        </para>
    </sect2>

    <sect2 id="zend.feed.writer.architecture">
        <title>Architektur</title>

        <para>
            Die Architektur von <classname>Zend_Feed_Writer</classname> ist sehr einfach. Es hat
            zwei Kernsets von Klassen: Daten-Container und Renderer.
        </para>

        <para>
            Der Container enthält die Klassen <classname>Zend_Feed_Writer_Feed</classname> und
            <classname>Zend_Feed_Writer_Entry</classname>. Die Einstiegsklassen können bei jeder
            Feed-Klasse angehängt werden. Der einzige Zweck dieses Containers ist es, Daten über den
            zu erstellenden Feed zu sammeln, indem ein einfaches Interface von Setter-Methoden
            verwendet wird. Diese Methoden führen einige Test zur Datenprüfung durch. Zum Beispiel
            prüft er übergebene <acronym>URI</acronym>s, Datum, usw. Diese Prüfungen sind nicht an
            einen der Feed-Standarddefinitionen gebunden. Das Container-Objekt enthält auch Methoden, welche die
            schnelle Darstellung und den Export des endgültigen Feeds erlauben und sie können auf
            Wunsch wiederverwendet werden.
        </para>

        <para>
            Zusätzlich zu den hauptsächlichen Datencontainerklassen gibt es zwei Atom 2.0
            spezifische Klassen. <classname>Zend_Feed_Writer_Source</classname> und
            <classname>Zend_Feed_Writer_Deleted</classname>. Die erstere implementiert Atom 2.0
            Quell-Elemente, welche Feed-Metadaten der Quelle für spezielle Einträge im verwendeten
            Feed enthalten (z.B. wenn der aktuelle Feed nicht die originale Quelle des Eintrags
            enthält). Die letztere implementiert Atom Tombstones <acronym>RFC</acronym> und erlaubt
            es Feeds, Referenzen zu Einträgen zu haben, welche bereits gelöscht wurden.
        </para>

        <para>
            Während es zwei hauptsächliche Datencontainer-Typen gibt, gibt es vier Renderer - zwei
            passende Container-Renderer pro unterstütztem Feedtyp. Jeder Renderer akzeptiert einen
            Container, und basierend auf seinem Container versucht er ein gültiges Feed-Markup zu
            erstellen. Wenn der Renderer nicht in der Lage ist, ein gültiges Feed-Markup zu
            erstellen, möglicherweise weil dem Container ein obligatorischer Datenpunkt fehlt, dann
            wird er dies melden, indem eine <classname>Exception</classname> geworfen wird. Während es
            möglich ist <classname>Exception</classname>s zu ignorieren, würde dies die
            standardmäßige Schutzvorrichtung entfernen, welche sicherstellt, dass gültige Daten gesetzt
            wurden, um einen komplett gültigen Feed darzustellen.
        </para>

        <para>
            Um dies etwas genauer zu erklären, kann man ein Set von Datencontainern für einen Feed
            erstellen, wobei es einen Feed-Container gibt, in dem einige Entry-Container hinzugefügt
            wurden und ein Deleted (gelöschter) Container. Dies formt eine Datenhierarchie, die
            einen normalen Feed nachstellt. Wenn die Darstellung durchgeführt wird, dann übergibt
            diese Hierarchie ihre Teile den betreffenden Darstellern und die partiellen Feeds (alle
            DOMDocuments) werden dann zusammen geworfen, um einen kompletten Feed zu erstellen. Im
            Falle von Source oder Deleted (Tomestone) Containern werden diese nur für Atom 2.0
            dargestellt und für <acronym>RSS</acronym> ignoriert.
        </para>

        <para>
            Da das System in Datencontainer und Renderer aufgeteilt ist, sind Erweiterungen
            interessant. Eine typische Erweiterung, welche Namespaced Feeds und Entry Level
            Elemente bietet, muss selbst exakt die gleiche Architektur reflektieren, z.B. anbieten
            von Feed und Entry Level Daten Containern und passenden Renderern. Das ist
            glücklicherweise keine komplexe Integrationsarbeit, da alle Erweiterungsklassen einfach
            registriert und automatisch von den Kernklassen verwendet werden. Wir kommen später in
            diesem Kapitel im Detail zu den Erweiterungen.
        </para>
    </sect2>

    <sect2 id="zend.feed.writer.getting.started">
        <title>Beginnen</title>

        <para>
            Die Verwendung von <classname>Zend_Feed_Reader</classname> ist so einfach wie das Setzen
            von Daten und dem Ausführen des Renderers. Hier ist ein Beispiel um einen minimalen Atom
            1.0 Feed zu erstellen. Dies demonstriert dass jeder Feed oder Eintrag einen eigenen
            Container verwendet.
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Den Eltern Feed erstellen
 */
$feed = new Zend_Feed_Writer_Feed;
$feed->setTitle('Paddy\'s Blog');
$feed->setLink('http://www.example.com');
$feed->setFeedLink('http://www.example.com/atom', 'atom');
$feed->addAuthor(array(
    'name'  => 'Paddy',
    'email' => 'paddy@example.com',
    'uri'   => 'http://www.example.com',
));
$feed->setDateModified(time());
$feed->addHub('http://pubsubhubbub.appspot.com/');

/**
 * Einen oder mehrere Einträge hinzufügen. Beachten das Einträge
 * manuell hinzugefügt werden müssen sobald Sie erstellt wurden
 */
$entry = $feed->createEntry();
$entry->setTitle('All Your Base Are Belong To Us');
$entry->setLink('http://www.example.com/all-your-base-are-belong-to-us');
$entry->addAuthor(array(
    'name'  => 'Paddy',
    'email' => 'paddy@example.com',
    'uri'   => 'http://www.example.com',
));
$entry->setDateModified(time());
$entry->setDateCreated(time());
$entry->setDescription(
    'Die Schwierigkeiten erklären Spiele ins englische zu portieren.'
);
$entry->setContent(
    'Ich schreibe diesen Artikel nicht. Das Beispiel ist lang genug ;).');
$feed->addEntry($entry);

/**
 * Den ergebenden Feed in Atom 1.0 darstellen und $out zuordnen. Man kann
 * "atom" mit "rss" ersetzen um einen RSS 2.0 feed zu erstellen
 */
$out = $feed->export('atom');
]]></programlisting>

        <para>
            Die dargestellt Ausgabe sollte folgende sein:
        </para>

        <programlisting language="xml"><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title type="text">Paddy's Blog</title>
    <subtitle type="text">Writing about PC Games since 176 BC.</subtitle>
    <updated>2009-12-14T20:28:18+00:00</updated>
    <generator uri="http://framework.zend.com" version="1.10.0alpha">
        Zend_Feed_Writer
    </generator>
    <link rel="alternate" type="text/html" href="http://www.example.com"/>
    <link rel="self" type="application/atom+xml"
        href="http://www.example.com/atom"/>
    <id>http://www.example.com</id>
    <author>
        <name>Paddy</name>
        <email>paddy@example.com</email>
        <uri>http://www.example.com</uri>
    </author>
    <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
    <entry>
        <title type="html"><![CDATA[All Your Base Are Belong To
            Us]]]]><![CDATA[></title>
        <summary type="html">
            <![CDATA[Exposing the difficultly of porting games to
                English.]]]]><![CDATA[>
        </summary>
        <published>2009-12-14T20:28:18+00:00</published>
        <updated>2009-12-14T20:28:18+00:00</updated>
        <link rel="alternate" type="text/html"
            href="http://www.example.com/all-your-base-are-belong-to-us"/>
        <id>http://www.example.com/all-your-base-are-belong-to-us</id>
        <author>
            <name>Paddy</name>
            <email>paddy@example.com</email>
            <uri>http://www.example.com</uri>
        </author>
        <content type="html">
            <![CDATA[I am not writing the article.
                     The example is long enough as is ;).]]]]><![CDATA[>
        </content>
    </entry>
</feed>
]]></programlisting>

        <para>
            Das ist ein vollkommen gültiges Beispiel für Atom 1.0. Es sollte erwähnt werden, dass das
            Weglassen von obligatorischen Teilen der Daten, wie dem Titel, zu einer
            <classname>Exception</classname> führt, wenn diese als Atom 1.0 dargestellt werden.
            Anders ist das bei <acronym>RSS</acronym> 2.0, wo ein Titel weggelassen werden
            kann, solange eine Beschreibung vorhanden ist. Dadurch werden Exceptions geworfen, die
            sich zwischen beiden Standards abhängig vom Renderer unterscheiden, der verwendet wird.
            Vom Design her wird <classname>Zend_Feed_Writer</classname> keinen ungültigen Feed für
            einen Standard übersetzen, außer der End-Benutzer entscheidet sich bewusst, alle Exceptions
            zu ignorieren. Diese eingebaute Sicherheit wurde hinzugefügt, um
            sicherzustellen, dass sich Benutzer ohne tiefe Kenntnisse der betreffenden
            Spezifikationen keine Sorgen machen müssen.
        </para>
    </sect2>

    <sect2 id="zend.feed.writer.setting.feed.data.points">
        <title>Die Datenpunkte eines Feeds setzen</title>

        <para>
            Bevor ein Feed dargestellt werden kann, müssen zuerst die dafür notwendigen Daten
            gesetzt werden. Hierbei wird eine einfache Setter-artige
            <acronym>API</acronym> verwendet, welche auch als initiale Methode für die Prüfung
            von Daten herhält, wenn diese gesetzt werden. Vom Design her entspricht die
            <acronym>API</acronym> stark der von <classname>Zend_Feed_Reader</classname>, um
            Unklarheiten und Unsicherheiten zu vermeiden.
        </para>

        <note>
            <para>
                Benutzer haben angemerkt, dass das Nichtvorhandensein einer einfachen
                Array-Schreibweise für Eingabedaten zu langen Codeabschnitten führt. Das wird in
                zukünftigen Versionen behoben.
            </para>
        </note>

        <para>
            <classname>Zend_Feed_Writer</classname> bietet diese <acronym>API</acronym> über seine
            Datencontainerklassen <classname>Zend_Feed_Writer_Feed</classname> und
            <classname>Zend_Feed_Writer_Entry</classname> an (nicht zu erwähnen die Atom 2.0
            spezifischen Erweiterungsklassen). Diese Klassen speichern nahezu alle
            Feed-Daten in einer vom Typ unabhängigen Art, was bedeutet, dass man jeden Datencontainer
            mit jedem Renderer wiederverwenden kann, ohne dass zusätzliche Arbeit notwendig ist. Beide
            Klassen sind auch offen für Erweiterungen, was bedeutet, dass eine Erweiterung ihre
            eigenen Containerklassen definieren kann, welche bei den Basis-Containerklassen als
            Erweiterung registriert sind und geprüft werden, sobald irgendein Methodenaufruf die
            <methodname>__call()</methodname> Methode des Basiscontainers auslöst.
        </para>

        <para>
            Hier ist eine Zusammenfassung der Kern-<acronym>API</acronym> für Feeds. Man sollte
            beachten, dass sie nicht nur die Standards für <acronym>RSS</acronym> und Atom umfasst,
            sondern auch eine Anzahl von Erweiterungen, welche in
            <classname>Zend_Feed_Writer</classname> enthalten sind. Die Benennung dieser
            Erweiterungsmethoden ist recht generisch - alle Erweiterungsmethoden arbeiten auf dem gleichen
            Level wie die Kern-<acronym>API</acronym>, da wir es erlauben, jedes Erweiterungsobjekt
            separat zu empfangen wenn das notwendig ist.
        </para>

        <para>
            Die <acronym>API</acronym> für Daten auf Level des Feeds ist in
            <classname>Zend_Feed_Writer_Feed</classname> enthalten. Zusätzlich zu der anbei
            beschriebenen <acronym>API</acronym>, implementiert die Klasse auch die Interfaces
            <classname>Countable</classname> und <classname>Iterator</classname>.
        </para>

        <table>
            <title>API Methoden auf Feed Level</title>

            <tgroup cols="2">
                <tbody>
                    <row>
                        <entry><methodname>setId()</methodname></entry>

                        <entry>
                            Setzt eine eindeutige ID, die mit diesem Feed assoziiert ist. Für Atom
                            1.0 ist das ein atom:id Element, und für <acronym>RSS</acronym> 2.0 wird
                            es als guid Element hinzugefügt. Diese sind optional, solange ein Link
                            hinzugefügt wird, wenn z.B. der Link als ID gesetzt ist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setTitle()</methodname></entry>
                        <entry>Setzt den Titel des Feeds.</entry>
                    </row>

                    <row>
                        <entry><methodname>setDescription()</methodname></entry>
                        <entry>Setzt die textuelle Beschreibung des Feeds.</entry>
                    </row>

                    <row>
                        <entry><methodname>setLink()</methodname></entry>

                        <entry>
                            Setzt eine <acronym>URI</acronym> zur <acronym>HTML</acronym>-Website,
                            welche die gleichen oder ähnliche Informationen wie dieser Feed
                            enthält (z.B. wenn der Feed von einem Blog ist, sollte er die
                            <acronym>URI</acronym> des Blogs anbieten, unter der die
                            <acronym>HTML</acronym>-Version der Einträge gelesen werden können).
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setFeedLinks()</methodname></entry>

                        <entry>
                            Fügt einen Link zu einem <acronym>XML</acronym>-Feed hinzu, entweder der
                            erzeugte Feed oder eine alternative <acronym>URI</acronym> zeigen auf
                            den gleichen Feed, aber in einem anderen Format. Es ist mindestens
                            notwendig einen Link zum erstellten Feed zu inkludieren, damit dieser
                            eine identifizierbare endgültige <acronym>URI</acronym> hat, welche es
                            dem Client erlaubt, Änderungen des Orts mitzubekommen, ohne dass dauernde
                            Umleitungen notwendig sind. Dieser Parameter ist ein Array von Arrays,
                            wobei jedes Unter-Array die Schlüssel "type" und "uri" enthält. Der Typ
                            sollte "atom", "rss" oder "rdf" sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addAuthors()</methodname></entry>

                        <entry>
                            Setzt die Daten für Autoren. Der Parameter ist ein Array von Arrays,
                            wobei jedes Unter-Array die Schlüssel "name", "email" und "uri"
                            enthalten kann. Der Wert "uri" ist nur für Atom Feeds anwendbar, da
                            <acronym>RSS</acronym> keine Möglichkeit enthält diese anzuzeigen. Für
                            <acronym>RSS</acronym> 2.0 werden bei der Darstellung zwei Elemente
                            erzeugt - ein Autorelement, welches die Referenz zur Email und
                            dem Namen in Klammern enthält und ein Dublin Core Creator Element, welches nur
                            den Namen enthält.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addAuthor()</methodname></entry>

                        <entry>
                            Setzt die Daten für einen einzelnen Autor und folgt demselben
                            Array-Format wie vorher für ein einzelnes Unter-Array beschrieben.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setDateCreated()</methodname></entry>

                        <entry>
                            Setzt das Datum, an dem dieser Feed erstellt wurde. Generell nur
                            für Atom anwendbar, wo es das Datum beschreibt, zu der die Ressource,
                            die von dem Atom 1.0 Dokument beschrieben wird, erstellt wurde. Der
                            erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
                            <classname>Zend_Date</classname>-Objekt sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setDateModified()</methodname></entry>

                        <entry>
                            Setzt das Datum, an dem dieser Feed das letzte Mal geändert wurde. Der
                            erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
                            <classname>Zend_Date</classname>-Objekt sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setLastBuildDate()</methodname></entry>

                        <entry>
                            Setzt das Datum an dem der Feed das letzte mal erstellt wurde. Der
                            erwartete Parameter kann ein <acronym>UNIX</acronym> Timestamp oder ein
                            <classname>Zend_Date</classname> Objekt sein. Das wird nur für
                            <acronym>RSS</acronym> 2.0 Feeds dargestellt und wird automatisch als
                            aktuelles Datum dargestellt wenn er nicht explizit gesetzt wird.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setLanguage()</methodname></entry>

                        <entry>
                            Setzt die Sprache des Feeds. Diese wird unterdrückt, solange sie nicht
                            gesetzt ist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setGenerator()</methodname></entry>

                        <entry>
                            Erlaubt es einen Generator zu setzen. Der Parameter sollte ein Array
                            sein, welches die Schlüssel "name", "version" und "uri" enthält. Wenn er
                            unterdrückt wird, wird ein standardmäßiger Generator hinzugefügt, welcher
                            auf <classname>Zend_Feed_Writer</classname>, die aktuelle Version des
                            Zend Framework und die <acronym>URI</acronym> des Frameworks verweist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCopyright()</methodname></entry>
                        <entry>Setzt eine Copyright-Notiz, die mit dem Feed assoziiert ist.</entry>
                    </row>

                    <row>
                        <entry><methodname>addHubs()</methodname></entry>

                        <entry>
                            Akzeptiert ein Array von Pubsubhubbub Hub Endpunkten, die im Feed als
                            Atom-Links dargestellt werden, damit PuSH-Abonnenten den eigenen Feed
                            abbonieren können. Es ist zu beachten, dass man einen Pubsubhubbub
                            Herausgeber implementieren muss, damit Real-Time-Updates ermöglicht
                            werden. Ein Herausgeber kann implementiert werden, indem
                            <classname>Zend_Feed_Pubsubhubbub_Publisher</classname> verwendet wird.
                            Die Methode <methodname>addHub()</methodname> erlaubt es gleichzeitig
                            nur einen Hub hinzuzufügen.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addCategories()</methodname></entry>

                        <entry>
                            Akzeptiert ein Array an Kategorien für die Darstellung, wobei jedes
                            Element selbst ein Array ist, dessen mögliche Schlüssel "term", "label"
                            und "scheme" enthalten. "term" ist typischerweise der Name einer
                            Kategorie, welche für die Aufnahme in einer <acronym>URI</acronym>
                            passen. "label" kann ein menschenlesbarer Name einer Kategorie sein,
                            der spezielle Zeichen unterstützt (er wird während der Darstellung
                            kodiert) und ist ein benötigter Schlüssel. "scheme" (im
                            <acronym>RSS</acronym> auch die Domain genannt) ist optional, muss aber
                            eine gültige <acronym>URI</acronym> sein. Die Methode
                            <methodname>addCategory()</methodname> erlaubt es gleichzeitig nur eine
                            Kategorie hinzuzufügen.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setImage()</methodname></entry>

                        <entry>
                            Akzeptiert ein Array an Metadaten für Bilder für ein
                            <acronym>RSS</acronym> Bild oder ein Atom Logo. Atom 1.0 benötigt nur
                            eine <acronym>URI</acronym>. <acronym>RSS</acronym> 2.0 benötigt eine
                            <acronym>URI</acronym>, einen <acronym>HTML</acronym> Link, und einen
                            Bildtitel. <acronym>RSS</acronym> 2.0 kann optional eine Breite, eine
                            Höhe und eine Beschreibung des Bildes senden. Die Array Parameter können
                            Sie enthalten indem die folgenden Schlüssel verwendet werden:
                            <property>uri</property>, <property>link</property>,
                            <property>title</property>, <property>description</property>,
                            <property>height</property> und <property>width</property>. Der
                            <acronym>RSS</acronym> 2.0 <acronym>HTML</acronym> Link sollte auf die
                            <acronym>HTML</acronym> Quellseite des Feeds zeigen.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>createEntry()</methodname></entry>

                        <entry>
                            Gibt eine neue Instanz von <classname>Zend_Feed_Writer_Entry</classname>
                            zurück. Das ist der Daten Container auf der Ebene des Eintrags. Neue
                            Einträge müssen <methodname>addEntry()</methodname> explizit aufrufen, um
                            Einträge für die Darstellung hinzuzufügen.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addEntry()</methodname></entry>

                        <entry>
                            Fügt eine Instanz von <classname>Zend_Feed_Writer_Entry</classname> zum
                            aktuellen Feed Container für die Darstellung hinzu.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>createTombstone()</methodname></entry>

                        <entry>
                            Gibt eine neue Instanz von
                            <classname>Zend_Feed_Writer_Deleted</classname> zurück. Das ist der
                            Daten Container auf Level des Atom 2.0 Tombstone. Neue Einträge werden
                            dem aktuellen Feed nicht automatisch zugeordnet. Man muss also
                            <methodname>addTombstone()</methodname> explizit aufrufen um den
                            gelöschten Eintrag für die Darstellung hinzuzufügen.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addTombstone()</methodname></entry>

                        <entry>
                            Fügt dem aktuellen Feed Container eine Instanz von
                            <classname>Zend_Feed_Writer_Deleted</classname> für die Darstellung
                            hinzu.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>removeEntry()</methodname></entry>

                        <entry>
                            Akzeptiert einen Parameter, der den Array-Index eines Eintrags
                            bestimmt, welcher vom Feed zu entfernen ist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>export()</methodname></entry>

                        <entry>
                            Exportiert die komplette Datenhierarchie in einen <acronym>XML</acronym>
                            Feed. Die Methode has zwei Parameter. Der erste ist der Feedtyp,
                            entweder "atom" oder "rss". Der zweite in ein optionaler Boolean-Wert, der
                            zeigt ob Exceptions geworfen werden oder nicht. Er ist standardmäßig
                            <constant>TRUE</constant>.
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </table>

        <note>
            <para>
                Zusätzlich zu diesen Settern gibt es passende Getter, um Daten von den
                Eintrags-Daten-Containern zu erhalten. Zum Beispiel gibt es zu
                <methodname>setImage()</methodname> eine passende
            </para>
        </note>

        <!-- remaining feed stuff -->

    </sect2>

    <sect2 id="zend.feed.writer.setting.entry.data.points">
        <title>Setzen der Datenpunkte für Einträge</title>

        <para>
            Hier ist eine Zusammenfassung der Kern-<acronym>API</acronym> für Einträge und Elemente.
            Man sollte beachten, dass dies nicht nur die Standards für <acronym>RSS</acronym> und
            Atom umfasst, sondern auch eine Anzahl von Erweiterungen, welche in
            <classname>Zend_Feed_Writer</classname> enthalten sind. Die Benennung dieser
            Erweiterungsmethoden ist recht generisch - alle Erweiterungsmethoden arbeiten auf der
            gleichen Ebene wie die Kern-<acronym>API</acronym>, da wir es zulassen, jedes
            Erweiterungsobjekt separat zu empfangen, wenn das notwendig ist.
        </para>

        <para>
            Die <acronym>API</acronym> auf Level des Eintrags ist in
            <classname>Zend_Feed_Writer_Entry</classname> enthalten.
        </para>

        <table>
            <title>API-Methoden auf Eintragsebene</title>

            <tgroup cols="2">
                <tbody>
                    <row>
                        <entry><methodname>setId()</methodname></entry>

                        <entry>
                            Setzt eine eindeutige ID, die mit diesem Eintrag assoziiert ist. Für
                            Atom 1.0 ist das ein atom:id Element und für <acronym>RSS</acronym> 2.0
                            wird es als guid-Element hinzugefügt. Diese sind optional, solange ein
                            Link hinzugefügt wird, wenn z.B. der Link als ID gesetzt ist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setTitle()</methodname></entry>
                        <entry>Setzt den Titel des Eintrags.</entry>
                    </row>

                    <row>
                        <entry><methodname>setDescription()</methodname></entry>
                        <entry>Setzt die textuelle Beschreibung des Eintrags.</entry>
                    </row>

                    <row>
                        <entry><methodname>setContent()</methodname></entry>
                        <entry>Setzt den Inhalt des Eintrags.</entry>
                    </row>

                    <row>
                        <entry><methodname>setLink()</methodname></entry>

                        <entry>
                            Setzt eine <acronym>URI</acronym> zur <acronym>HTML</acronym>-Website,
                            welche die gleichen oder ähnliche Informationen wie dieser Eintrag
                            enthält (z.B. wenn der Feed von einem Blog ist, sollte er die
                            <acronym>URI</acronym> des Blog Artikels anbieten, unter welcher die
                            <acronym>HTML</acronym>-Version des Eintrags gelesen werden kann).
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setFeedLinks()</methodname></entry>

                        <entry>
                            Fügt einen Link zu einem <acronym>XML</acronym>-Feed hinzu, entweder der
                            erzeugte Feed oder eine alternative <acronym>URI</acronym>, dieauf
                            den gleichen Feed zeigt, aber in einem anderen Format. Es wird
                            empfohlen, mindestens einen Link zum erstellten Feed zu aufzunehmen,
                            damit dieser eine erkennbare endgültige <acronym>URI</acronym> hat,
                            welche es dem Client erlaubt, Ortswechsel mitzubekommen, ohne
                            dass dauernde Umleitungen notwendig sind. Dieser Parameter ist ein Array
                            von Arrays, wobei jedes Unter-Array die Schlüssel "type" und "uri"
                            enthält. Der Typ sollte "atom", "rss" oder "rdf" sein. Wenn der Typ
                            weggelassen wird, ist er standardmäßig mit dem Typ identisch, mit dem
                            der Feed dargestellt wird.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addAuthors()</methodname></entry>

                        <entry>
                            Setzt die Daten für Autoren. Der Parameter ist ein Array von Arrays
                            wobei jedes Unter-Array die Schlüssel "name", "email" und "uri"
                            enthalten kann. Der Wert "uri" ist nur für Atom-Feeds anwendbar, da
                            <acronym>RSS</acronym> keine Möglichkeit enthält, diese anzuzeigen. Für
                            <acronym>RSS</acronym> 2.0 werden bei der Darstellung zwei Elemente
                            erzeugt - ein Autorelement, welches die Referenz zur Email und den Namen
                            in Klammern enthält und ein Dublin Core Creator Element, welches nur
                            den Namen enthält.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>addAuthor()</methodname></entry>

                        <entry>
                            Setzt die Daten für einen einzelnen Autor und folgt demselben Format
                            wie vorher für ein einzelnes Unter-Array beschrieben.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setDateCreated()</methodname></entry>

                        <entry>
                            Setzt das Datum, an dem dieser Feed erstellt wurde. Generell nur
                            für Atom anwendbar, wo es das Datum beschreibt an dem die Ressource,
                            die von dem Atom 1.0 Dokument beschrieben wird, erstellt wurde. Der
                            erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
                            <classname>Zend_Date</classname>-Objekt sein. Wenn es nicht angegeben
                            wird, dann wird das verwendete Datum das aktuelle Datum und die aktuelle
                            Zeit sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setDateModified()</methodname></entry>

                        <entry>
                            Setzt das Datum, an dem dieser Feed das letzte Mal geändert wurde. Der
                            erwartete Parameter muss ein <acronym>UNIX</acronym>-Timestamp oder ein
                            <classname>Zend_Date</classname>-Objekt sein. Wenn es nicht angegeben
                            wird, dann wird das verwendete Datum das aktuelle Datum und die aktuelle
                            Zeit sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCopyright()</methodname></entry>

                        <entry>
                            Setzt eine Copyright-Notiz, welche mit dem Feed assoziiert wird.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCategories()</methodname></entry>

                        <entry>
                            Akzeptiert ein Array von Kategorien für die Darstellung, wobei jedes
                            Element selbst ein Array ist, dessen möglich Schlüssel "term", "label"
                            und "scheme" enthalten. "term" ist typischerweise der Name einer
                            Kategorie, welche für die Aufnahme in einer <acronym>URI</acronym>
                            passen. "label" kann ein menschenlesbarer Name einer Kategorie sein,
                            der spezielle Zeichen unterstützt (er wird während der Darstellung
                            kodiert) und ist ein benötigter Schlüssel. "scheme" (im
                            <acronym>RSS</acronym> auch die Domain genannt) ist optional, muss aber
                            eine gültige <acronym>URI</acronym> sein.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCommentCount()</methodname></entry>

                        <entry>
                            Setzt die Anzahl an Kommentaren, welche mit diesem Eintrag verbunden
                            sind. Die Darstellung unterscheidet sich zwischen <acronym>RSS</acronym>
                            und Atom 2.0 abhängig vom benötigten Element oder Attribut.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCommentLink()</methodname></entry>

                        <entry>
                            Setzt einen Link zu einer <acronym>HTML</acronym> Seite, welche
                            Kommentare enthält, die mit diesem Eintrag assoziiert sind.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCommentFeedLink()</methodname></entry>

                        <entry>
                            Setzt einen Link zu einem <acronym>XML</acronym>-Feed, der Kommentare
                            enthält, welche mit diesem Eintrag assoziiert sind. Der Parameter ist
                            ein Array, welches die Schlüssel "uri" und "type" enthält, wobei der
                            Typ entweder "rdf", "rss" oder "atom" ist.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setCommentFeedLinks()</methodname></entry>

                        <entry>
                            Das gleiche wie <methodname>setCommentFeedLink()</methodname>, außer
                            dass sie ein Array von Arrays akzeptiert, wobei jedes Unterarray die von
                            <methodname>setCommentFeedLink()</methodname> erwarteten Parameter
                            enthält.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>setEncoding()</methodname></entry>

                        <entry>
                            Setzt die Kodierung des Textes des Eintrags. Diese ist standardmäßig
                            <acronym>UTF-8</acronym>, welche auch die bevorzugte Kodierung ist.
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </table>

        <note>
            <para>
                Zusätzlich zu diesen Settern gibt es passende Getter, um Daten von den
                Eintrags-Daten-Containern zu erhalten.
            </para>
        </note>
    </sect2>
</sect1>
