Importer des flux

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() :

  1. $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 :

  1. // on importe un flux à partir d'un fichier texte
  2. $fluxAPartirDeFichierTexte = Zend_Feed::importFile('flux.xml');
  3.  
  4. // on importe un flux à partir d'une variable PHP de type chaîne
  5. $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é.

Flux personnalisés

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.

Importer un tableau personnalisé

  1. // on importe un flux atom à partir d'un tableau
  2. $atomFeedFromArray = Zend_Feed::importArray($array);
  3.  
  4. // la ligne suivante est équivalente à celle ci-dessus ;
  5. // par défaut l'instance Zend_Feed_Atom est retournée
  6. $atomFeedFromArray = Zend_Feed::importArray($array, 'atom');
  7.  
  8. // on importe un flux rss à partir d'un tableau
  9. $rssFeedFromArray = Zend_Feed::importArray($array, 'rss');

Le format du tableau doit être conforme à cette structure :

  1.     // obligatoire
  2.     'title'       => 'titre du flux',
  3.     'link'        => 'url canonique du flux',
  4.  
  5.     // optionel
  6.     'lastUpdate'  => 'date de la mise à jour au format timestamp',
  7.     'published'   => 'date de la publication au format timestamp',
  8.  
  9.     // obligatoire
  10.     'charset'     => 'charset des données textuelles',
  11.  
  12.     // optionel
  13.     'description' => 'description courte du flux',
  14.     'author'      => 'auteur du flux',
  15.     'email'       => 'email de l'auteur du flux',
  16.  
  17.      // optionel, ignoré si le flux est de type atom
  18.     'webmaster'   => 'email de la personne responsable'
  19.                    . 'en cas de problème technique'
  20.  
  21.     // optionel
  22.     'copyright'   => 'informations de copyright',
  23.     'image'       => 'url de l'image',
  24.     'generator'   => 'générateur du flux',
  25.     'language'    => 'langue dans la quelle le flux est écrit',
  26.  
  27.     // optionel, ignoré si le flux est de type atom
  28.     'ttl'         => 'combien de temps en minutes un flux peut être'
  29.                    . 'mis en cache avant rafraichissement',
  30.     'rating'      => 'l'évaluation PICS du canal',
  31.  
  32.     // optionel, ignoré si le flux est de type atom
  33.     // un nuage pour être averti des mises à jour
  34.     'cloud'       => array(
  35.         // obligatoire
  36.         'domain'            => 'domaine du nuage, ex. rpc.sys.com',
  37.  
  38.         // optionel, par défault port 80
  39.         'port'              => 'port de connexion',
  40.  
  41.         // obligatoire
  42.         'path'              => 'chemin du nuage, ex. /RPC2',
  43.         'registerProcedure' => 'procédure à appeler, '
  44.                              . 'ex. myCloud.rssPleaseNotify',
  45.         'protocol'          => 'protocole à utiliser , ex. soap ou xml-rpc',
  46.     ),
  47.  
  48.     // optionel, ignoré si le flux est de type atom
  49.     // une boîte de saisie qui peut être montrée avec le flux
  50.     'textInput'   => array(
  51.         // obligatoire
  52.         'title'       => 'l'intitulé du bouton de validation '
  53.                        . 'de la boîte de saisie',
  54.         'description' => 'explication de la boîte de saisie',
  55.         'name'        => 'le nom de l'objet texte',
  56.         'link'        => 'l'URL du CGI qui va analyser la requête',
  57.     )
  58.  
  59.     // optionel, ignoré si le flux est de type atom
  60.     // Information disant aux aggrégateurs quelles heures ils peuvent ignorer
  61.     'skipHours'   => array(
  62.         // jusqu'à 24 lignes dont les valeurs
  63.         // sont des nombres commpris entre 0 et 23
  64.         // ex. 13 (1pm)
  65.         'heures dans le format 24H',
  66.     )
  67.  
  68.     // optionel, ignoré si le flux est de type atom
  69.     // Information disant aux aggrégateurs quels jours ils peuvent ignorer
  70.     'skipDays '   => array(
  71.         // jusqu'à 7 lignes dont les valeurs peuvent être
  72.         // Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday
  73.         // ex. Monday
  74.         'jour'
  75.     )
  76.  
  77.     // optionel, ignoré si le flux est de type atom
  78.     // Données d'extension iTunes
  79.     'itunes'      => array(
  80.         // optionel, par défaut l'auteur principal
  81.         'author'       => 'nom de l'artiste',
  82.  
  83.         // optionel, default l'auteur principal
  84.         'owner'        => array(
  85.             'name'  => 'nom du propriétaire' ,
  86.             'email' => 'email du propriétaire',
  87.         )
  88.  
  89.         // optionel, default to the main image value
  90.         'image'        => 'image de l'album/podcast',
  91.  
  92.         // optionel, default to the main description value
  93.         'subtitle'     => 'description courte',
  94.  
  95.         // optionel, default to the main description value
  96.         'summary'      => 'description longue',
  97.  
  98.         // optionel
  99.         'block'        => 'empêcher l'apparition d'un épisode (yes|no)',
  100.  
  101.         // obligatoire, catégorie et information de recherche
  102.         // dans iTunes Music Store
  103.         'category'     => array(
  104.             // jusqu'à 3 lignes
  105.             array(
  106.                 // obligatoire
  107.                 'main' => 'catégorie principale',
  108.                 // optionel
  109.                 'sub'  => 'sous-catégorie'
  110.             ),
  111.         )
  112.  
  113.         // optionel
  114.         'explicit'     => 'graphique d'avertissement parental (yes|no|clean)',
  115.         'keywords'     => 'une liste d'au maximum 12 mot clés'
  116.                         . 'séparés par des virgules',
  117.         'new-feed-url' => 'utiliser pour informer iTunes'
  118.                         . 'd'un nouvel URL de flux',
  119.     )
  120.  
  121.     'entries'     => array(
  122.         array(
  123.             // obligatoire
  124.             'title'        => 'titre de l'item',
  125.             'link'         => 'url de cet item',
  126.  
  127.             // obligatoire, seulement du text, pas d'html
  128.             'description'  => 'version raccourci du texte',
  129.  
  130.             // optionel
  131.             'guid'         => 'id de l'article, si aucun alors'
  132.                             . 'la valeur link est utilisée',
  133.  
  134.              // optionel, peut contenir html
  135.             'content'      => 'version complète de l'information',
  136.  
  137.             // optionel
  138.             'lastUpdate'   => 'date de publication au format timestamp',
  139.             'comments'     => 'page de commentaires de l'item',
  140.             'commentRss'   => 'l'url du flux des commentaires associés',
  141.  
  142.             // optionel, source originale de l'item
  143.             'source'       => array(
  144.                 // obligatoire
  145.                 'title' => 'titre de la source originale',
  146.                 'url' => 'url de la source originale'
  147.             )
  148.  
  149.             // optionel, liste des catégories attachées
  150.             'category'     => array(
  151.                 array(
  152.                     // obligatoire
  153.                     'term' => 'intitulé de la première catégorie',
  154.  
  155.                     // optionel
  156.                     'scheme' => 'url qui décrit l'organisation de la catégorie'
  157.                 ),
  158.                 array(
  159.                     //données de la seconde catégorie et ainsi de suite
  160.                 )
  161.             ),
  162.  
  163.             // optionel, liste des pièces jointes à l'item
  164.             'enclosure'    => array(
  165.                 array(
  166.                     // obligatoire
  167.                     'url' => 'url de la pièce jointe',
  168.  
  169.                     // optionel
  170.                     'type' => 'type mime de la pièce jointe',
  171.                     'length' => 'length de la pièce jointe en octets'
  172.                 ),
  173.                 array(
  174.                     //données de la seconde pièce jointe et ainsi de suite
  175.                 )
  176.             )
  177.         ),
  178.  
  179.         array(
  180.             //données du second item et ainsi de suite
  181.         )
  182.     )
  183. );

Références :

Importer une source de données personnalisée

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() :

  1. // importe un flux atom à partir d'un constructeur personnalisé
  2. $atomFeedFromArray =
  3.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array));
  4.  
  5. // la ligne suivante est équivalente à celle ci-dessus ;
  6. // par défaut l'instance Zend_Feed_Atom est retournée
  7. $atomFeedFromArray =
  8.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'atom');
  9.  
  10. // importe un flux rss à partir d'un constructeur personnalisé
  11. $rssFeedFromArray =
  12.     Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'rss');

Décharger le contenu d'un flux

Pour décharger le contenu d'une instance Zend_Feed_Abstract, vous pouvez utiliser les méthodes send() ou saveXml().

  1. assert($feed instanceof Zend_Feed_Abstract);
  2.  
  3. // décharge le flux dans l'affichage standard
  4. print $feed->saveXML();
  5.  
  6. // envoie les en-têtes et décharge le flux
  7. $feed->send();
blog comments powered by Disqus