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

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


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

Это старая версия документа.


Создание RSS-ленты

RSS - это удобно ;). Через фиды можно отдавать в принципе все, что угодно: последние новости, статьи, события, акции, обновления (dokuwiki отдает свои обновления также через rss). Существует немалое количество сайтов, которые позволяют следить сразу на несколькими лентами одновременно (Google Reader, Яндекс.Лента и т.д.).

Для организации RSS-ленты нам понадобятся три файла

Данные классы лучше сохранить в web/lib/<Project>.Site/Feeds/. Они полностью описывают спецификацию 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 без шаблона.

<page uri="/news/rss/">
    <actions>Panda.Site.GetNewsRss</actions>
</page>

Panda.Site.xml

Сделаем так, чтобы мы смогли задавать количество выводимых новостей в виде параметра.

<action name="GetNewsRss">
    <path>news/GetNewsRss</path>
    <parameters>
        <request>
            <param name="gnr_Count">20</param>
        </request>
    </parameters>
</action>

GetNewsRss.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();
        }
    }
?>
  • У $channel и $item есть много интересных свойств, которые мы не использовали в примере (например, установить картинку).
  • Метод $channel→Validate() расскажет об ошибках, если вдруг у вас не хочет отображаться канал.

После этих действий по адресу http://panda/news/rss/ отобразится RSS-лента.

header.tmpl.php

Существует простой способ рассказать пользователям о том, что у вас есть RSS на сайте. Для этого добавьте столько <link> в <head>, сколько у вас каналов.

<link href="http://panda/news/rss/" rel="alternate" type="application/rss+xml" title="Panda.Ru: Новости" />
eaze/samples/создание_rss_ленты.1316772266.txt.gz · Последние изменения: 2011/09/23 14:04 — sergeyfast