====== Создание 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-ленты нам понадобятся три файла * {{:eaze:samples:rsschannel.phps|RssChannel.php}} * {{:eaze:samples:rssitem.phps|RssItem.php}} * {{:eaze:samples:rsswriter.phps|RssWriter.php}} Данные классы лучше сохранить в ''web/lib/.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 без шаблона. Panda.Site.GetNewsRss ==== Panda.Site.xml ==== Сделаем так, чтобы мы смогли задавать количество выводимых новостей в виде параметра. news/GetNewsRss 20 ==== GetNewsRss.php ==== 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 на сайте. Для этого добавьте столько в , сколько у вас каналов. Данный способ будет работать во всех нормальных браузерах, кроме Google Chrome, потому что у него нет встроенной RSS-читалки (казалось бы!). Для него существует отдельное расширение [[https://chrome.google.com/webstore/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd|RSS Subscription Extension]], добавляющее отображение иконки.