RSS - неотъемлемая часть любого часто обновляемого проекта. В данном документе мы покажем, как можно создать RSS-feed при помощи Limb и WACT.
Допустим, что нам необходимо сделать RSS-feed для последних новостей нашего туториала.
Создадим скрипт last-news-feed.php, который будет делать вот что:
Вот его исходный код:
<?php require_once('../setup.php'); require_once('limb/web_app/src/template/lmbWactTemplate.class.php'); require_once('limb/core/src/lmbCollection.class.php'); require_once('src/model/News.class.php'); $template = new lmbWactTemplate('rss/last_news.rss'); $template->setChildDataSet('last_news', getNewsDataSetWithFullPaths()); header("Content-Type: application/xml"); $template->display(); /*-------------------------------------------------------*/ function getNewsDataSetWithFullPaths() { $news_rs = lmbActiveRecord :: find('News', array('sort' => array('date' => 'DESC', 'title' => 'ASC'), 'limit' => 5)); $result = array(); foreach($news_rs as $news) { $news_id = $news->getId(); $result[$news_id] = $news->export(); $result[$news_id]['path'] = 'http://' . $_SERVER['HTTP_HOST'] . '/news/detail/' . $news_id; } return new lmbCollection($result); } ?>
Поясним, что же здесь происходит:
<?php [...] function getNewsDataSetWithFullPaths() { $news_rs = lmbActiveRecord :: find('News', array('sort' => array('date' => 'DESC', 'title' => 'ASC'), 'limit' => 5)); $result = array(); foreach($news_rs as $news) { $news_id = $news->getId(); $result[$news_id] = $news->export(); $result[$news_id]['path'] = 'http://' . $_SERVER['HTTP_HOST'] . '/news/detail/' . $news_id; } return new lmbCollection($result); } ?>
При помощи функции _getNewsDataSetWithFullPaths() мы загружаем набор из новостей из таблички news, сортируя их по дате и заголовку, ограничивая раздел выборки 5-ю элементами.
Для выборки мы использовали статический метод lmbActiveRecord :: find(), который принимает название класса получаемых объектов и массив параметров, которые нужно применить к выборке. В нашем случае мы передали параметры sort и limit. Параметр sort передается в виде массива вида - поле ⇒ способ_сортировки.
Если бы мы делали все в шаблоне, то тот же самый код можно было бы записать:
<active_recod:fetch class_path="src/model/News" pass_to="news" navigator='pager' order='date,title' limit='5'/>
Далее при помощи:
$result = array(); foreach($news_rs as $news) { $news_id = $news->getId(); $result[$news_id] = $news->export(); $result[$news_id]['path'] = 'http://' . $_SERVER['HTTP_HOST'] . '/news/detail/' . $news_id; } return new lmbCollection($result);
Мы создаем новый итератор в виде объекта класса lmbCollection, который будет содержать данные, которые необходимо будет поместить в rss-список.
Затем мы явно инициализируем WACT шаблон rss/last_news.rss и передаем тегу <list:list> итератор с данными:
$template = new lmbWactTemplate('rss/last_news.rss'); $template->setChildDataSet('last_news', getNewsDataSetWithFullPaths());
Вот сам шаблон rss/last_news.rss :
<!--l version="1.0" encoding="utf-8"--> <!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">]> <rss version="0.92" xml:base="http://tutorial.dbrain.bit"> <channel> <title>YourDomain.com last news</title> <language>en</language> <list:list id='last_news'> <list:item> <item> <title>{$title}</title> <link>{$path}</link> <description> {$annotation} </description> <pubDate> {$date} </pubDate> </item> </list:item> </list:list> </channel> </rss>
После этого мы отсылаем браузеру соответствующий заголовок и отдаем ему содержимое отрендеренного шаблона:
header("Content-Type: application/xml"); $template->display();
Добавим ссылку на RSS ленту на все страницы, изменив шаблон template/page.html:
<html> <head> <title>Limb3 tutorial</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body bgcolor="#FFFFFF" text="#000000" > <a href="/last-news-feed.php">RSS-feed</a> <hr /> <core:PLACEHOLDER id="page_placeholder"/> </body> </html>
Обсуждение