Компонент Rss ленты v1.0
Рубрика: Компоненты
8 Апр. 2009
Перед тем как начать подключать виджет RSS ленты я хотел бы немного освежить ваши знания по самой технологии.
RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами. (из вики).
Подробную информацию про RSS вы сможете прочитать тут.
Теперь давайте перейдем к написанию небольшого компонента, который и поможет нам с лентой. Первым делом надо обсудить те условия которым должен удволитворять ваш сайт:
- Ваш сайт написан на Yii
- Сообщения для которых вы хотите сделать ленту – находятся в базе данных. (mysql/mssql/postgre)
Если ваш сайт подходит под эти два пункта – тогда переходим дальше.
Хотелось бы напомнить что для создания RSS ленты совсем не обязательно создавать отдельный компонент. Вы можете обойтись простым подходом (контроллером<-->отображением) и перенести туда весь тот функционал что я здесь опишу. Мне как программисту - удобнее использовать ленту как компонент, поэтому дання статья так и называется "Компонент для Rss ленты".
Войдите в папку protected/components и создайте там файл Rss.php:
/**
* RSS class file
*
* @author Alekseenko Timur <zolter.od@gmail.com>
* @link http://www.dbhelp.ru/
* @copyright Copyright 2009
*/
Class Rss extends CWidget {
var $config = array();
function init()
{
if (empty($this->config))
$this->config = array(
'url' => 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."/",
'name' => Yii::app()->params['name'],
'desc' => Yii::app()->params['desc'],);
$this->render('rss/index',
array(
// вместо Posts укажите название вашей модели
'arr' => Posts::model()->findAll('active = 1 ORDER BY created DESC')
));
}
}
Давайте теперь подробно разберем что он из себя представляет. Сам класс у нас наследуется от CWidget что бы иметь кое-какой базовый функционал (вроде render и тп). Я создал переменную $config которая содержит в себе небольшую конфигурацию для нашей ленты:
- url – полное название сайта + index.php. необходимо для вывода ссылки на новость. (возможно есть более простой способ вернуть данное значение, но мне он не известен)
- name – название нашего блога. Данная переменная заданна в виде параметра в конфиг файле yii. Вы можете подставить тут своё название или также как я добавить просто в конфиг
- desc – описание блога. Аналогично названию находится у меня в конфиге
Далее что бы заполнить переменную arr и передать её в отображение – я делаю выборку через модель Posts. В критериях поиска у меня стоит проверка на то, чтобы запись была активна. Если вы хотите что бы данная RSS лента работала на вашем сайте – вам необходимо вместо Posts подставить название своей модели с сообщениями.
Как вы видите файл отображения у нас находится в protected/components/views/rss/ и называется index.php. Код файла отображения следующий:
<?='<?xml version="1.0" encoding="UTF-8"?>'; ?>
<rss version="2.0">
<channel>
<title><?=$this->config['name']?></title>
<link><?=$this->config['url']?></link>
<description><?=$this->config['desc']?></description>
<copyright>Copyright 2009, dbhelp.ru</copyright>';
<?php foreach ($arr as $key => $val): ?>
<item>
<title><?=addslashes($val->name)?></title>
<link><?=$this->config['url'].$val->url.'/post/'?></link>
<description><?=htmlspecialchars(mb_substr(strip_tags($val->text), 0, 500))."...";?></description>
<pubDate><?=$val->created;?></pubDate>
</item>
<?php endforeach; ?>
</channel>
</rss>
В нем мы форечем перебираем массив с данными ($arr) и формируем общую структуру rss ленты. У меня в таблице posts заголовок новости находится в колонке «name», а описание в колонке «text». Если у вас по другому, тогда замените данные строчки на свои имена:
$val->name
$val->text
Вот в принципе и всё. В папке protected/controllers я специально создал новый контроллер RssController.php:
class RssController extends CController
{
function actionIndex()
{
$rss = new Rss();
$rss->init();
}
}
Вы же можете использовать уже существующий контроллер, если вам это удобнее. Также хочу обратить ваше внимание что обратится к виджету вы можете также из отображения написав:
<?php $this->widget('Rss'); ?>
Если захотите использовать последний вариант вывода, вы должны помнить: перед вызовом виджета никаких данных на экран выводиться не должно! В противном случае вы увидите весь xml код ленты на экране
UPDATE: Появился "Компонент Rss ленты v2.0"
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- Помню когда я показал свой тестовый набросок блога своему другу - ему сразу понравилась его скорость работы. Через пару ... "Свой текст для обновления капчи"
- Эта статья устарела т.к. была написана для yii версии 1.0.х; Если вы используете более новую версию - у вас могут ... "Урок 7 : Комментарии"
- ... "DbHelp.ru - второе дыхание"

[guest] Гость
Было сказано: Воскресенье, 07 Июнь 2009
Спасибо за статью. Валидацию <a href="http://validator.w3.org/feed/">здесь</a> готовая лента не проходила.
Добавил вывод даты в формате: "'D, d M Y H:i:s O", <guid> со ссылкой на пост, ссылку на себя. Вот что получилось:
<?php echo '<?xml version="1.0" encoding="UTF-8"?>'."\n"; ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="<?php echo Yii::app()->createAbsoluteUrl('rss'); ?>" rel="self" type="application/rss+xml" />
<title><?php echo $this->config['name']?></title>
<link><?php echo Yii::app()->request->hostInfo.Yii::app()->homeUrl; ?></link>
<description><?php echo $this->config['desc']?></description>
<copyright><?php echo Yii::app()->params['copyrightInfo']; ?></copyright>
<?php foreach ($posts as $key => $val): ?>
<item>
<title><?php echo CHtml::encode($val->title)?></title>
<link><?php echo Yii::app()->createAbsoluteUrl('post/show',array('id'=>$val->id),'http','&'); ?></link>
<guid><?php echo Yii::app()->createAbsoluteUrl('post/show',array('id'=>$val->id),'http','&'); ?></guid>
<description><?php echo (mb_substr(strip_tags($val->contentDisplay), 0, 500)).'...';?></description>
<pubDate><?php echo date('D, d M Y H:i:s O',$val->createTime); ?></pubDate>
</item>
<?php endforeach; ?>
</channel>
</rss>
createAbsoluteUrl здорово помогает составлять полные урлы.

[guest] Гость
Было сказано: Понедельник, 14 Июнь 2010
А ничего, что Компонент — это экземпляр класса CComponent? Это совсем не Виджет


