Здесь показаны различия между двумя версиями данной страницы.
Следущая версия | Предыдущая версия | ||
eaze:samples:создание_rss_ленты [2011/09/22 22:41] sergeyfast создано |
eaze:samples:создание_rss_ленты [2011/09/23 14:38] (текущий) sergeyfast [header.tmpl.php] |
||
---|---|---|---|
Строка 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 ==== | ||
+ | |||
+ | Существует простой способ рассказать пользователям о том, что у вас есть RSS на сайте. Для этого добавьте столько <link> в <head>, сколько у вас каналов. | ||
+ | |||
+ | <code html> | ||
+ | <link href="http://panda/news/rss/" rel="alternate" type="application/rss+xml" title="Panda.Ru: Новости" /> | ||
+ | </code> | ||
+ | |||
+ | Данный способ будет работать во всех нормальных браузерах, кроме Google Chrome, потому что у него нет встроенной RSS-читалки (казалось бы!). Для него существует отдельное расширение [[https://chrome.google.com/webstore/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd|RSS Subscription Extension]], добавляющее отображение иконки. |