DbHelp.ru
Маленький Yii блог
Комментарии
Гость: Намереваетесь оттрахать три киски сразу, обратите взо...
Гость: «Халва» - Карта Рассрочки взять кредит частный займ ...
Гость: Регистрируешься - огромный бонусы. Играешь - огромный ...
Гость: Быстро и качественно придам вашему фото идеальный вид....
Гость: Информативно,продолжай в том же духе [url=http://forum.oncolo...



Сервер Ultima Online - Forest Wars (от создателя данного блога)

Компонент Rss ленты v1.0

Рубрика: Компоненты

Оцените эту статью:

Рейтинг: 0.00 (0)
8 Апр. 2009
Опубликовать в Twitter Написать в Facebook Опубликовать в своем блоге livejournal.com

Yii Framework Blog img http://dbhelp.rursska Перед тем как начать подключать виджет RSS ленты я хотел бы немного освежить ваши знания по самой технологии.


RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами. (из вики).

---

Подробную информацию про RSS вы сможете прочитать тут.


Теперь давайте перейдем к написанию небольшого компонента, который и поможет нам с лентой. Первым делом надо обсудить те условия которым должен удволитворять ваш сайт:

  1. Ваш сайт написан на Yii
  2. Сообщения для которых вы хотите сделать ленту – находятся в базе данных. (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 которая содержит в себе небольшую конфигурацию для нашей ленты:

  1. url – полное название сайта + index.php. необходимо для вывода ссылки на новость. (возможно есть более простой способ вернуть данное значение, но мне он не известен)
  2. name – название нашего блога. Данная переменная заданна в виде параметра в конфиг файле yii. Вы можете подставить тут своё название или также как я добавить просто в конфиг
  3.  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. Заказали мне в общем сделать на сайте элемент, который информировал бы о кол-ве людей на сайте. Некий счетчик живого онлайна. ... "Хитрый счетчик "онлайна на сайте""

  2. Давайте сегодня разберем почему стоит выбрать Yii Framework и какими плюсами он обладает. next Если вы незнакомы со старыми статьями этого ... "Шаг 2: Почему стоит выбрать Yii?"

  3. Наиболее легкий способ обновления содержимого через Ajax, это использование метода partialRender(). Давайте научимся им пользоваться! next     Для этого примера у меня есть ... "Обновление содержимого через AJAX используя renderPartial()"

[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','&amp;'); ?></link>
<guid><?php echo Yii::app()->createAbsoluteUrl('post/show',array('id'=>$val->id),'http','&amp;'); ?></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? Это совсем не Виджет

[guest] Makc

Было сказано: Четверг, 11 Апрель 2013

CWidget тоже наследует CComponent (class CWidget » CBaseController » CComponent), так что в этом плане всё пучком!

[guest] Андрей

Было сказано: Понедельник, 06 Июнь 2016

Добрый день, подскажите, а как этого зверя парсить?

[guest] Гость

Было сказано: Понедельник, 06 Февраль 2017

Amoxicillin 1000mg <a href=http://clanar.com>viagra</a> Dosage Of Amoxicillin For Uti

Оставить комментарий


Код:
Имя: