Yii: Добавление RSS-ленты на сайт, с использованием библиотеки Zend_Feed из Zend Framework
Делаем ленту RSS на нашем сайте, работающем на фреймворке Yii. Будем использовать для RSS библиотеку из Zend Framework Будем использовать существующую функциональную часть для RSS, которая реализована в другом фреймворке - Zend Framework.
1) Скачиваем и устанавливаем (всё просто) последнюю версию Zend Framework - http://framework.zend.com/download/latest. Нам понадобится только один компонент из этого фреймворка - Zend_Feed, поэтому достаточно минимальной версии Zend.
Создадим в папке /protected специальную папку - vendors, в которую закачаем папку /library/Zend из скачанного архива. Убедимся, что существует /protected/vendors/Zend/Feed.php
2) Этот компонент Zend_Feed сэкономит нам время, чтобы он правильно заработал, нам осталось передать ему данные в правильном формате. Добавим метод actionFeed() в контроллер CommentController (мы не стали создавать отдельный контроллер для ленты). Вот этот метод:
public function actionFeed() { if(isset($_GET['id'])) $materialId = intval($_GET['id']); else $materialId = null; $comments = Comment::model()->findRecentComments(20, $materialId); //convert from an array of comment AR class instances to an name=>value array for Zend $entries=array(); foreach($comments as $comment) { $entries[]=array( 'title'=>$comment->material->title, 'link'=>CHtml::encode($this->createAbsoluteUrl('material/view',array('id'=>$comment->material->id, 'alias'=>$comment->material->alias,))), 'description'=> $comment->author . ' says:<br>' . $comment->content, 'lastUpdate'=>strtotime($comment->create_time), 'author'=>$comment->author, ); } //now use the Zend Feed class to generate the Feed // generate and render RSS feed $feed=Zend_Feed::importArray(array( 'title' => 'LOCO Comments Feed', 'link' => $this->createUrl(''), 'charset' => 'UTF-8', 'entries' => $entries, ), 'rss'); $feed->send(); }
Сначала мы проверяем если выбрана конкретная статья, тогда будет формироваться RSS комментариев для этой статьи, если $materialId не установлен, то - RSS всех последних комментариев. Дальше $comment вернёт нам массив записей-комментариев из модели Comment. Циклом foreach мы этот массив проходим и формируем то, чего ждёт компонент Zend_Feed на вход. А он ждёт простой массив $entries[], каждый элемент в котором в свою очередь тоже является простым ассоциативным массивом пар name=>array. Чтобы всё заработало нам достаточно прописать - title, link, description.
Ещё мы использовали метод createAbsoluteUrl(), чтобы получить абсолютный путь. Также использовали CHTML::encode, чтобы раскодировать html сущности (например & -> &), иначе Zend_Feed выдаст ошибку.
Когда всё сформировано, используем метод importArray(), он принимает массив. Затем посылаем $feed->send(), чтобы сформатировать RSS и отправить верные headers клиенту.
3) В начало контроллера CommentController.php добавим:
Yii::import('application.vendors.*');
require_once('Zend/Feed.php');
require_once('Zend/Feed/Rss.php');
и в метод CommentController::accessRules():
public function accessRules() { return array( array('allow', // allow all users to access 'index' and 'view' actions. 'actions'=>array('index','feed'), 'users'=>array('*'), ), ...
Всё, теперь смотрим - http://loco.ru/comment/feed
Или с использованием дружеских URL - http://loco.ru/commentfeed.xml
Для этого в config/main.php прописали:
'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( 'materials/<id:\d+>/commentfeed'=>array('comment/feed', 'urlSuffix'=>'.xml', 'caseSensitive'=>false), 'commentfeed'=>array('comment/feed', 'urlSuffix'=>'.xml', 'caseSensitive'=>false),
...
4) И последнее, добавим в шаблон ссылки ленты. В MaterialController::actionIndex() добавим:
Yii::app()->clientScript->registerLinkTag( 'alternate', 'application/rss+xml', $this->createUrl('comment/feed'));
Это вставит в html в область <head> ссылку:
<link rel="alternate" type"application/rss+xml" href="/commentfeed.xml">
Также можно поступить и для actionView().
almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.
Вы можете почитать все статьи от almix'а.
- 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015)
- 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015)
- 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
- 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
- 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014)
- 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014)
- 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014)
- 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013)
- 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013)
- 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013)
- 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013)
- 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014)
- 2 Yii + Git (github) на Mac. (24.03.2013)
- 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014)
- 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013)
- 0 Composer – пакетный менеджер PHP. Что и как? (22.07.2014)
- 0 MySQL: проверить содержится ли значение в поле столбца (в столбце хранится строка значений через запятую) (22.05.2014)
- 0 Yii: Статичные страницы (создание, редактирование, удаление) (28.04.2014)
- 0 Yii: Расширение ECKEditor = Связка ckeditor + kcfinder (визуальный редактор с бесплатным файловым менеджером) (28.04.2014)
- 0 Yii: Bootstrap tabs, делаем активной вкладку на которую выполняется переход по ссылке (20.03.2014)
- 0 Yii: Доступ к атрибуту модели из файла шаблона (Вызов в шаблоне какого-либо атрибута модели). (17.02.2014)
- 0 Yii: Множественный автокомплит с помощью CJuiAutoComplete (автокомплит нескольких значений в одно поле) (07.02.2014)
- 0 Yii: Фотогалерея через поведение (доработка расширения imagesgallerymanager) (08.03.2016)
- 0 Yii: Установка и настройка Yii-app заготовки приложения от Crisu83 (09.03.2014)
- 0 Twitter Bootstrap Carousel Crossfade (09.09.2013)
6 комментариев
Yii::import('application.vendors.*');
BS, как вы считаете? А без папки uri будет работать?
если не используются то и не влияют.