Einführung

Feeds importieren

Zend_Feed ermöglicht es Entwicklern, Feeds sehr einfach abzurufen. Wenn Du die URI eines Feeds kennst, verwende einfach die Zend_Feed::import() Methode:

  1. $feed = Zend_Feed::import('http://feeds.example.com/feedName');

Du kannst Zend_Feed außerdem verwenden, um Inhalte eines Feeds aus einer Datei oder die Inhalte aus einem PHP String Variable zu abzurufen.

  1. // Feeds von einer Textdatei importieren
  2. $feedFromFile = Zend_Feed::importFile('feed.xml');
  3.  
  4. // Feeds von einer PHP String Variable importieren
  5. $feedFromPHP = Zend_Feed::importString($feedString);

In jedem der obigen Beispiele wird bei Erfolg abhängig vom Typ des Feeds ein Objekt einer Klasse zurück gegeben, welche Zend_Feed_Abstract erweitert. Wird ein RSS Feed durch eine der obigen Importiermethoden abgerufen, wird eine Zend_Feed_Rss Objekt zurückgegeben. Auf der anderen Seite wird beim Importieren eines Atom Feeds ein Zend_Feed_Atom Objekt zurückgegeben. Bei Fehlern, wie z.B. ein unlesbarer oder nicht wohlgeformter Feed, werfen die Importiermethoden auch ein Zend_Feed_Exception Objekt.

Eigene Feeds

Zend_Feed ermöglicht es Entwicklern Ihre eigenen Feeds sehr einfach zu erstellen. Man muß nur ein Array erstellen und es in Zend_Feed importieren, Dieses Array kann mit Zend_Feed::importArray() oder mit Zend_Feed::importBuilder() importiert werden. Im letzteren Fall wird das Array on the Fly durch eine eigene Datenquelle berechnet die Zend_Feed_Builder_Interface implementiert.

Importieren eines eigenen Arrays

  1. // Importieren eines Feeds von einem Array
  2. $atomFeedFromArray = Zend_Feed::importArray($array);
  3.  
  4. // Die folgende Zeile ist identisch mit der obigen; standardmäßig
  5. // wird eine Zend_Feed_Atom Instanz zurückgegeben
  6. $atomFeedFromArray = Zend_Feed::importArray($array, 'atom');
  7.  
  8. // Importieren eines RSS Feeds von einem Array
  9. $rssFeedFromArray = Zend_Feed::importArray($array, 'rss');

Das Format des Arrays muß dieser Struktur entsprechen:

  1.     // benötigt
  2.     'title' => 'Titel des Feeds',
  3.     'link'  => 'Kanonische URL zu dem Feed',
  4.  
  5.     // optional
  6.     'lastUpdate' => 'Zeitstempel des Update Datums',
  7.     'published'  => 'Zeitstempel des Veröffentlichungs Datums',
  8.  
  9.     // benötigt
  10.     'charset' => 'Zeichensatz der textuellen Daten',
  11.  
  12.     //optional
  13.     'description' => 'Kurzbeschreibung des Feeds',
  14.     'author'      => 'Author, Veröffentlicher des Feeds',
  15.     'email'       => 'Email des Authors',
  16.  
  17.     // optional, ignoriert wenn Atom verwendet wird
  18.     'webmaster' => 'Email Adresse der Person die für technische '
  19.                 .  'Belange verantwortlich ist',
  20.  
  21.     //optional
  22.     'copyright' => 'Copyright Notiz',
  23.     'image'     => 'URL zu Bildern',
  24.     'generator' => 'Ersteller',
  25.     'language'  => 'Sprache in welcher der Feed geschrieben ist',
  26.  
  27.     // optional, ignoriert wenn Atom verwendet wird
  28.     'ttl'    => 'Wie lange ein Feed gecached werden kann '
  29.              .  'bevor er erneut werden muß',
  30.     'rating' => 'Die PICS Rate dieses Kanals',
  31.  
  32.     // optional, ignoriert wenn Atom verwendet wird
  33.     // eine Wolke die über Updates benachrichtigt wird
  34.     'cloud' => array(
  35.         // benötigt
  36.         'domain' => 'Domain der Wolke, e.g. rpc.sys.com',
  37.  
  38.         // optional, Standard ist 80
  39.         'port' => 'Port zu dem verbunden wird',
  40.  
  41.         // benötigt
  42.         'path'              => 'Pfad der Wolke, e.g. /RPC2',
  43.         'registerProcedure' => 'Prozedur die aufgerufen wird, '
  44.                             .  'z.B. myCloud.rssPleaseNotify'
  45.         'protocol'          => 'Protokoll das verwendet wird, z.B. '
  46.                             .  'soap oder xml-rpc'
  47.     ),
  48.  
  49.     // optional, ignoriert wenn Atom verwendet wird
  50.     // Eine Texteingabebox die im Feed angezeigt werden kann
  51.     'textInput' => array(
  52.         // benötigt
  53.         'title'       => 'Die Überschrift des Senden Buttons im '
  54.                       .  'Texteingabefeld',
  55.         'description' => 'Beschreibt das Texteingabefeld',
  56.         'name'        => 'Der Name des Text Objekts im '
  57.                       .  'Texteingabefeld',
  58.         'link'        => 'Die URL des CGI Skripts das Texteingabe '
  59.                       .  'Anfragen bearbeitet'
  60.     ),
  61.  
  62.     // optional, ignoriert wenn Atom verwendet wird
  63.     // Hinweise geben welche Stunden übersprungen werden können
  64.     'skipHours'   => array(
  65.         // bis zu 24 Zeilen dessen Werte eine Nummer zwischen 0 und 23 ist
  66.         // z.B. 13 (1pm)
  67.         'hour in 24 format'
  68.     ),
  69.  
  70.     // optional, ignoriert wenn Atom verwendet wird
  71.     // Hinweise geben welche Tage übersprungen werden können
  72.     'skipDays '   => array(
  73.         // bis zu 7 Zeilen dessen Werte Montag, Dienstag, Mittwoch,
  74.         // Donnerstag, Freitag, Samstag oder Sonntag sind
  75.         // z.B. Montag
  76.         'a day to skip'
  77.     ),
  78.  
  79.     // optional, ignoriert wenn Atom verwendet wird
  80.     // Itunes Erweiterungsdaten
  81.     'itunes' => array(
  82.         // optional, Standard ist der Wert der author Spalte
  83.         'author' => 'Musiker Spalte',
  84.  
  85.         // optional, Standard ist der Wert der author Spalte
  86.         // Eigentümer des Podcasts
  87.         'owner' => array(
  88.             'name'  => 'Name des Eigentümers',
  89.             'email' => 'Email des Eigentümers'
  90.         ),
  91.  
  92.         // optional, Standard ist der image Wert
  93.         'image' => 'Album/Podcast Bild',
  94.  
  95.         // optional, Standard ist der description Wert
  96.         'subtitle' => 'Kurzbeschreibung',
  97.         'summary'  => 'Langbeschreibung',
  98.  
  99.         // optional
  100.         'block' => 'Verhindern das eine Episode erscheint (ja|nein)',
  101.  
  102.         // benötigt
  103.         // 'Kategoriespalte und iTunes Music Store Browse'
  104.         'category' => array(
  105.             // bis zu 3 Zeilen
  106.             array(
  107.                 // benötigt
  108.                 'main' => 'Hauptkategorie',
  109.  
  110.                 // optional
  111.                 'sub'  => 'Unterkategorie'
  112.             ),
  113.         ),
  114.  
  115.         // optional
  116.         'explicit'     => 'Elterliche Anweisungsspalte (ja|nein|löschen)',
  117.         'keywords'     => 'Eine kommagetrennte Liste von maximal '
  118.                        .  '12 Schlüsselwörtern',
  119.         'new-feed-url' => 'Verwendet um iTunes über eine neue URL '
  120.                        .  'Lokation zu informieren'
  121.     ),
  122.  
  123.     'entries' => array(
  124.         array(
  125.             // benötigt
  126.             'title' => 'Titel des Feedeintrags',
  127.             'link'  => 'URL zum Feedeintrag',
  128.  
  129.             // benötigt, nur Text, kein HTML
  130.             'description'  => 'Kurzversion des Feedeintrags',
  131.  
  132.             //optional
  133.             'guid' => 'Id des Artikels, wenn nicht angegeben '
  134.                    .  'wird der link Wert verwendet',
  135.  
  136.             // optional, kann HTML enthalten
  137.             'content' => 'Langversion',
  138.  
  139.             // optional
  140.             'lastUpdate' => 'Zeitstempel des Veröffnetlichungsdatums',
  141.             'comments'   => 'Kommentarseite des Feedeintrags',
  142.             'commentRss' => 'Die FeedURL der zugehörenden Kommentare',
  143.  
  144.             // optional, Originale Quelle des Feedeintrags
  145.             'source' => array(
  146.                 // benötigt
  147.                 'title' => 'Titel der Originalen Quelle',
  148.                 'url'   => 'URL der originalen Quelle'
  149.             ),
  150.  
  151.             // optional, Liste der zugeordneten Kategorien
  152.             'category' => array(
  153.                 array(
  154.                     // benötigt
  155.                     'term' => 'Überschrift der ersten Kategorie',
  156.  
  157.                     // optional
  158.                     'scheme' => 'URL die das Kategorisierungsschema '
  159.                              .  'identifiziert'
  160.                 ),
  161.  
  162.                 array(
  163.                     //Daten der zweiten Kategorie und so weiter
  164.                 )
  165.             ),
  166.  
  167.             // optional, Liste der Anhänge des Feedeintrags
  168.             'enclosure' => array(
  169.                 array(
  170.                     // benötigt
  171.                     'url' => 'URL des verlinkten Anhangs',
  172.  
  173.                     // optional
  174.                     'type'   => 'Mime Typ des Anhangs',
  175.                     'length' => 'Länge des verlinkten Inhalts oktal'
  176.                 ),
  177.  
  178.                 array(
  179.                     // Daten für den zweiten Anhang und so weiter
  180.                 )
  181.             )
  182.         ),
  183.  
  184.         array(
  185.             // Daten für den zweiten Eintrag und so weiter
  186.         )
  187.     )
  188. );

Referenzen:

Importieren einer eigenen Daten Quelle

Eine Zend_Feed Instanz kann von jeder Datenquelle erstellt werden die Zend_Feed_Builder_Interface implementiert. Die getHeader() und getEntries() Methoden müssen implementiert werden damit das Objekt mit Zend_Feed::importBuilder() verwendet werden kann. Als einfache Referenz Implementation kann Zend_Feed_Builder verwendet werden, welches ein Array im Contructor entgegen nimmt, einige einfache Prüfungen durchführt, und anschließend in der importBuilder() Methode verwendet werden kann. Die getHeader() Methode muß eine Instanz von Zend_Feed_Builder_Header zurückgeben, und getEntries() muß ein Array von Zend_Feed_Builder_Entry Instanzen zurückgeben.

Note: Zend_Feed_Builder arbeitet als konkrete Implementation um die Verwendung zu demonstrieren. Benutzer sind angehlaten Ihre eigenen Klassen zu Erstellen um Zend_Feed_Builder_Interface zu implementieren.

Hier ist ein Beispiel der Verwendung von Zend_Feed::importBuilder():

  1. // Einen Feed von einer eigenen Erstellungsquelle importieren
  2. $atomFeedFromArray =
  3.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array));
  4.  
  5. // Die folgende Zeile ist mit der obigen äquivalent; standardmäßig
  6. // wird eine Zend_Feed_Atom Instanz zurückgegeben
  7. $atomFeedFromArray =
  8.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'atom');
  9.  
  10. // Einen RSS Feeed von einem Array von eigenen Erstellungsquellen importieren
  11. $rssFeedFromArray =
  12.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'rss');

Ausgeben des Inhalts eines Feeds

Um den Inhalt einer Zend_Feed_Abstract Instanz auszugeben können die send() oder saveXml() Methoden verwendet werden.

  1. assert($feed instanceof Zend_Feed_Abstract);
  2.  
  3. // Den Feed an der Standardausgabe ausgeben
  4. print $feed->saveXML();
  5.  
  6. // HTTP Header und den Feed ausgeben
  7. $feed->send();

Einführung