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 нам нужен только url и action без шаблона.
<page uri="/news/rss/"> <actions>Panda.Site.GetNewsRss</actions> </page>
Сделаем так, чтобы мы смогли задавать количество выводимых новостей в виде параметра.
<action name="GetNewsRss"> <path>news/GetNewsRss</path> <parameters> <request> <param name="gnr_Count">20</param> </request> </parameters> </action>
<?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(); } } ?>
После этих действий по адресу http://panda/news/rss/ отобразится RSS-лента.
Существует простой способ рассказать пользователям о том, что у вас есть RSS на сайте. Для этого добавьте столько <link> в <head>, сколько у вас каналов.
<link href="http://panda/news/rss/" rel="alternate" type="application/rss+xml" title="Panda.Ru: Новости" />
Данный способ будет работать во всех нормальных браузерах, кроме Google Chrome, потому что у него нет встроенной RSS-читалки (казалось бы!). Для него существует отдельное расширение RSS Subscription Extension, добавляющее отображение иконки.