Yii: Добавление RSS-ленты на сайт, с использованием библиотеки Zend_Feed из 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 будет работать?
если не используются то и не влияют.