Инструменты пользователя

Инструменты сайта


eaze:samples:создание_rss_ленты

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Both sides previous revision Предыдущая версия
Последняя версия Both sides next revision
eaze:samples:создание_rss_ленты [2011/09/22 22:41]
sergeyfast
eaze:samples:создание_rss_ленты [2011/09/23 14:04]
sergeyfast
Строка 1: Строка 1:
 ====== Создание RSS-ленты ====== ====== Создание RSS-ленты ======
  
-RSS - это удобно ;). +RSS - это удобно ;). Через фиды можно отдавать в принципе все, что угодно:​ последние новости,​ статьи,​ события,​ акции, обновления (dokuwiki [[http://​wiki.eaze.ru/​feed.php|отдает свои обновления]] также через rss). Существует немалое количество сайтов,​ которые позволяют следить сразу на несколькими лентами одновременно ([[https://​www.google.com/​reader/​|Google Reader]], [[http://​lenta.yandex.ru|Яндекс.Лента]] и [[https://​encrypted.google.com/​search?​client=opera&​rls=ru&​q=rss+reader&​sourceid=opera&​ie=utf-8&​oe=utf-8&​channel=suggest|т.д.]]). 
 Для организации RSS-ленты нам понадобятся три файла Для организации RSS-ленты нам понадобятся три файла
-  * RssChannel.php +  * {{:​eaze:​samples:​rsschannel.phps|RssChannel.php}} 
-  * RssItem.php +  * {{:​eaze:​samples:​rssitem.phps|RssItem.php}}  
-  * RssWriter.php+  * {{:​eaze:​samples:​rsswriter.phps|RssWriter.php}} 
 + 
 +Данные классы лучше сохранить в ''​web/​lib/<​Project>​.Site/​Feeds/''​. Они полностью описывают [[http://​cyber.law.harvard.edu/​rss/​rss.html|спецификацию RSS 2.0]] 
 + 
 +===== Реализация ===== 
 + 
 +**Задача**:​ сделать rss для страницы новостей по адресу http://​panda/​news/​rss/​ в проекте Panda.Trunk.  
 + 
 +Для начала скопируем полученные три файла в ''​Panda.Site/​Feeds''​. Далее, добавим запись о странице ''/​news/​rss/'',​ затем описание GetNewsRss в ''​lib/​Panda.Site/​Panda.Site.xml''​ и сам action в ''​lib/​Panda.Site/​actions/​news/​GetNewsRss.php''​. 
 + 
 + 
 +==== pages.xml ==== 
 +В pages.xml нам нужен только url и action без шаблона. 
 +<code xml> 
 +<page uri="/​news/​rss/">​ 
 +    <​actions>​Panda.Site.GetNewsRss</​actions>​ 
 +</​page>​ 
 +</​code>​ 
 +==== Panda.Site.xml ==== 
 +Сделаем так, чтобы мы смогли задавать количество выводимых новостей в виде параметра. 
 +<code xml> 
 +<action name="​GetNewsRss">​ 
 +    <​path>​news/​GetNewsRss</​path>​ 
 +    <​parameters>​ 
 +        <​request>​ 
 +            <param name="​gnr_Count">​20</​param>​ 
 +        </​request>​ 
 +    </​parameters>​ 
 +</​action>​ 
 +</​code>​ 
 + 
 +==== GetNewsRss.php ==== 
 + 
 +<code php> 
 +<?php 
 +    Package::​Load( '​Panda.Site/​Feeds'​ ); 
 + 
 +    /** 
 +     * GetNewsRss Action 
 +     * @package ​   Panda 
 +     * @subpackage Site 
 +     * @author ​    ​Sergeyfast 
 +     */ 
 +    class GetNewsRss { 
 + 
 +        /** 
 +         * Get Rss Channel 
 +         * @param News[] $news 
 +         * @return RssChannel 
 +         */ 
 +        private function getChannel( $news ) { 
 +            $channel ​             = new RssChannel();​ 
 +            $channel->​Title ​      = '​Panda.Ru:​ Новости';​ 
 +            $channel->​Description = '​Panda.Ru';​ 
 +            $channel->​Link ​       = Site::​GetWebPath( '/​news/'​ ); 
 +            $channel->​PubDate ​    = DateTimeWrapper::​Now();​ 
 +            $channel->​Ttl ​        = 3; 
 + 
 +            foreach ( $news as $newsItem ) { 
 +                $item              = new RssItem();​ 
 +                $item->​Title ​      = $newsItem->​title;​ 
 +                $item->​Description = $newsItem->​foreword;​ 
 +                $item->​Link ​       = $channel->​Link . $newsItem->​newsId . '/';​ 
 +                $item->​Author ​     = '​Panda.Ru';​ 
 +                $item->​Guid ​       = '​news-'​ . $newsItem->​newsId;​ 
 +                $item->​PubDate ​    = $newsItem->​publicationDate;​ 
 +                 
 +                $item->​AddCategory( $newsItem->​category->​title,​ $channel->​Link . $newsItem->​category->​alias . '/'​ ); 
 + 
 +                $channel->​Items[] ​ = $item; 
 +            } 
 + 
 +            return $channel; 
 +        } 
 + 
 + 
 +        /** 
 +         * Entry Point 
 +         */ 
 +        public function Execute() { 
 +            $count ​  = Request::​getInteger( '​gnr_Count'​ ); 
 +            $news    = NewsFactory::​Get( 
 +                array( '​pageSize'​ => $count, '​endDate'​ => DateTimeWrapper::​Now() ) 
 +                , array( BaseFactory::​OrderBy => '"​publicationDate"​ DESC' ) 
 +            ); 
 + 
 +            $channel = $this->​getChannel( $news ); 
 + 
 +            $writer ​ = new RssWriter( $channel ); 
 +            $writer->​Flush();​ 
 +        } 
 +    } 
 +?> 
 +</​code>​ 
 +  * У $channel и $item есть много интересных свойств,​ которые мы не использовали в примере (например,​ установить картинку). 
 +  * Метод $channel->​Validate() расскажет об ошибках,​ если вдруг у вас не хочет отображаться канал. 
 + 
 +После этих действий по адресу http://​panda/​news/​rss/​ отобразится RSS-лента. 
 + 
 +==== header.tmpl.php ====
  
-FIXME+Существует простой способ рассказать пользователям о том, что у вас есть RSS на сайте. Для этого добавьте столько <​link>​ в <​head>,​ сколько у вас каналов.
  
 +<code html>
 +<link href="​http://​panda/​news/​rss/"​ rel="​alternate"​ type="​application/​rss+xml"​ title="​Panda.Ru:​ Новости"​ />
 +</​code>​
eaze/samples/создание_rss_ленты.txt · Последние изменения: 2011/09/23 14:38 — sergeyfast