====== Создание RSS-feed при помощи Limb2 ======
RSS - неотъемлемая часть любого часто обновляемого проекта. В данном документе мы покажем, как можно создать RSS-feed при помощи Limb и WACT.
Допустим, что нам необходимо сделать RSS-feed для последних новостей и документов.
Создадим простейший скрипт **last-news-feed.php**, который будет делать вот что:
* получать последние новости и документы,
* объединять полученные объекты и сортировать их по дате последней модификации. Если даты равны, то будет применять еще один сортировочный механиз (например, по заголовку),
* нормализовать аттритуры hrefs для того, чтобы сделать их абсолютными, то есть href='/root/test/../new' должен стать href='http://yourdomain.com/root/new'
* передавать обработанные данные в WACT шаблон
Следующий код во многом не требует дополнительных комментариев:
$b['node_id'])
return -1;
else
return 1;
}
return ($date1 > $date2) ? -1 : 1;
}
//функция, которая конвертирует относительные ссылки в абсолютные, используя базовый путь
function fix_hrefs($base_path, $content)
{
$GLOBALS['base_path'] = $base_path;
return preg_replace_callback('~href=("|\')?([^"\'>\s]+)("|\')?~', '_replace_callback', $content);
}
function _replace_callback($matches)
{
if(preg_match('~(https?|ftp)://~', $matches[2]))
return $matches[0];
$url = get_qualified_url($GLOBALS['base_path'], $matches[2]);
return "href='{$url}'";
}
function get_qualified_url($base_path, $raw_path)
{
$path = $raw_path;
if($path{0} != '/')
{
$uri = new uri($base_path . '/' . $path);
$uri->normalize_path();
$path = $uri->get_path();
}
return 'http://' . $_SERVER['HTTP_HOST'] . $path;
}
// получаем новости
$counter = 0;
$params = array(
'limit' => 3,
'order' => array('modified_date' => 'DESC')
);
$arr_news = fetch('news_object', $counter, $params, 'fetch_accessible');
// получаем документы
$params = array(
'limit' => 3,
'order' => array('modified_date' => 'DESC')
);
$arr_documents = fetch('document', $counter, $params, 'fetch_accessible');
// объединяем и сортируем данные
$arr = array_merge($arr_documents, $arr_news);
uasort($arr, 'sorter');
foreach($arr as $key => $data)
{
// делаем все ссылки в контенте абсолютными
$arr[$key]['annotation'] = fix_hrefs($data['path'], $data['annotation']);
// делаем uri до объекта абсолютным
$arr[$key]['path'] = get_qualified_url($data['path'], $data['path']);
}
// создаем источник данных для шаблона
$ds = new array_dataset($arr);
// перадаем данные в шаблон
$template = new template('/rss/last_news.rss');
$template->set('xml', '');
$news = & $template->find_child('last_news');
$news->register_dataset($ds);
// выводим результат
header("Content-Type: application/xml");
$template->display();
?>
А теперь шаблон:
{$xml}
]>
YourDomain.com last news
http://YourDomain.com
YourDomain.com siteen{$title}
{$path}
Обратите внимание, что мы используем тег **** для того, чтобы очистить html-код, а также тег **** для вывода локализованной даты.
Теперь поместим этот скрипт в **PROJECT_DIR/last-news-feed.php** и шаблон в **PROJECT_DIR/design/main/templates/rss/last_news.rss**. Далее ставим ссылку на RSS-feed где-нибудь на странице сайта, например так:
Вот и все!