RSS канал на свой блог я прикрутил давно, взяв php скрипт из Danneo CMS. Вот только радость моя была не долгой, скрипт не давал валидный rss, и любимая Opera кричала что-то невразумительное об ошибке XML. Тогда я решил написать rss генератор сам, но так как не очень люблю строить велосипеды, сперва я решил поискать готовое решение.
Попробовав кучу скриптов мой выбор пал на скрипт из phpclasses.org, также можете скачать на моем сайте
Скрипт поддерживает генерацию:
- RSS 1.0
- RSS 2.0
- ATOM 1.0
Особенности :
- Генерирует валидные RSS 1.0, RSS 2.0 и ATOM 1.0 каналы
- Все каналы отлично проходят валидацию через RSS валидаторы (к примеру feedvalidator.org)
- Просто и легко определить общий канал и канал для элементов ( к примеру для комментариев)
- Реализует соответствующие пространства имен для разных версий
- Автоматически преобразует форматы дат
- Создает UUID для ATOM-каналов
- Позволяет использовать субтеги и атрибуты . (к примеру: image)
- Полностью объектно ориентированно в структуре класса PHP5.
- Специальные данные, содержащие ссылки помещены в контейнер CDATA
Минимальный пример:
Это минимальный пример использования скрипта.Я генерирую RSS 2.0 канал используя данные из БД. В архиве вы найдете куда больше примеров для генерации различных видов каналов.
// Это минимальный пример использования класса include("FeedWriter.php"); //Создаем экземпляр класса FeedWriter. $TestFeed = new FeedWriter(RSS2); //Настройка канала элементов //Использование функции-оболочки для общих элементов канала $TestFeed->setTitle('Тест & Проверка RSS генератора'); $TestFeed->setLink('http://xdan.ru'); $TestFeed->setDescription('Этот тест создает RSS 2.0 канал, при помощи скрипта Universal Feed Writer'); //читаем информацию из бд mysql_connect("server", "mysql_user", "mysql_password"); mysql_select_db("my_database"); $result = mysql_query("Ваш запрос"); while($row = mysql_fetch_array($result, MYSQL_ASSOC)) { //создаем пустой item $newItem = $TestFeed->createNewItem(); //добавляем в него информацию $newItem->setTitle($row['title']); $newItem->setLink($row['link']); $newItem->setDate($row['create_date']); $newItem->setDescription($row['description']); //теперь добавляем item в наш канал $TestFeed->addItem($newItem); } //Все готово. Генерируем и выводим получившийся XML $TestFeed->genarateFeed();
Никаких заголовков посылать не нужно, скрипт все делает сам.
Нюансы:
Данный скрипт писался англоязычным индусом, для американцев, и как водится для таких скриптов, кириллицу не поддерживает. Но не все так плохо.
Находим строку 298 в файле FeedWriter.php: и заменяем htmlentities($tagContent) на htmlentities($tagContent, ENT_QUOTES, ‘UTF-8′).
$nodeText .= (in_array($tagName, $this->CDATAEncoding))? $tagContent :htmlentities($tagContent, ENT_QUOTES, 'UTF-8');
Все работает.
И еще один момент, если Вы используете в своем движке __autoload функцию, то лучше в файле FeedWriter.php удалить или закомментировать следующие строки
// autoload classes function __autoload($class_name) { require_once $class_name . '.php'; }
и затем там, где вы подключали include("FeedWriter.php"); добавить include("FeedItem.php")
include("FeedWriter.php"); include("FeedItem.php");
Вот и все, теперь осталось написать универсальный RSS Ридер =) Упс, в Google уже это сделали)
Комментарии
Надо добывить static
public static function uuid($key = null, $prefix = '')
и еще setImage не работает надо заменить setEncloser