Компонент Rss ленты v2.0
Рубрика: Компоненты
8 Апр. 2009
Немного обсудив своё творение «Компонент Rss ленты v 1.0» на русском форуме я решил немного его переделать. Мною было принято решение включить в его функционал возможность самому задавать конфигурацию, и создавать несколько лент не наследуя класс ленты.
Если старый вариант компонента можно назвать «lite» версией, то этот думаю пойдет под лозунгом «prof» :) Первым делом вы должны прочитать описание первой версией компонента, если вам достаточно её функционала – то можете вполне использовать v 1.0. Обе версии компонента – рабочие, просто 2.0 имеет большее кол-во возможностей.
Войдите в protected/components и создайте там новый файл Rss.php:
/**
* RSS class file
*
* @author Alekseenko Timur <zolter.od@gmail.com>
* @link http://www.dbhelp.ru/
* @copyright Copyright 2009
* @version 2.0.0
*/
Class Rss extends CWidget {
/**
* $config Используется для перезаписи значений по умолчанию
*
* @var unknown_type
*/
public $config = array();
/**
* $def_config Содержит в себе значения по умолчанию
*
* @var unknown_type
*/
private $def_config = array(
// -----------------------------------------
// название ленты
'name' => "DbHelp.ru",
// -----------------------------------------
// описание ленты
'desc' => "Маленький Блог для Yii программистов!",
// -----------------------------------------
// поле copyright
'copyright' => "Copyright 2009, dbhelp.ru",
// -----------------------------------------
// Sql по которому будет идти отбор в ленту
'criteria' => "active = 1 ORDER BY created DESC",
// -----------------------------------------
// Сколько символов из tb_body будет показано на в ленте
'body_size' => 500,
// -----------------------------------------
// Колонка в таблице которую будем использовать как Title ленты
'tb_title' => "name",
// -----------------------------------------
// Колонка в таблице которую будем использовать как Body ленты
'tb_body' => "text",
// -----------------------------------------
// Колонка в таблице которую будем использовать дату
'tb_date' => "created",
// -----------------------------------------
// Колонка в таблице которая содержит url новости
'tb_url' => "url",
// -----------------------------------------
// Префикс который надо вставить в конце url. Если ненадо - удалите.
'z_prefix' => "page",
// -----------------------------------------
// Префикс который надо вставить в начале url. Если ненадо - удалите.
'p_prefix' => "",
// -----------------------------------------
// Название модели из которой будем брать данные
'model' => "Posts",
);
function init()
{
if (empty($this->config['url']))
$this->config['url'] = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['SCRIPT_NAME']."/";
$this->config = array_merge($this->def_config, $this->config);
eval('$date = '.$this->config['model'].'::model()->findAll("'.$this->config['criteria'].'");');
$this->render('rss/index', array('arr' => $date));
}
}
Как видите в $this->def_config включены все существующие настройки для компонента. Если значений по умолчанию вам не подходят – вам следует переопределить их в отображении при вызове компонента.
Давайте немного более подробно разберем для чего каждый из параметров:
- Name– задает имя RSS ленты.
- Desc – задает описание для ленты. (выводится ниже имени)
- Copyright – копирайт поле
- Criteria – содержит в себе SQL запрос который влияет на то какие данные будут выбраны из модели. В примере по умолчанию выбираются все активированные записи (active = 1) отсортированные по полю created.
- Body_size – Кол-во символов новости которые будут выводится в ленте
- tb_title – название поля в таблице которое будет использовано в качестве заголовка
- tb_body – название поля в таблице которое будет использовано в качестве текста новости
- tb_date – название поля в таблице которое будет использовано в качестве даты новости
- tb_url – если в вашей таблице есть поле содержащее url новости – тогда подставитье его сюда. В ином случае – вы можете использовать поле с первичным ключем
- z_prefix – префикс в url перед tb_url
- p_prefix – префикс в url после tb_url
- model – модель которую будем использовать для того чтобы достать данные. Таблица с которой работает модель и будет фигурировать в нашей rss ленте
Как и в первой версии отображение для нашей ленты находится по адресу 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><?=$this->config['copyright']?></copyright>
<?php foreach ($arr as $key => $val): ?>
<item>
<title><?=addslashes(eval('return $val->'.$this->config['tb_title'].';'))?></title>
<link><?=$this->config['url'].$this->config['p_prefix'].eval('return $val->'.$this->config['tb_url'].';').'/'.$this->config['z_prefix'].'/'?></link>
<description><?=htmlspecialchars(mb_substr(strip_tags(eval('return $val->'.$this->config['tb_body'].';')), 0, $this->config['body_size']))."...";?></description>
<pubDate><?=eval('return $val->'.$this->config['tb_date'].';');?></pubDate>
</item>
<?php endforeach; ?>
</channel>
</rss>
Теперь чтобы подключить наш виджет к вам на сайт – необходимо создать новый контроллер Rss или добавить к существующему новый экшинс. Я предлагаю создать новый контроллер controllers/ RssController.php:
class RssController extends CController
{
var $layout = " ";
function actionIndex()
{
$this->render('index');
}
}
Как видите он имеет всего один экшинс который рендарит index отображением. В самом отображении (view/rss/index.php) мы просто обращаемся к виджету:
$this->widget('Rss',
array(
'config' => array(
'name' => "DbHelp.ru",
))
);
Вот в принципе и все.
Для того чтобы изменить свою ленту и её работу вы просто указываете необхадимые настройки в виде параметра config. При этом если какой то из параметров вы не указали – вместо него будет подставлено "значение по умолчанию".
Данный виджет теперь по праву можно считать полноценным компонентом и использовать в своё удовольствие.
Если хотите опубликовать этот материал у себя - пожалуйста, разместите ссылку на страницу откуда вы его взяли.
- ... "Перевод : Доработка модели Post"
- Вас смущает капча на вашем сайте? Так давайте сделаем её сложнее... В этом уроке мы поговорим про интеграцию с ... "Усложняем стандартную капчу, при помощи reCaptcha"
- ... "DbHelp.ru - второе дыхание"

RSol
Было сказано: Пятница, 12 Июнь 2009
zolter, поставь для своих тегов code css свойство
overflow:auto;
:)

[guest] Bethrezen
Было сказано: Понедельник, 29 Июнь 2009
<description><?=$this->config['desc']?></description>
<copyright><?=$this->config['copyright']?></copyright>';
<?php foreach ($arr as $key => $val): ?>
Убери '; после </copyright>

[guest] zolter
Было сказано: Четверг, 18 Ноябрь 2010
Неа, так понимает за счет <?xml впереди всеми нормальными браузерами.


