Инструменты пользователя

Инструменты сайта


limb3_2007_4:ru:tutorials:basic:step6

Шаг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 клиенту.

Вот его исходный код:

<?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>

Далее

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
   ___   _____  _____  _____  __  __
  / _ \ / ___/ / ___/ / ___/ / / / /
 / // // /__  / (_ / / /__  / /_/ / 
/____/ \___/  \___/  \___/  \____/
 
limb3_2007_4/ru/tutorials/basic/step6.txt · Последние изменения: 2010/11/10 10:02 (внешнее изменение)