Блог о программировании

Реализация RSS-ленты на PHP с использованием ООП

Категория: PHP
 21 июня 2016 г. 1:09

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>editor@somesite.ru</managingeditor>
		<webmaster>webmaster@somesite.ru </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 каналом. Имеет следующие параметры:

  • title - обычно тот же текст, что и в RSS title;
  • description - описание графического файла, которое будет показано, если файл не доступен;
  • link - ссылка на страницу, с которой связан канал;
  • url - URL на файл формата JPEG, GIF или PNG, который связан с RSS каналом;
  • width - ширина рисунка;
  • height - высота рисунка.
rating PICS рейтинг RSS канала
textInput Определяет поле текстового ввода, которое может быть ассоциировано с каналом. Подробнее
skipHours Число часов, в течение которых RSS ридеры могут не проверять канал на обновления
skipDays Число дней, в течение которых RSS ридеры могут не проверять канал на обновления
Обязательные элементы итема (item)
title Имя итема (новости, сообщения) RSS канала
description Краткое описание итема
link Cсылка на страницу, содержащую полное описание события
Необязательные элементы итема (item)
author Email адрес автора сообщения
category Категория итема
comments Ссылка на страницу с комментариями по итему
enclosure

Описывает медиа-объект, присоединенный к итему. Имеет следующие параметры:

  • url - ссылка на файл объекта;
  • length - размер файла в байтах;
  • type - тип файла, в соответствии со спецификацией MIME.
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-ленты

Вот так просто и элегантно сделать RSS-ленту для сайта.

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

Теги:  php  rss  ООП  php7 

Поделиться статьей

Оставить комментарий