Думаю все знают, что такое RSS-канал. Те, кто не знает, могут посмотреть, как он примерно выглядит Здесь. Если взглянуть на исходный код страницы RSS-канала, видно, что он полностью написан на XML. С помощью Коханы такой XML-код создать очень просто. Для этого используется специальный Хелпер Feed.
Класс Feed
Основным методом данного класса является метод create, который собственно и генерирует XML-код исходя из переданных параметров. Таких параметров всего четыре: два обязательных и два необязательных. Первый параметр — это массив с информацией, которая помещается в заголовок (название, дата публикации итд), второй параметр — массив с данными. И оставшиеся необязательные третий и четвертый параметры — это формат и кодировка. Вот как это примерно выглядит:
$info = array( 'title' => 'Комментарии нашего сайта' ); $items = array( array('title' => 'Комментарий к статье 2', 'description' => 'А почему здесь так ?', 'link' => URL::site('/articles/article2'), 'pubDate' => date('r', time())), array('title' => 'Комментарий к статье 1', 'description' => 'Ничего не понял', 'link' => URL::site('/articles/article1'), 'pubDate' => date('r', time() - 2500)) ); echo Feed::create($info, $items);
После вывода наши массивы преобразуются в такой XML-код:
<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Комментарии нашего сайта</title> <link>http://kohana/</link> <generator>KohanaPHP</generator> <item> <title>Комментарий к статье 2</title> <description>А почему здесь так ?</description> <link>http://kohana/articles/article2</link> <pubDate>Wed, 07 Mar 2012 17:32:18 -0600</pubDate> </item> <item> <title>Комментарий к статье 1</title> <description>Ничего не понял</description> <link>http://kohana/articles/article1</link> <pubDate>Wed, 07 Mar 2012 16:50:38 -0600</pubDate> </item> </channel> </rss>
А вот так это выглядит уже в браузере:
Как видите, все очень легко и просто. К сожалению изучение XML выходит за рамки этого урока. Поэтому мы переходим ко второму методу нашего класса — методу parse. Этот метод выполняет обратную операцию — он принимает в качестве параметра переменную, в которой содержится XML-код RSS-файла и превращает ее в массив со всеми значениями этого RSS-файла. Давайте теперь не будем выводить наш XML-код в браузер, а сохраним его в переменную и отдадим методу. Для этого переделаем концовку нашего кода:
$xml = Feed::create($info, $items); $array = Feed::parse($xml);
После этих манипуляций содержимое массива будет следуюшим:
Array ( [0] => Array ( [title] => Комментарий к статье 2 [description] => А почему здесь так ? [link] => http://kohana/articles/article2 [pubDate] => Wed, 07 Mar 2012 18:21:15 -0600 ) [1] => Array ( [title] => Комментарий к статье 1 [description] => Ничего не понял [link] => http://kohana/articles/article1 [pubDate] => Wed, 07 Mar 2012 17:39:35 -0600 ) )
Данный метод принимает еще один — необязательный параметр. Это лимит на количество распарсеных значений. Если для нашего случая вторым параметром поставить единицу, то прийдет только массив с Комментарием к статье 2.
Вот собственно и все, что я хотел вам рассказать об этом интересном и весьма полезном Хелпере. Пробуйте, учитесь и не забудьте поздравить своих милых дам с праздником. Удачи.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
Спасибо за урок. Очень радует простота работы с XML в Кohana
А у этого бложика нету RSS ?)
ММ, нашел внизу страницы РСС комментариев. А статей нету?
Как хелпер поведет себя с вложенными тегами в XML ?
Шикарный сайт, всё по полочкам, разобрался с фреймворком за неделю, правда до ORM руки не дошли, по старинке просто моделью пользуюсь)))
вчера с фидом столкнулся, возникло пару вопросов по контроллерам, я ранее считал, что если в любом экшене присвоить темплейт, то он присвоится, пример:
$this->template = ‘template2′;
$this->template-content = ‘бла-бла-бла’;
но как выяснилось данная конструкция не работает, вопрос так и задуманно, или я, что то не то делаю?
kohana 3.3
почему столкнулся то, начал выводить фид в экшене основного контроллера, а как оказалось после echo Feed::create(); в страницу под rss добалялся весь остальной шаблон сайта(хотя мозила отображала только XML, но после подписки говорила что «невозможно загрузить ленту новостей»), который присвоен контроллеру. Вот и решил по эксперементировать, в итоге пришел к тому, что для одного экшена rss пришлось свой контроллер клепать rss, это правильно? или таки можно присвоить теплейт «на лету»?
я почему спрашиваю, тут у меня сейчас есть контроллер для аякса, тоже со своим темплейтом который просто кодирует в json полученные данные, но подумывал в основной контроллер засунуть экшены, для получения ответов в json, просто сменой шаблона в экшене, как убедился идея оказалась бы провальной)
Ввел всех в заблуждение по собственной глупости
Исправляюсь:
$this->template = View::factory(‘template2?);