framework.zend.com
Stable релиз 2.0 / 1.12

Создание RSS ленты с помощью Zend_Feed

К комментариям

Сегодня решил прикрутить к zendframework.ru rss ленту. Спешу поделиться рецептом.

Но сначала пару слов о RSS формате.

RSS - семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами. Так говорит нам wiki.

Простыми словами это специальный формат для удобного чтения новостей, статей или другой информации. Причем основной изюминкой RSS является возможность читать эти самые новости с сотни ресурсов, и при этом не посещать сами ресурсы. Чтение происходит в одном месте с помощью удобной специальной программы.

RSS формат имеет несколько версий, мы будем рассматривать версию 2.0 Итак, простая RSS лента или канал может иметь следующий вид:


<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
<channel>
<title>Русскоязычное Zend Framework сообщество</title>
<link>http://zendframework.ru</link>
<description> zendframework.ru - Русскоязычное Zend Framework сообщество </description>
<item>
<title>У нас появился фид</title>
<link>http://zendframework.ru/site-news/we-have-feed</link>
<description>У русскоязычного сообщества zendframework.ru появился свой фид.</description>
</item>
</channel>
</rss>

Из примера видно что лента (по другому фид, от англ. feed) состоит из двух частей. Описания самой ленты, и элементов item

Описание ленты содержит обязательные параметры title – название ленты, link – URL сайта на котором расположена лента и description – описание ленты. Каждый элемент item должен содержать или параметр title или параметр description как минимум. Как и в описании канала, так и в описании элементов может быть еще масса не обязательных параметров.

Когда с RSS стало ясно перейдем к реализации. В Zend Framework для таких целей есть специальный компонент Zend_Feed. Но после прочтения мануала может сложиться впечатление, что там предусмотрены лишь средства по обработке RSS, а генерацию обошли стороной.

На самом деле это не так. Под генерацией подразумевается импорт ленты http://framework.zend.com/manual/ru/zend.feed.importing.html

Простое и изящное решение было подсмотрено в блоге у William Estep. Мы воспользуемся возможностью импорта RSS ленты из массива.

Далее код с комментариями:


public function feedAction()
{

// Получение последних 10ти статей
$articlesTable = new Table_Articles();
$articlesLast10 = $articlesTable->getArticles(null, null, true, 10);

// Название ленты
$title = 'zendframework.ru';

// Ссылка на ленту
$urlPrefix = 'http://zendframework.ru';
$link = $urlPrefix;

// Описание
$description = 'zendframework.ru - русскоязычное Zend Framework сообщество';

// Кодировка
$charset = 'UTF-8';

// Массив для ленты
$feedArray = array(
'title' => $title,
'link' => $link,
'description' => $description,
'charset' => $charset,
'entries' => array()
);
// Добавляем статьи в массив
foreach ($articlesLast10 as $item) {

// Дату создания статьи необходимо привести к формату timestamp
$date = new Zend_Date($item['date'], 'YYYY-MM-dd HH:mm:ss');
$itemTimestamp = $date->getTimestamp();

$feedArray['entries'][] = array(
'title' => $item['title'],
'link' => $urlPrefix . '/' . $item['rubric_name'] . '/' . $item['name'],
'description' => $item['content'],
'lastUpdate' => $itemTimestamp
);

}

// Отключаем Zend_View и Zend_Layout, ведь мы создаем xml файл
$this->_helper->viewRenderer->setNoRender(true);
Zend_Layout::getMvcInstance()->disableLayout();

// Импортируем массив в ленту
$feed = Zend_Feed::importArray($feedArray, 'rss');

// Отправляем нужные заголовки браузеры и получаем нашу ленту
$feed->send();

}

Все получилось очень просто. Примерно такой же код использован для генерации rss ленты на этом сайте. Естественно здесь для примера он упрощен. В реальном коде текстовые надписи вынесены в текстовые файлы. URL сайта и кодировка берется из конфига, а ссылки на статьи генерируются с помощью view помощника Zend_View_Helper_Url.

Более подробную информацию по RSS 2.0 можно найти здесь

Updates:

16.11.08 С подачи atukai атрибут pubDate был заменен на lastUpdate. Атрибут pubDate отвечает за дату публикации RSS, более того, согласно мануалу, он должен называться published. Нам же нужна непосредственная дата создания или публикации статьи, для этого и существует атрибут lastUpdate. Кроме того дату нужно подавать в формате timestamp.

метки: rss, zend_feed
Лучший способ следить за обновлениями сайта это подписаться на RSS
Если информация была полезной для вас, вы можете поддержать сайт.
Комментарии:
rashad 07.11.2008 13:16 #
вообще интересный момент сам недавно делал ленту. но получилось менее изящно и более просто ( то есть две вьюхи в основной particularLoop вьюхи items )

пожалуй единственное что предложу использовать это в модели отдельный экшен для получения данных для рсс и возращать уже поля с псевдонимами (alias) сходными с псевдонимами для рсс ленты. кстати а что с кешом оной? вообще разбирался ли ты как тот же гугл ридер или фидбёрнер обрабатывает твою ленту
Ответить
san 07.11.2008 15:06 #
Рашад, твой вариант сомнительно проще :) Я так понял ты вообще без Zend_Feed сделал.

кстати а что с кешом оной?
А что с ним? :) Хочешь кешируй, я не кеширую.

вообще разбирался ли ты как тот же гугл ридер или фидбёрнер обрабатывает твою ленту
Вопрос не совсем понятен, не разбирался.
Ответить
Alex 08.11.2008 17:16 #
Вопрос как эта лента обрабатывается не такой простой... Я читаю RSS через Thunderbird, он вообще начисто игнорирует контент в ленте, берет только ссылки и загружает целиком странички с сайта. Как оно будет выглядеть в других ридерах - х.з.

В любом случае спасибо за статью :). Сейчас в порядке освоения ZF пробую сделать свой движок для блога и разбираться самому в каждой мелочи тяжко. Хорошо когда есть рабочие примеры реализации, а то пока по мануалу и методом тыка разберешься как оно там работает...
Ответить
san 08.11.2008 17:34 #
Alex, это у вас с лентой этого сайта такое? или вообще?
Ответить
atukai 10.11.2008 15:34 #
Вместо
'pubdate' = $item['date']
надо
'lastUpdate' = strtotime($item['date']),

иначе подставляется текущая дата

Ответить
san 16.11.2008 13:18 #
Действительно, pubDate это дата публикации rss.
Спасибо atukai за комментарий, внес правки в статью
Ответить
san 16.11.2008 14:05 #
Кстати Zend_Feed не поддерживает для Items атрибут author, что очень странно...
Ответить
Petrelevich 08.01.2010 12:52 #
Статья действительно сильно помогла. Я бы еще отметил, что у элементов RSS поля 'link' должны быть уникальны. Иначе RSS-читалки воспримут такие элементы как один.
Ответить
alex 27.01.2011 16:53 #
http://vitalvoice.ru/VitalVoiceWeb&nbsp;&nbsp;а сдесь можно и создать rss ленту и озвучить ее и можно озвучить весь сайт
Ответить
alex 27.01.2011 16:54 #
точнее вот такой адрес http://vitalvoice.ru/VitalVoiceWeb
Ответить
Уважаемые пользователи. Комментарии не для того чтобы:
  1. Спрашивать почему у вас не работает код, для этого есть тема форума закрепленная за статьей.
  2. Спрашивать как реализовать ту или иную функциональность, для этого необходимо создать свою тему на форуме.

Комментарии для того чтобы: высказать свое аргументированное мнение о статье, указать какие участки вызывают непонимание, что нужно исправить/улучшить, просто сказать спасибо.

Комментарии имеют древовидную структуру.
Если вы хотите ответить на определенный комментарий - нажмите на ссылку "Ответить" возле этого комментария.

Комментарии не соответствующие этим правилам могут быть удалены. Спасибо за понимание.
Комментарии временно отключены, вы можете воспользоваться форумом.