Реализация RSS-ленты на PHP с использованием ООП
RSS — семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном
для него виде специальными программами-агрегаторами. Обычно с помощью RSS 2.0 даётся краткое описание новой информации, появившейся на сайте, и ссылка на её полную версию. Интернет-ресурс в формате RSS называется RSS-каналом или RSS-лентой или RSS-фидом.
Практически все популярные современные браузеры поддерживают RSS каналы: Safari, Maxthon, Mozilla Firefox, Mozilla Thunderbird, Opera, Microsoft Internet Explorer начиная с 7-й версии. Технически RSS-лента представляет собой веб-страницу, информация
на которой отображается в определенном формате.
В данной статье будет рассмотрен самый последний формат на момент написания статьи - RSS 2.0. Полная спецификация данного формата находится здесь. Для того, чтобы RSS-лента корректно
работала, одна должна быть пройдена валидатором.
Пример RSS
Фактически, RSS-формат и является обычным XML-форматом, который использует собственные теги в определенной последовательности. Пример RSS-файла выглядит так:
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>World Wide News</title>
<link>http://www.somesite.ru/</link>
<description>News from whole world.</description>
<language>en-us</language>
<pubdate>Tue, 07 Jun 2016 04:00:00 GMT</pubdate>
<lastbuilddate>Tue, 07 Jun 2016 09:41:01 GMT</lastbuilddate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>simple RSS generator</generator>
<managingeditor>[email protected]</managingeditor>
<webmaster>[email protected] </webmaster>
<item>
<title>Star City</title>
<link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
<description>How do Americans get ready to work with Russians aboard the International Space Station? They take a crash course in culture, language and protocol at Russia's Star City.</description>
<pubdate>Tue, 03 Jun 2003 09:39:21 GMT</pubdate>
<guid>http://liftoff.msfc.nasa.gov/2003/06/03.html#item573</guid>
</item>
<item>
<title>Space Exploration</title>
<link>http://liftoff.msfc.nasa.gov/</link>
<description>Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a partial eclipse of the Sun on Saturday, May 31st.</description>
<pubdate>Fri, 30 May 2003 11:06:42 GMT</pubdate>
<guid>http://liftoff.msfc.nasa.gov/2003/05/30.html#item572</guid>
</item>
</channel>
</rss>
Описание формата
RSS-файл содержит как обязательные, так и не обязательные элементы. В элемент записывается описание канала. В элементы записываются описания
записей/статей/постов/материалов/новостей.
| Обязательные элементы канала (channel) | |
| title | Имя RSS канала. Оно, например, может совпадать с названием сайта |
| description | Краткое описание RSS канала |
| link | Ссылка на сайт, с которым связан канал |
| Необязательные элементы канала (channel) | |
| language | Язык канала (en-us - Английский; ru - Русский) |
| copyright | Сведения об авторстве на RSS канал |
| managingEditor | Email адрес ответственного за контент канала |
| webMaster | Email адрес ответственного за техническую часть публикации канала |
| pubDate | Дата публикации канала, в соответствии с Date and Time Specification of RFC 822 |
| lastBuildDate | Время последней модификации канала в соответствии с Date and Time Specification of RFC 822 |
| category | Одна или несколько категорий, к которым принадлежит канал |
| generator | Название программы, использованной для генерирования RSS канала |
| docs | Ссылка на файл документации подвида RSS, который был использован для создания канала |
| cloud | Указывает веб-сервис, поддерживающий интерфейс rssCloud, реализующий подписку на обновления канала. Подробнее |
| ttl | Ttl расшифровывается как ‘time to live’. Это число минут, в течение которых канал сохраняет свою актуальность |
| image | Используется для подключения графического файла (GIF, JPEG, или PNG), который будет показан вместе с RSS каналом. Имеет следующие параметры:
|
| rating | PICS рейтинг RSS канала |
| textInput | Определяет поле текстового ввода, которое может быть ассоциировано с каналом. Подробнее |
| skipHours | Число часов, в течение которых RSS ридеры могут не проверять канал на обновления |
| skipDays | Число дней, в течение которых RSS ридеры могут не проверять канал на обновления |
| Обязательные элементы итема (item) | |
| title | Имя итема (новости, сообщения) RSS канала |
| description | Краткое описание итема |
| link | Cсылка на страницу, содержащую полное описание события |
| Необязательные элементы итема (item) | |
| author | Email адрес автора сообщения |
| category | Категория итема |
| comments | Ссылка на страницу с комментариями по итему |
| enclosure | Описывает медиа-объект, присоединенный к итему. Имеет следующие параметры:
|
| guid | Уникальная строка, используемая для идетификации итема |
| pubDate | Дата публикации итема, в соответствии с Date and Time Specification of RFC 822 |
| source | RSS канал, откуда появился данный итем на текущем канале |
Пишем класс для формирования RSS
Поскольку формат RSS является надстройкой над XML, то можно воспользоваться всеми средствами работы с XML из расширения DOM. Реализуем класс, который будет работать со всеми обязательными элементами RSS:
class Feed extends DOMDocument {
private $channel;
public function __construct($title, $link, $description) {
parent::__construct('1.0', 'utf-8');
$this->formatOutput = true;
$root = $this->appendChild($this->createElement('rss'));
$root->setAttribute('version', '2.0');
$channel = $root->appendChild($this->createElement('channel'));
$channel->appendChild($this->createElement('title', $title));
$channel->appendChild($this->createElement('link', $link));
$channel->appendChild($this->createElement('description', $description));
$this->channel = $channel;
}
public function addItem($title, $link, $description, $aOptCategory = null, DateTime $aOptPubDate = null) {
$item = $this->createElement('item');
$item->appendChild($this->createElement('title', $title));
$item->appendChild($this->createElement('link', $link));
$item->appendChild($this->createElement('guid', $link));
if (!is_null($aOptCategory) && strlen(trim($aOptCategory)) > 0) {
$category = trim($aOptCategory);
$categoryElement = $this->createElement('category');
$categoryElement->appendChild($this->createCDATASection($category));
$item->appendChild($categoryElement);
}
if (!is_null($aOptPubDate) && ($aOptPubDate instanceof DateTime)) {
$item->appendChild($this->createElement('pubDate', $aOptPubDate->format(DateTime::RFC2822)));
}
$descriptionElement = $this->createElement('description');
$descriptionElement->appendChild($this->createCDATASection($description));
$item->appendChild($descriptionElement);
$this->channel->appendChild($item);
return $this;
}
}Класс для формирования RSS довольно простой – для начала мы расширяем класс DOMDocument поскольку, как уже было сказано RSS – это надстройка над XML. В конструктор передается обязательная информация о канале: название, ссылка и описание, где формируются
xml-элементы и . Также в конструкторе задаем кодировку utf-8. Метод Feed::addItem() принимает
пять параметров (первые три обязательные, остальные - нет): название записи, ссылка на нее, описание, категорию и дату публикации.
Формируем RSS
Пользоваться написанным классом совершенно просто: получаем экземпляр класса и добавляем туда необходимые записи. После чего выводим результат в формате xml.
$feed = new Feed('Заметки со всего света', 'http://www.somesite.ru', 'Описание канала');
$feed->addItem('Запись 1', 'http://www.somesite.ru/post/1', 'Описание записи 1', 'Обо всем', new DateTime());
$feed->addItem('Запись 2', 'http://www.somesite.ru/post/2', 'Описание записи 2', 'О конкретном', new DateTime());
echo $feed->saveXML();В результате получим сформировавшийся RSS-канал:

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