[v1.0] Создаем RSS ленту на Yii

Выкладываем свои наработки
Ответить
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

[v1.0] Создаем RSS ленту на Yii

Сообщение Ozzy »

Вот надо было сегодня RSS к блогу сделать, поэтому решил осветить процесс создания RSS ленты на Yii. В принципе всё точно также как на любом фреймворке, просто заточено под Yii и написано своими пальцами.

Создаем RSS ленту на Yii (статья)
Последний раз редактировалось Ozzy 2009.04.14, 00:16, всего редактировалось 3 раза.
Мой маленький блог - http://dbhelp.ru
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Создаем RSS ленту на Yii

Сообщение pirrat »

для начала я не совсем понял зачем это надо было оформлять как widget (да и вообще как отдельный компонент не вижу смысла)?
почему просто в контроллере не вызвать представление?

Код: Выделить всё

$this->renderPartial('index', array('arr' => Posts::model()->findAll('active = 1 ORDER BY created')); 
во первых виджеты решают другие задачи.
во вторых Летна RSS, это такая же страница сайта как и любая другая, только лишь со своим представлением!

я бы для контроллера Rss, сделал бы отдельный layout (макет).
примерно такого содержимого

Код: Выделить всё

<?='<?xml version="1.0" encoding="UTF-8"?>'.PHP_EOL; ?>
<rss version="2.0">    
    <channel>
        <title><?=$title ?></title>
        <link> <?=$baseUrl ?> </link>
        <description><?=$desc?></description>
        <copyright>$copy</copyright>
<?=$content?>   
</channel>
</rss>
Это основной макет для всех RSS лент (у нас то их может быть много). (положим его в views/layouts/rss.php)

установить его для всего контроллера можно через CController::layout

а дальше в actions этого контроллера, просто рендерил бы представление для каждой конкретной ленты, через:

Код: Выделить всё

$this->render('posts', array('arr' => Posts::model()->findAll('active = 1 ORDER BY created'));
соответственно представление выглядело бы так (в файле views/rss/posts.php):

Код: Выделить всё

        <?php foreach ($arr as $key => $val): ?>
        <item>
                 <title><?=addslashes($val->name)?></title> 
                 <link><?php echo Yii::app()->request->baseUrl.'/'.$val->url.'/post/'?></link> 
                 <description><?=htmlspecialchars(mb_substr(strip_tags($val->text), 0, 500))."...";?></description> 
                 <pubDate><?=$val->created;?></pubDate>
        </item>
        <?php endforeach; ?>

ну и + ошибки в статье:
Сам класс у нас наследуется от RssCWidget что бы иметь кое-какой базовый функционал (вроде render и тп).
не RssCWidget а CWidget...
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Создаем RSS ленту на Yii

Сообщение Ozzy »

to pirrat
я понимаю что критиковать проще чем писать своё.

мне так удобнее и многим так понятнее. еще вопросы? если вам не нравится такой подход - так не используйте. он не является нарушением MVС и по душе многим людям. если вы мне представите в документации MVC строчки о том что виджет не в коем случае не должна использоваться как стороняя либса для удобства - тогда я с вами соглашусь.

за ошибку спасибо, уже поправил
Мой маленький блог - http://dbhelp.ru
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Создаем RSS ленту на Yii

Сообщение pirrat »

я согласен что у каждого свой подход, и каждый имеет право на свое мнение.
Я вот высказал свое, что ваш подход мне не нравится и я предложил свой!

Собственно понятие Widget я интерпретирую не так как вы видимо.
Мне ближе понятие, такое как описано в документации:
Виджеты обычно встраивают в скрипт представления для генерации некоторой комплексной самодостаточной части пользовательского интерфейса. К примеру, виджет календаря может быть использован для рендеринга комплексного интерфейса календаря.
Т.е. это такой своеобразный динамический блок, который встраивается в отображении, в понятиях многих CMS, это часто называется просто: Блок!

Ну понятия это не столь важно, другое дело универсальность:
При вашем подходе для каждой новой ленты( у нас на сайте их может быть несколько), придется писать:
класс виджета, метод в контроллере, отображение..
ну не как не вижу смысла вводить тут дополнительный класс, подобные вашим..

все это ИМХО естесвено...
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Создаем RSS ленту на Yii

Сообщение Ozzy »

В моем подходе если мы захотим сделать еще одну ленту мы делаем просто:

Код: Выделить всё

<?php $this->widget('Rss', array('config' => новый_конфиг)); ?>
мне кажется это удобнее чем лопатить контроллер на изменением конфига руками.

но это опять такие моё виденье на разработку. я не отрицаю что можно было реализовать как предложили вы, но мне такой подход не по душе. как вы уже привели часть доки:
Виджеты обычно встраивают в скрипт представления для генерации некоторой комплексной самодостаточной части пользовательского интерфейса. К примеру, виджет календаря может быть использован для рендеринга комплексного интерфейса календаря.
виджет ленты как раз таки и является тем самым самодостаточным динамическим блоком.
опять таки, в моем виджете как вижу ошибок нету. а всё о чем мы щяс говорим - это дело вкуса. вам удобнее так - кому то удобнее по другому. при том что в вашем подходе что в моем модель MVC не нарушается. поэтому не вижу смысла дальше спорить
Мой маленький блог - http://dbhelp.ru
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Создаем RSS ленту на Yii

Сообщение pirrat »

в вашем подходе:
array(
// вместо Posts укажите название вашей модели
'arr' => Posts::model()->findAll('active = 1 ORDER BY created DESC')
));
если мне нужно вывести допустим 2 ленты: постов и комментариев, мне придется писать ещё один виджет, так как модель у вас жёстко забита в класс!
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Создаем RSS ленту на Yii

Сообщение Ozzy »

Согласен. Что бы реализовать то что я написал надо добавить дополнительный парраметр в конфиг а ту строчку что вы написали вызывать как:

Код: Выделить всё

'arr' => $$this->config['...']::model()->findAll('active = 1 ORDER BY created DESC') 
или eval-м добавить название таблицы через конфиг. короче сегодня сделаю - отпишу.
Мой маленький блог - http://dbhelp.ru
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Создаем RSS ленту на Yii

Сообщение pirrat »

Извините за мою придирчивость, но в предложенном варианте, тогда ещё нужно и в конфиге передавать имя отображения, так как оно будет отличатся в разных лентах ну или генерировать его на основе имени модели ;)
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Создаем RSS ленту на Yii

Сообщение Ozzy »

pirrat писал(а):Извините за мою придирчивость, но в предложенном варианте, тогда ещё нужно и в конфиге передавать имя отображения, так как оно будет отличатся в разных лентах ну или генерировать его на основе имени модели ;)
имена таблиц можно будет выдрать через конфиг т.к. yii не телепат что бы понять что там заголовок а что текст. в любом случае уже для интереса реализую сегодня эту фигню и тока попробуй сказать мне что твой вариант с контроллером будет всеравно удобнее :lol:
Мой маленький блог - http://dbhelp.ru
pirrat
Сообщения: 193
Зарегистрирован: 2009.04.03, 09:41

Re: Создаем RSS ленту на Yii

Сообщение pirrat »

я не сказал что мой вариант удобнее, я сказал что он проще, а ваш, в таком виде, как он есть, не имеет смысла =)
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: Создаем RSS ленту на Yii

Сообщение Ozzy »

если работает - значит имеет смысл.
плюс как видно мой проще расширить новым функционалом что будет невозможно сделать при вашем варианте.
Мой маленький блог - http://dbhelp.ru
Аватара пользователя
Ozzy
Сообщения: 269
Зарегистрирован: 2009.04.02, 15:09
Откуда: Украина, Одесса

Re: [v1.0] Создаем RSS ленту на Yii

Сообщение Ozzy »

Вот и готово.
Сейчас запощу у себя и сразу кину тут ссылку :)
Мой маленький блог - http://dbhelp.ru
mnogokotin
Сообщения: 2
Зарегистрирован: 2010.11.29, 10:41

Re: [v1.0] Создаем RSS ленту на Yii

Сообщение mnogokotin »

Спасибо автору :)
alex3d
Сообщения: 19
Зарегистрирован: 2011.10.13, 13:06

Re: Создаем RSS ленту на Yii

Сообщение alex3d »

pirrat писал(а):для начала я не совсем понял зачем это надо было оформлять как widget (да и вообще как отдельный компонент не вижу смысла)?
почему просто в контроллере не вызвать представление?
...
Отличное решение! Именно так и сделал после несколькочасовых попыток укротить компонент efeed (проблемы были с разметкой которая не хотела валидироваться, а где и как поменять не хватило знаний). Зато так - всё предельно гибко и ясно. Изменились немного стандарты - залез и поправил как хочешь. Спасибо!
Ответить