Zend_Feed permet aux développeurs d'obtenir très facilement
des flux. Si vous connaissez l'URI d'un flux, utilisez simplement la méthode
Zend_Feed::import() :
$flux = Zend_Feed::import('http://flux.example.com/nomDuFlux');
Vous pouvez aussi utiliser Zend_Feed pour aller chercher le
contenu d'un flux à partir d'un fichier ou d'une chaîne PHP :
// on importe un flux à partir d'un fichier texte
$fluxAPartirDeFichierTexte = Zend_Feed::importFile('flux.xml');
// on importe un flux à partir d'une variable PHP de type chaîne
$fluxAPartirDePHP = Zend_Feed::importString($chaineFlux);
Dans chacun des exemples ci-dessus, une instance d'une classe étendant
Zend_Feed_Abstract est renvoyée en cas de succès, selon le type du
flux. Si un flux RSS a été obtenu au moyen de l'une des méthodes d'importation décrites
ci-dessus, alors un objet Zend_Feed_Rss sera renvoyé. Par contre, si
un flux Atom a été importé, alors un objet Zend_Feed_Atom est
renvoyé. Les méthodes d'importation déclencheront aussi une exception
Zend_Feed_Exception en cas d'échec, par exemple si le flux est
illisible ou malformé.
Zend_Feed permet aux développeurs de créer du flux
personnalisé très facilement. Vous devez juste créer un tableau et l'importer avec
Zend_Feed. Ce tableau peut être importé avec
Zend_Feed::importArray() ou avec
Zend_Feed::importBuilder(). Dans ce dernier cas, le tableau sera
calculé instantanément par une source de données personnalisée implémentant
Zend_Feed_Builder_Interface.
// on importe un flux atom à partir d'un tableau $atomFeedFromArray = Zend_Feed::importArray($array); // la ligne suivante est équivalente à celle ci-dessus ; // par défaut l'instance Zend_Feed_Atom est retournée $atomFeedFromArray = Zend_Feed::importArray($array, 'atom'); // on importe un flux rss à partir d'un tableau $rssFeedFromArray = Zend_Feed::importArray($array, 'rss');
Le format du tableau doit être conforme à cette structure :
array(
// obligatoire
'title' => 'titre du flux',
'link' => 'url canonique du flux',
// optionel
'lastUpdate' => 'date de la mise à jour au format timestamp',
'published' => 'date de la publication au format timestamp',
// obligatoire
'charset' => 'charset des données textuelles',
// optionel
'description' => 'description courte du flux',
'author' => 'auteur du flux',
'email' => 'email de l'auteur du flux',
// optionel, ignoré si le flux est de type atom
'webmaster' => 'email de la personne responsable'
. 'en cas de problème technique'
// optionel
'copyright' => 'informations de copyright',
'image' => 'url de l'image',
'generator' => 'générateur du flux',
'language' => 'langue dans la quelle le flux est écrit',
// optionel, ignoré si le flux est de type atom
'ttl' => 'combien de temps en minutes un flux peut être'
. 'mis en cache avant rafraichissement',
'rating' => 'l'évaluation PICS du canal',
// optionel, ignoré si le flux est de type atom
// un nuage pour être averti des mises à jour
'cloud' => array(
// obligatoire
'domain' => 'domaine du nuage, ex. rpc.sys.com',
// optionel, par défault port 80
'port' => 'port de connexion',
// obligatoire
'path' => 'chemin du nuage, ex. /RPC2',
'registerProcedure' => 'procédure à appeler, '
. 'ex. myCloud.rssPleaseNotify',
'protocol' => 'protocole à utiliser , ex. soap ou xml-rpc',
),
// optionel, ignoré si le flux est de type atom
// une boîte de saisie qui peut être montrée avec le flux
'textInput' => array(
// obligatoire
'title' => 'l'intitulé du bouton de validation '
. 'de la boîte de saisie',
'description' => 'explication de la boîte de saisie',
'name' => 'le nom de l'objet texte',
'link' => 'l'URL du CGI qui va analyser la requête',
)
// optionel, ignoré si le flux est de type atom
// Information disant aux aggrégateurs quelles heures ils peuvent ignorer
'skipHours' => array(
// jusqu'à 24 lignes dont les valeurs
// sont des nombres commpris entre 0 et 23
// ex. 13 (1pm)
'heures dans le format 24H',
)
// optionel, ignoré si le flux est de type atom
// Information disant aux aggrégateurs quels jours ils peuvent ignorer
'skipDays ' => array(
// jusqu'à 7 lignes dont les valeurs peuvent être
// Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday
// ex. Monday
'jour'
)
// optionel, ignoré si le flux est de type atom
// Données d'extension iTunes
'itunes' => array(
// optionel, par défaut l'auteur principal
'author' => 'nom de l'artiste',
// optionel, default l'auteur principal
'owner' => array(
'name' => 'nom du propriétaire' ,
'email' => 'email du propriétaire',
)
// optionel, default to the main image value
'image' => 'image de l'album/podcast',
// optionel, default to the main description value
'subtitle' => 'description courte',
// optionel, default to the main description value
'summary' => 'description longue',
// optionel
'block' => 'empêcher l'apparition d'un épisode (yes|no)',
// obligatoire, catégorie et information de recherche
// dans iTunes Music Store
'category' => array(
// jusqu'à 3 lignes
array(
// obligatoire
'main' => 'catégorie principale',
// optionel
'sub' => 'sous-catégorie'
),
)
// optionel
'explicit' => 'graphique d'avertissement parental (yes|no|clean)',
'keywords' => 'une liste d'au maximum 12 mot clés'
. 'séparés par des virgules',
'new-feed-url' => 'utiliser pour informer iTunes'
. 'd'un nouvel URL de flux',
)
'entries' => array(
array(
// obligatoire
'title' => 'titre de l'item',
'link' => 'url de cet item',
// obligatoire, seulement du text, pas d'html
'description' => 'version raccourci du texte',
// optionel
'guid' => 'id de l'article, si aucun alors'
. 'la valeur link est utilisée',
// optionel, peut contenir html
'content' => 'version complète de l'information',
// optionel
'lastUpdate' => 'date de publication au format timestamp',
'comments' => 'page de commentaires de l'item',
'commentRss' => 'l'url du flux des commentaires associés',
// optionel, source originale de l'item
'source' => array(
// obligatoire
'title' => 'titre de la source originale',
'url' => 'url de la source originale'
)
// optionel, liste des catégories attachées
'category' => array(
array(
// obligatoire
'term' => 'intitulé de la première catégorie',
// optionel
'scheme' => 'url qui décrit l'organisation de la catégorie'
),
array(
//données de la seconde catégorie et ainsi de suite
)
),
// optionel, liste des pièces jointes à l'item
'enclosure' => array(
array(
// obligatoire
'url' => 'url de la pièce jointe',
// optionel
'type' => 'type mime de la pièce jointe',
'length' => 'length de la pièce jointe en octets'
),
array(
//données de la seconde pièce jointe et ainsi de suite
)
)
),
array(
//données du second item et ainsi de suite
)
)
);
Références :
-
Spécification RSS 2.0 : RSS 2.0
-
Spécification Atom : RFC 4287
-
Spécification WFW : Well Formed Web
-
Spécification iTunes : iTunes Technical Specifications
Vous pouvez créer une instance Zeed_Feed à partir de n'importe quelle source
de données implémentant Zend_Feed_Builder_Interface. Vous
devez juste implémenter les méthodes getHeader() et
getEntries() pour pouvoir utiliser votre objet avec
Zend_Feed::importBuilder(). Par une simple référence
d'implémentation vous pouvez utiliser Zend_Feed_Builder, qui
prend un tableau dans son constructeur, réalise quelques validations mineures, et
peut être utilisé dans la méthode importBuilder(). La méthode
getHeader() doit retourner une instance de
Zend_Feed_Builder_Header, et getEntries() doit
retourner un tableau d'instances
Zend_Feed_Builder_Entry
Note
Zend_Feed_Builder fournit une mise en oeuvre
concrète afin de montrer l'utilisation. Les utilisateurs sont encouragés à
faire leurs classes propres mettre en oeuvre
Zend_Feed_Builder_Interface.
Voici un exemple d'utilisation de
Zend_Feed::importBuilder() :
// importe un flux atom à partir d'un constructeur personnalisé
$atomFeedFromArray =
Zend_Feed::importBuilder(new Zend_Feed_Builder($array));
// la ligne suivante est équivalente à celle ci-dessus ;
// par défaut l'instance Zend_Feed_Atom est retournée
$atomFeedFromArray =
Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'atom');
// importe un flux rss à partir d'un constructeur personnalisé
$rssFeedFromArray =
Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'rss');
Pour décharger le contenu d'une instance
Zend_Feed_Abstract, vous pouvez utiliser les méthodes
send() ou saveXml().
assert($feed instanceof Zend_Feed_Abstract); // décharge le flux dans l'affichage standard print $feed->saveXML(); // envoie les en-têtes et décharge le flux $feed->send();