Zend_Feed-Importing.xml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.feed.importing">
  5. <title>Importer des flux</title>
  6. <para>
  7. <classname>Zend_Feed</classname> permet aux développeurs d'obtenir très facilement
  8. des flux. Si vous connaissez l'URI d'un flux, utilisez simplement la méthode
  9. <methodname>Zend_Feed::import()</methodname>&#160;:
  10. </para>
  11. <programlisting language="php"><![CDATA[
  12. $flux = Zend_Feed::import('http://flux.example.com/nomDuFlux');
  13. ]]></programlisting>
  14. <para>
  15. Vous pouvez aussi utiliser <classname>Zend_Feed</classname> pour aller chercher le
  16. contenu d'un flux à partir d'un fichier ou d'une chaîne <acronym>PHP</acronym>&#160;:
  17. </para>
  18. <programlisting language="php"><![CDATA[
  19. // on importe un flux à partir d'un fichier texte
  20. $fluxAPartirDeFichierTexte = Zend_Feed::importFile('flux.xml');
  21. // on importe un flux à partir d'une variable PHP de type chaîne
  22. $fluxAPartirDePHP = Zend_Feed::importString($chaineFlux);
  23. ]]></programlisting>
  24. <para>
  25. Dans chacun des exemples ci-dessus, une instance d'une classe étendant
  26. <classname>Zend_Feed_Abstract</classname> est renvoyée en cas de succès, selon le type du
  27. flux. Si un flux <acronym>RSS</acronym> a été obtenu au moyen de l'une des méthodes d'importation décrites
  28. ci-dessus, alors un objet <classname>Zend_Feed_Rss</classname> sera renvoyé. Par contre, si
  29. un flux Atom a été importé, alors un objet <classname>Zend_Feed_Atom</classname> est
  30. renvoyé. Les méthodes d'importation déclencheront aussi une exception
  31. <classname>Zend_Feed_Exception</classname> en cas d'échec, par exemple si le flux est
  32. illisible ou malformé.
  33. </para>
  34. <sect2 id="zend.feed.importing.custom">
  35. <title>Flux personnalisés</title>
  36. <para>
  37. <classname>Zend_Feed</classname> permet aux développeurs de créer du flux
  38. personnalisé très facilement. Vous devez juste créer un tableau et l'importer avec
  39. Zend_Feed. Ce tableau peut être importé avec
  40. <methodname>Zend_Feed::importArray()</methodname> ou avec
  41. <methodname>Zend_Feed::importBuilder()</methodname>. Dans ce dernier cas, le tableau sera
  42. calculé instantanément par une source de données personnalisée implémentant
  43. <classname>Zend_Feed_Builder_Interface</classname>.
  44. </para>
  45. <sect3 id="zend.feed.importing.custom.importarray">
  46. <title>Importer un tableau personnalisé</title>
  47. <programlisting language="php"><![CDATA[
  48. // on importe un flux atom à partir d'un tableau
  49. $atomFeedFromArray = Zend_Feed::importArray($array);
  50. // la ligne suivante est équivalente à celle ci-dessus ;
  51. // par défaut l'instance Zend_Feed_Atom est retournée
  52. $atomFeedFromArray = Zend_Feed::importArray($array, 'atom');
  53. // on importe un flux rss à partir d'un tableau
  54. $rssFeedFromArray = Zend_Feed::importArray($array, 'rss');
  55. ]]></programlisting>
  56. <para>Le format du tableau doit être conforme à cette structure&#160;:</para>
  57. <programlisting language="php"><![CDATA[
  58. array(
  59. // obligatoire
  60. 'title' => 'titre du flux',
  61. 'link' => 'url canonique du flux',
  62. // optionel
  63. 'lastUpdate' => 'date de la mise à jour au format timestamp',
  64. 'published' => 'date de la publication au format timestamp',
  65. // obligatoire
  66. 'charset' => 'charset des données textuelles',
  67. // optionel
  68. 'description' => 'description courte du flux',
  69. 'author' => 'auteur du flux',
  70. 'email' => 'email de l'auteur du flux',
  71. // optionel, ignoré si le flux est de type atom
  72. 'webmaster' => 'email de la personne responsable'
  73. . 'en cas de problème technique'
  74. // optionel
  75. 'copyright' => 'informations de copyright',
  76. 'image' => 'url de l'image',
  77. 'generator' => 'générateur du flux',
  78. 'language' => 'langue dans la quelle le flux est écrit',
  79. // optionel, ignoré si le flux est de type atom
  80. 'ttl' => 'combien de temps en minutes un flux peut être'
  81. . 'mis en cache avant rafraichissement',
  82. 'rating' => 'l'évaluation PICS du canal',
  83. // optionel, ignoré si le flux est de type atom
  84. // un nuage pour être averti des mises à jour
  85. 'cloud' => array(
  86. // obligatoire
  87. 'domain' => 'domaine du nuage, ex. rpc.sys.com',
  88. // optionel, par défault port 80
  89. 'port' => 'port de connexion',
  90. // obligatoire
  91. 'path' => 'chemin du nuage, ex. /RPC2',
  92. 'registerProcedure' => 'procédure à appeler, '
  93. . 'ex. myCloud.rssPleaseNotify',
  94. 'protocol' => 'protocole à utiliser , ex. soap ou xml-rpc',
  95. ),
  96. // optionel, ignoré si le flux est de type atom
  97. // une boîte de saisie qui peut être montrée avec le flux
  98. 'textInput' => array(
  99. // obligatoire
  100. 'title' => 'l'intitulé du bouton de validation '
  101. . 'de la boîte de saisie',
  102. 'description' => 'explication de la boîte de saisie',
  103. 'name' => 'le nom de l'objet texte',
  104. 'link' => 'l'URL du CGI qui va analyser la requête',
  105. )
  106. // optionel, ignoré si le flux est de type atom
  107. // Information disant aux aggrégateurs quelles heures ils peuvent ignorer
  108. 'skipHours' => array(
  109. // jusqu'à 24 lignes dont les valeurs
  110. // sont des nombres commpris entre 0 et 23
  111. // ex. 13 (1pm)
  112. 'heures dans le format 24H',
  113. )
  114. // optionel, ignoré si le flux est de type atom
  115. // Information disant aux aggrégateurs quels jours ils peuvent ignorer
  116. 'skipDays ' => array(
  117. // jusqu'à 7 lignes dont les valeurs peuvent être
  118. // Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday
  119. // ex. Monday
  120. 'jour'
  121. )
  122. // optionel, ignoré si le flux est de type atom
  123. // Données d'extension iTunes
  124. 'itunes' => array(
  125. // optionel, par défaut l'auteur principal
  126. 'author' => 'nom de l'artiste',
  127. // optionel, default l'auteur principal
  128. 'owner' => array(
  129. 'name' => 'nom du propriétaire' ,
  130. 'email' => 'email du propriétaire',
  131. )
  132. // optionel, default to the main image value
  133. 'image' => 'image de l'album/podcast',
  134. // optionel, default to the main description value
  135. 'subtitle' => 'description courte',
  136. // optionel, default to the main description value
  137. 'summary' => 'description longue',
  138. // optionel
  139. 'block' => 'empêcher l'apparition d'un épisode (yes|no)',
  140. // obligatoire, catégorie et information de recherche
  141. // dans iTunes Music Store
  142. 'category' => array(
  143. // jusqu'à 3 lignes
  144. array(
  145. // obligatoire
  146. 'main' => 'catégorie principale',
  147. // optionel
  148. 'sub' => 'sous-catégorie'
  149. ),
  150. )
  151. // optionel
  152. 'explicit' => 'graphique d'avertissement parental (yes|no|clean)',
  153. 'keywords' => 'une liste d'au maximum 12 mot clés'
  154. . 'séparés par des virgules',
  155. 'new-feed-url' => 'utiliser pour informer iTunes'
  156. . 'd'un nouvel URL de flux',
  157. )
  158. 'entries' => array(
  159. array(
  160. // obligatoire
  161. 'title' => 'titre de l'item',
  162. 'link' => 'url de cet item',
  163. // obligatoire, seulement du text, pas d'html
  164. 'description' => 'version raccourci du texte',
  165. // optionel
  166. 'guid' => 'id de l'article, si aucun alors'
  167. . 'la valeur link est utilisée',
  168. // optionel, peut contenir html
  169. 'content' => 'version complète de l'information',
  170. // optionel
  171. 'lastUpdate' => 'date de publication au format timestamp',
  172. 'comments' => 'page de commentaires de l'item',
  173. 'commentRss' => 'l'url du flux des commentaires associés',
  174. // optionel, source originale de l'item
  175. 'source' => array(
  176. // obligatoire
  177. 'title' => 'titre de la source originale',
  178. 'url' => 'url de la source originale'
  179. )
  180. // optionel, liste des catégories attachées
  181. 'category' => array(
  182. array(
  183. // obligatoire
  184. 'term' => 'intitulé de la première catégorie',
  185. // optionel
  186. 'scheme' => 'url qui décrit l'organisation de la catégorie'
  187. ),
  188. array(
  189. //données de la seconde catégorie et ainsi de suite
  190. )
  191. ),
  192. // optionel, liste des pièces jointes à l'item
  193. 'enclosure' => array(
  194. array(
  195. // obligatoire
  196. 'url' => 'url de la pièce jointe',
  197. // optionel
  198. 'type' => 'type mime de la pièce jointe',
  199. 'length' => 'length de la pièce jointe en octets'
  200. ),
  201. array(
  202. //données de la seconde pièce jointe et ainsi de suite
  203. )
  204. )
  205. ),
  206. array(
  207. //données du second item et ainsi de suite
  208. )
  209. )
  210. );
  211. ]]></programlisting>
  212. <para>
  213. Références :
  214. <itemizedlist>
  215. <listitem>
  216. <para>Spécification <acronym>RSS</acronym> 2.0&#160;:
  217. <ulink url="http://blogs.law.harvard.edu/tech/rss">RSS 2.0</ulink>
  218. </para>
  219. </listitem>
  220. <listitem>
  221. <para>
  222. Spécification Atom&#160;:
  223. <ulink url="http://tools.ietf.org/html/rfc4287">RFC 4287</ulink>
  224. </para>
  225. </listitem>
  226. <listitem>
  227. <para>
  228. Spécification WFW&#160;:
  229. <ulink url="http://wellformedweb.org/news/wfw_namespace_elements">Well
  230. Formed Web</ulink>
  231. </para>
  232. </listitem>
  233. <listitem>
  234. <para>
  235. Spécification iTunes&#160;:
  236. <ulink url="http://www.apple.com/itunes/store/podcaststechspecs.html">
  237. iTunes Technical Specifications</ulink>
  238. </para>
  239. </listitem>
  240. </itemizedlist></para>
  241. </sect3>
  242. <sect3 id="zend.feed.importing.custom.importbuilder">
  243. <title>Importer une source de données personnalisée</title>
  244. <para>
  245. Vous pouvez créer une instance Zeed_Feed à partir de n'importe quelle source
  246. de données implémentant <classname>Zend_Feed_Builder_Interface</classname>. Vous
  247. devez juste implémenter les méthodes <methodname>getHeader()</methodname> et
  248. <methodname>getEntries()</methodname> pour pouvoir utiliser votre objet avec
  249. <methodname>Zend_Feed::importBuilder()</methodname>. Par une simple référence
  250. d'implémentation vous pouvez utiliser <classname>Zend_Feed_Builder</classname>, qui
  251. prend un tableau dans son constructeur, réalise quelques validations mineures, et
  252. peut être utilisé dans la méthode <methodname>importBuilder()</methodname>. La méthode
  253. <methodname>getHeader()</methodname> doit retourner une instance de
  254. <classname>Zend_Feed_Builder_Header</classname>, et <methodname>getEntries()</methodname> doit
  255. retourner un tableau d'instances
  256. <classname>Zend_Feed_Builder_Entry</classname>
  257. </para>
  258. <note>
  259. <para>
  260. <classname>Zend_Feed_Builder</classname> fournit une mise en oeuvre
  261. concrète afin de montrer l'utilisation. Les utilisateurs sont encouragés à
  262. faire leurs classes propres mettre en oeuvre
  263. <classname>Zend_Feed_Builder_Interface</classname>.
  264. </para>
  265. </note>
  266. <para>
  267. Voici un exemple d'utilisation de
  268. <methodname>Zend_Feed::importBuilder()</methodname>&#160;:
  269. </para>
  270. <programlisting language="php"><![CDATA[
  271. // importe un flux atom à partir d'un constructeur personnalisé
  272. $atomFeedFromArray =
  273. Zend_Feed::importBuilder(new Zend_Feed_Builder($array));
  274. // la ligne suivante est équivalente à celle ci-dessus ;
  275. // par défaut l'instance Zend_Feed_Atom est retournée
  276. $atomFeedFromArray =
  277. Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'atom');
  278. // importe un flux rss à partir d'un constructeur personnalisé
  279. $rssFeedFromArray =
  280. Zend_Feed::importBuilder(new Zend_Feed_Builder($array), 'rss');
  281. ]]></programlisting>
  282. </sect3>
  283. <sect3 id="zend.feed.importing.custom.dump">
  284. <title>Décharger le contenu d'un flux</title>
  285. <para>
  286. Pour décharger le contenu d'une instance
  287. <classname>Zend_Feed_Abstract</classname>, vous pouvez utiliser les méthodes
  288. <methodname>send()</methodname> ou <code>saveXml().</code>
  289. </para>
  290. <programlisting language="php"><![CDATA[
  291. assert($feed instanceof Zend_Feed_Abstract);
  292. // décharge le flux dans l'affichage standard
  293. print $feed->saveXML();
  294. // envoie les en-têtes et décharge le flux
  295. $feed->send();
  296. ]]></programlisting>
  297. </sect3>
  298. </sect2>
  299. </sect1>