Zend_Feed-Importing.xml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. <sect1 id="zend.feed.importing">
  2. <title>Importowanie kanałów informacyjnych</title>
  3. <para>
  4. <code>Zend_Feed</code> pozwala programistom bardzo łatwo odbierać wiadomości
  5. z kanałów informacyjnych. Jeśli znasz adres URI kanału, w prosty sposób
  6. użyj metody <code>Zend_Feed::import()</code>:
  7. </para>
  8. <programlisting role="php"><![CDATA[
  9. $feed = Zend_Feed::import('http://feeds.example.com/feedName');
  10. ]]>
  11. </programlisting>
  12. <para>
  13. Możesz także użyć <code>Zend_Feed</code> do pobrania zawartości kanału
  14. z pliku lub z łańcucha znaków PHP:
  15. </para>
  16. <programlisting role="php"><![CDATA[
  17. // importowanie kanału z pliku tekstowego
  18. $feedFromFile = Zend_Feed::importFile('feed.xml');
  19. // importowanie kanału z łańcucha znaków PHP
  20. $feedFromPHP = Zend_Feed::importString($feedString);
  21. ]]>
  22. </programlisting>
  23. <para>
  24. We wszystkich powyższych przykładach w razie powodzenia operacji zwracany
  25. jest obiekt klasy rozszerzającej <code>Zend_Feed_Abstract</code>, zależenie
  26. od typu kanału. Jeśli zostały odebrane dane RSS za pomocą jednej z powyższych
  27. metod importu, wtedy będzie zwrócony obiekt <code>Zend_Feed_Rss</code>.
  28. Z drugiej strony, gdy będą importowane dane kanału Atom, zwrócony zostanie
  29. obiekt <code>Zend_Feed_Atom</code>. Metody importu w razie niepowodzenia
  30. wyrzucają wyjątek <code>Zend_Feed_Exception</code>, czyli na przykład wtedy
  31. gdy nie jest możliwe odczytanie kanału lub gdy dane są błędne.
  32. </para>
  33. <sect2 id="zend.feed.importing.custom">
  34. <title>Własne kanały</title>
  35. <para>
  36. <code>Zend_Feed</code> pozwala programistom na bardzo łatwe
  37. tworzenie własnych kanałów. Musisz jedynie utworzyć tablicę i
  38. zaimportować ją za pomocą Zend_Feed. Ta tablica może być
  39. zaimportowana za pomocą metody <code>Zend_Feed::importArray()</code>
  40. lub <code>Zend_Feed::importBuilder()</code>. W tym drugim przypadku
  41. tablica zostanie utworzona w locie, przez własne źródło danych
  42. implementujące interfejs <code>Zend_Feed_Builder_Interface</code>.
  43. </para>
  44. <sect3 id="zend.feed.importing.custom.importarray">
  45. <title>Importowanie własnej tablicy</title>
  46. <programlisting role="php"><![CDATA[
  47. // importowanie kanału z tablicy
  48. $atomFeedFromArray = Zend_Feed::importArray($array);
  49. // poniższy kod odpowiada kodowi powyżej;
  50. // domyślnie zwracana jest instancja Zend_Feed_Atom
  51. $atomFeedFromArray = Zend_Feed::importArray($array, 'atom');
  52. // importowanie kanału rss z tablicy
  53. $rssFeedFromArray = Zend_Feed::importArray($array, 'rss');
  54. ]]>
  55. </programlisting>
  56. <para>
  57. Format tablicy musi zgadzać się z taką strukturą:
  58. </para>
  59. <programlisting role="php"><![CDATA[
  60. array(
  61. 'title' => 'tytuł kanału', //wymagane
  62. 'link' => 'adres url kanału', //wymagane
  63. 'lastUpdate' => 'data aktualizacji w postaci uniksowego znacznika czasu', // opcjonalne
  64. 'published' => 'data publikacji w postaci uniksowego znacznika czasu', //opcjonalne
  65. 'charset' => 'zestaw znaków dla danych tekstowych', // wymagane
  66. 'description' => 'krótki opis kanału', //opcjonalne
  67. 'author' => 'autor kanału', //opcjonalne
  68. 'email' => 'adres email autora', //opcjonalne
  69. 'webmaster' => // opcjonalne, ignorowane jeśli używany jest atom
  70. 'adres osoby odpowiedzialnej' .
  71. 'za sprawy techniczne'
  72. 'copyright' => 'informacje o prawach autorskich', //opcjonalne
  73. 'image' => 'adres obrazka', //opcjonalne
  74. 'generator' => 'generator', // opcjonalne
  75. 'language' => 'język w jakim publikowany jest kanał', // opcjonalne
  76. 'ttl' => // opcjonalne, ignorowane jeśli używany jest atom
  77. 'na jak długo, w minutach, kanał może' .
  78. 'być buforowany przed odświeżeniem',
  79. 'rating' => // opcjonalne, ignorowane jeśli używany jest atom
  80. 'Ocena PICS dla kanału.',
  81. 'cloud' => array(
  82. 'domain' => 'domena usługi cloud, np. rpc.sys.com' // wymagane
  83. 'port' => 'port usługi to' // opcjonalne, domyślnie wartość 80
  84. 'path' => 'ścieżka usługi cloud, np. /RPC2' //wymagane
  85. 'registerProcedure' => 'procedura do wywołania, np. myCloud.rssPleaseNotify' // wymagane
  86. 'protocol' => 'protokół do użycia, np. soap lub xml-rpc' // wymagane
  87. ), // dane usługi cloud umożliwiającej powiadamianie użytkowników o zmianach // opcjonalne, ignorowane jeśli używany jest atom
  88. 'textInput' => array(
  89. 'title' => 'etykieta przycisku wysyłającego treść pola tekstowego' // wymagane,
  90. 'description' => 'wyjaśnienie przeznaczenia pola tekstowego' // wymagane
  91. 'name' => 'nazwa obiektu pola tekstowego' // wymagane
  92. 'link' => 'adres URL skryptu CGI który przetwarza wysłaną treść' // wymagane
  93. ) // pole tekstowe które może być wyświetlone wraz z kanałem // opcjonalne, ignorowane jeśli używany jest atom
  94. 'skipHours' => array(
  95. 'godzina do pominięcia w formacie 24 godzinnym', // np. 13 (1pm)
  96. // do 24 wierszy których wartościami mogą być numery między 0 a 23
  97. ) // Wskazówka mówiąca agregatorom które godziny mogą pominąć // opcjonalne, ignorowane jeśli używany jest atom
  98. 'skipDays ' => array(
  99. 'dzień do pominięcia', // np. Monday
  100. // do 7 wierszy, których wartościami mogą być Monday, Tuesday, Wednesday, Thursday, Friday, Saturday lub Sunday
  101. ) // Wskazówka mówiąca agregatorom które dni mogą pominąć // opcjonalne, ignorowane jeśli używany jest atom
  102. 'itunes' => array(
  103. 'author' => 'nazwa artysty' // opcjonalne, domyślnie wartość z pola author
  104. 'owner' => array(
  105. 'name' => 'nazwa właściciela' // opcjonalne, domyślnie wartość z głównego pola author
  106. 'email' => 'adres email właściciela' // opcjonalne, domyślnie wartość z głównego pola email
  107. ) // właściciel podcasta // opcjonalne
  108. 'image' => 'obrazek albumu/podcasta' // opcjonalne, domyślnie wartość z głownego pola image
  109. 'subtitle' => 'krótki opis' // opcjonalne, domyślnie wartość z głownego pola description
  110. 'summary' => 'dłuższy opis' // opcjonalne, domyślnie wartość z głownego pola description
  111. 'block' => 'zapobiega przed pojawieniem się epizodu (yes|no)' // opcjonalne
  112. 'category' => array(
  113. array('main' => 'głowna kategoria', // wymagane
  114. 'sub' => 'podkategoria' // opcjonalne
  115. ),
  116. // do 3 wierszy
  117. ) // 'Dane kategorii w iTunes Music Store Browse' // wymagane
  118. 'explicit' => 'znaczek kontroli rodzicielskiej (yes|no|clean)' // opcjonalne
  119. 'keywords' => 'lista maksymalnie 12 słów kluczowych oddzielonych przecinkami' // opcjonalne
  120. 'new-feed-url' => 'używane aby poinformować iTunes o nowym adresie URL kanału' // opcjonalne
  121. ) // Dane rozszerzenia Itunes // opcjonalne, ignorowane jeśli używany jest atom
  122. 'entries' => array(
  123. array(
  124. 'title' => 'tytuł wpisu z kanału', //wymagane
  125. 'link' => 'adres do wpisu z kanału', //wymagane
  126. 'description' => 'krótka wersja wpisu z kanału', // jedynie tekst, bez html, wymagane
  127. 'guid' => 'identyfikator artykułu, jeśli nie podany, zostanie użyta wartość z pola link', //opcjonalne
  128. 'content' => 'długa wersja', // może zawierać html, opcjonalne
  129. 'lastUpdate' => 'data publikacji w postaci uniksowego znacznika czasu', // opcjonalne
  130. 'comments' => 'strona komentarzy powiązanych z wpisem w kanale', // opcjonalne
  131. 'commentRss' => 'adres kanału z powiązanymi komentarzami', // opcjonalne
  132. 'source' => array(
  133. 'title' => 'tytuł oryginalnego źródła' // wymagane,
  134. 'url' => 'adres oryginalnego źródła' // wymagane
  135. ) // oryginalne źródło wpisu z kanału // opcjonalne
  136. 'category' => array(
  137. array(
  138. 'term' => 'etykieta pierwszej kategorii' // wymagane,
  139. 'scheme' => 'adres identyfikujący schemat kategoryzowania' // opcjonalne
  140. ),
  141. array(
  142. // dane dla kolejnej kategorii itd.
  143. )
  144. ) // lista powiązanych kategorii // opcjonalne
  145. 'enclosure' => array(
  146. array(
  147. 'url' => 'adres powiązanego załącznika' // wymagane
  148. 'type' => 'typ mime załącznika' // opcjonalne
  149. 'length' => 'długość załącznika w bajtach' // opcjonalne
  150. ),
  151. array(
  152. // dane drugiego załącznika itd.
  153. )
  154. ) // lista załączników dla wpisu kanału // opcjonalne
  155. ),
  156. array(
  157. // dane dla drugiego wpisu itd.
  158. )
  159. )
  160. );
  161. ]]>
  162. </programlisting>
  163. <para>
  164. Odnośniki:
  165. <itemizedlist>
  166. <listitem>
  167. <para>
  168. Specyfikacja RSS 2.0: <ulink url="http://blogs.law.harvard.edu/tech/rss">RSS 2.0</ulink>
  169. </para>
  170. </listitem>
  171. <listitem>
  172. <para>
  173. Specyfikacja Atom: <ulink url="http://tools.ietf.org/html/rfc4287">RFC 4287</ulink>
  174. </para>
  175. </listitem>
  176. <listitem>
  177. <para>
  178. Specyfikacja WFW: <ulink url="http://wellformedweb.org/news/wfw_namespace_elements">Well
  179. Formed Web</ulink>
  180. </para>
  181. </listitem>
  182. <listitem>
  183. <para>
  184. Specyfikacja iTunes:
  185. <ulink url="http://www.apple.com/itunes/store/podcaststechspecs.html">Specyfikacja
  186. Techniczna iTunes</ulink>
  187. </para>
  188. </listitem>
  189. </itemizedlist>
  190. </para>
  191. </sect3>
  192. <sect3 id="zend.feed.importing.custom.importbuilder">
  193. <title>Importowanie własnego źródła danych</title>
  194. <para>
  195. Możesz utworzyć instancję Zend_Feed z dowolnego źródła danych
  196. implementując interfejs <code>Zend_Feed_Builder_Interface</code>.
  197. Aby użyć swojego obiektu za pomocą metody
  198. <code>Zend_Feed::importBuilder()</code> musisz po prostu
  199. zaimplementować metody <code>getHeader()</code> oraz
  200. <code>getEntries()</code>. Jako przykład implementacji możesz
  201. użyć klasy <code>Zend_Feed_Builder</code>, która przyjmuje
  202. tablicę jako argument konstruktora, przeprowadza pewną
  203. weryfikację, a następnie może być użyta za pomocą metody
  204. <code>importBuilder()</code>. Metoda <code>getHeader()</code>
  205. musi zwracać instancję klasy
  206. <code>Zend_Feed_Builder_Header</code>, a metoda
  207. <code>getEntries()</code> musi zwracać tablicę instancji klasy
  208. <code>Zend_Feed_Builder_Entry</code>.
  209. </para>
  210. <note>
  211. <para>
  212. <code>Zend_Feed_Builder</code> jest konkretną implementacją
  213. pokazującą sposób użycia. Namawiamy użytkownika do napisania
  214. własnej klasy, implementującej interfejs
  215. <code>Zend_Feed_Builder_Interface</code>.
  216. </para>
  217. </note>
  218. <para>
  219. Oto przykład użycia metody <code>Zend_Feed::importBuilder()</code>:
  220. </para>
  221. <programlisting role="php"><![CDATA[
  222. // importowanie kanału z własnego źródła
  223. $atomFeedFromArray =
  224. Zend_Feed::importBuilder(new Zend_Feed_Builder($array));
  225. // poniższy kod odpowiada kodowi powyżej;
  226. // domyślnie zwracana jest instancja Zend_Feed_Atom
  227. $atomFeedFromArray =
  228. Zend_Feed::importArray(new Zend_Feed_Builder($array), 'atom');
  229. // importowanie kanału rss z własnego źródła
  230. $rssFeedFromArray =
  231. Zend_Feed::importArray(new Zend_Feed_Builder($array), 'rss');
  232. ]]>
  233. </programlisting>
  234. </sect3>
  235. <sect3 id="zend.feed.importing.custom.dump">
  236. <title>Zrzucanie zawartości kanału</title>
  237. <para>
  238. Aby zrzucić zawartość instancji <code>Zend_Feed_Abstract</code>,
  239. możesz użyć metody <code>send()</code> lub <code>saveXml()</code>.
  240. </para>
  241. <programlisting role="php">
  242. <![CDATA[
  243. assert($feed instanceof Zend_Feed_Abstract);
  244. // zrzuca kanał do standardowego wyjścia
  245. print $feed->saveXML();
  246. // wysyła nagłówki oraz zrzuca zawartość kanału
  247. $feed->send();
  248. ]]>
  249. </programlisting>
  250. </sect3>
  251. </sect2>
  252. </sect1>