Вход Регистрация
Файл: protected/extensions/RssGen.php
Строк: 82
<?php
/* 
 * RssGen - класс для простой генерации RSS каналов
 * @author Replikon
 * 
 * "Велосипед следует изобретать только в двух случаях:
 * 1. Велосипеда не существует.
 * 2. Все существующие велосипеды с квадратными колесами." (c)
 *
 * Цели, преследовавшиеся во время написания:
 * 1. Легкость создания RSS лент.
 * 2. Легкость использования и Легкость самого класса. Чтобы не был излишне сложным, в отличие от других велосипедов с реактивными двигателями, наведением из космоса и прямой связью с Марсом. Для управления которыми надо пройти 3-месяный курс обучения.
 * 3. Но при этом необходимая функциональность, не как у трехколесного велосипеда.
 * 4. Всегда полностью валидная лента. Никому не хочется, чтобы от велосипеда отваливались куски при езде. И уж точно не хочется потом ремонтировать велосипед.
 * 5. Независимость от фреймворков, CMS и т.п.
 */

class RssGen
{
    
/*
     * Название канала
     */
    
public $title;

    
/*
     * Ссылка на сайт, которому принадлежит эта RSS лента
     * Внимание! Ссылка должна быть абсолютной! Впрочем, как и все ссылки в ленте.
     */
    
public $link;

    
/*
     * Описание канала
     */
    
public $desctiption;

    
/*
     * Дата публикации текста в канале в TIMESTAMP.
     * Например, «New York Times» выходит ежедневно и дата публикации меняется каждые 24 часа, тогда и меняется pubDate канала.
     */
    
public $pubDate;

    
/*
     * Время Последнего изменения содержимого канала в TIMESTAMP.
     */
    
public $lastBuildDate;



    
// Необязательные элементы, но весьма желательные
    /*
     * Изображение, выводимое рядом с названием ленты в агрегаторе.
     * Точнее ссылка на него.
     *
     * Теория:
     * <image> — дочерний элемент <channel>, содержащий три обязательных и три дополнительных элемента.
     * Обязательные элементы:
     * <url> - URL изображения GIF, JPEG или PNG, представляющего канал.
     * <title> - Описание изображения, которое будет использовано в атрибуте alt элемента HTML img, когда канал будет показан в гипертексте.
     * <link> - URL сайта; изображение канала будет служить ссылкой на этот сайт.
     * (Как правило, <title> и <link> изображения должны совпадать с <title> и <link> канала. (Вот поэтому нужно указать лишь ссылку, а все остальное скрипт допишет сам.)
     */
    
public $image;

    
/*
     * Язык содержимого ленты.
     * По умолчанию русский.
     */
    
public $language 'ru';






    
/*
     * Переменная с содержимым тегов Item.
     * В нее динамически "собирается" канал в процессе работы класса.
     */
    
protected $items;



    
/*
     * Добавление нового элемента Item
     * @param $item Экземпляр класса RssGenItem
     */
    
public function addItem (RssGenItem $item)
    {
        
$this->items .= $item->getXml ();
    }

    
/*
     * Отображение содержимого ленты
     */
    
public function render ()
    {
        
header ('Content-type: application/rss+xml');

        echo 
'<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
    <title><![CDATA[' 
$this->title ']]></title>
    <link>' 
$this->link '</link>
    <description><![CDATA[' 
$this->desctiption ']]></description>
    <language>' 
$this->language '</language>
    <generator>' 
$this->getGenerator () . '</generator>
    <pubDate>' 
date ('r'$this->pubDate) . '</pubDate>
    <lastBuildDate>' 
date ('r'$this->lastBuildDate) . '</lastBuildDate>
'
;

        if (!empty (
$this->image)) echo '    <image>
        <url>' 
$this->image '</url>
        <title>' 
$this->title '</title>
        <link>' 
$this->link '</link>
    </image>
'
;

        echo 
$this->items;

        echo 
'
</channel>
</rss>'
;
    }



    
/*
     * Текущая версия класса
     */
    
public function getVersion ()
    {
        return 
'2.0';
    }

    
/*
     * Поле Generator в ленте
     */
    
public function getGenerator ()
    {
        return 
'RssGen v' $this->getVersion ();
    }
}



/*
 * Класс элемента item
 */
class RssGenItem
{
    
/*
     * Заголовок материала
     */
    
public $title;

    
/*
     * Ссылка на материал
     */
    
public $link;

    
/*
     * Описание материала
     */
    
public $description;



    
// Необязательные элементы, но весьма желательные
    /*
     * Дата публикации материала в TIMESTAMP
     */
    
public $pubDate;

    
/*
     * Строка, уникальным образом идентифицирующая сообщение.
     * По умолчанию, в этот атрибут автоматически вводится ссылка на статью.
     *
     * Немного теории:
     * Guid — уникальный на уровне канала строковый идентификатор статьи. Сборщик может использовать идентификаторы для выявления новых статей.
     *
     * Пример: <guid>http://some.server.com/weblogItem3207</guid>.
     * Синтаксис guid не определен.
     *
     * Если для guid необязательный атрибут isPermaLink имеет значение true, то идентификатор рассматривается как постоянная ссылка на полную статью, описанную в элементе <item>:
     * <guid isPermaLink="true">http://inessential.com/2002/09/01.php#a2</guid>.
     * 
     * ПО УМОЛЧАНИЮ ЗНАЧЕНИЕ isPermaLink РАВНО TRUE; если указано false, то guid не может рассматриваться как URL.
     *
     * Часто возникает вопрос касательно элементов <guid>: это не одно и то же, что и <link>?
     * В некоторых системах, предоставляющих контент, это так, в других — нет.
     * В ряде систем <link> является постоянной ссылкой на запись блога; в других — ссылкой на полный текст (если в <item> содержится краткое изложение), а на запись в блоге ведет <guid>.
     * В любом случае, рекомендуется, чтобы вы указывали guid, и, если возможно, он был постоянной ссылкой. Это позволяет сборщикам не повторять записи, даже если они редактировались.
     */
    
public $guid;

    
/*
     * URL страницы для комментариев, относящихся к сообщению.
     */
    
public $comments;

    
/*
     * Элемент указывает адрес электронной почты автора сообщения.
     * Но часто используют просто логин.
     */
    
public $author;



    
/*
     * Возвращает фрагмент RSS ленты с текущим тегом Item
     */
    
public function getXml ()
    {
        if (empty (
$this->guid)) $this->guid $this->link;

        
// Собираем элемент
        
$xml '
    <item>
        <title><![CDATA[' 
$this->title ']]></title>
        <link>' 
$this->link '</link>
        <description><![CDATA[' 
$this->description ']]></description>';

        if (!empty (
$this->pubDate))    $xml .= '
        <pubDate>' 
date ('r'$this->pubDate) . '</pubDate>';
        if (!empty (
$this->guid))       $xml .= '
        <guid isPermaLink="true">' 
$this->guid '</guid>';
        if (!empty (
$this->comments))   $xml .= '
        <comments>' 
$this->comments '</comments>';
        if (!empty (
$this->author))     $xml .= '
        <author>' 
$this->author '</author>';

        
$xml .= '
    </item>
'
;
        return 
$xml;
    }
}
Онлайн: 0
Реклама