Здесь показаны различия между двумя версиями данной страницы.
| Both sides previous revision Предыдущая версия Следущая версия | Предыдущая версия | ||
|
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>, сколько у вас каналов. | ||
| - | FIXME | + | <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]], добавляющее отображение иконки. | ||