====== Шаг6. Создание RSS-feed новостной ленты ======
RSS - неотъемлемая часть любого часто обновляемого проекта. В данном документе мы покажем, как можно создать RSS-feed при помощи Limb и WACT.
Допустим, что нам необходимо сделать RSS-feed для последних новостей нашего туториала.
Создадим скрипт **last-news-feed.php**, который будет делать вот что:
* получать последние новости,
* сортировать их по дате последней модификации,
* нормализовать атрибуты hrefs для того, чтобы сделать их абсолютными, то есть href='/test/../new' должен стать href='http://yourdomain.com/new'
* передавать обработанные данные в WACT шаблон, где будет формироваться XML
* отдавать XML клиенту.
Вот его исходный код:
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 lmbArrayDataset($result);
}
?>
Поясним, что же здесь происходит:
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 lmbArrayDataset($result);
}
?>
При помощи функции _getNewsDataSetWithFullPaths() мы загружаем набор из новостей из таблички news, сортируя их по дате и заголовку, ограничивая раздел выборки 5-ю элементами.
Для выборки мы использовали статический метод lmbActiveRecord :: find(), который принимает название класса получаемых объектов и массив параметров, которые нужно применить к выборке. В нашем случае мы передали параметры **sort** и **limit**. Параметр sort передается в виде массива вида - поле => способ_сортировки.
Если бы мы делали все в шаблоне, то тот же самый код можно было бы записать:
Далее при помощи:
$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 lmbArrayDataset($result);
Мы создаем новый итератор в виде объекта класса lmbArrayDataset, который будет содержать данные, которые необходимо будет поместить в rss-список.
Затем мы явно инициализируем WACT шаблон rss/last_news.rss и передаем тегу итератор с данными:
$template = new lmbWactTemplate('rss/last_news.rss');
$template->setChildDataSet('last_news', getNewsDataSetWithFullPaths());
Вот сам шаблон rss/last_news.rss :
]>
YourDomain.com last newsen{$title}
{$path}
{$annotation}
{$date}
После этого мы отсылаем браузеру соответствующий заголовок и отдаем ему содержимое отрендеренного шаблона:
header("Content-Type: application/xml");
$template->display();
Добавим ссылку на RSS ленту на все страницы, изменив шаблон template/page.html:
Limb3 tutorialRSS-feed
===== Далее =====
* [[.step7|Шаг7. Рекомендации по дальнейшему изучению]]