RSS 提要 PHP/MySQL [英] RSS feed PHP/MySQL

查看:53
本文介绍了RSS 提要 PHP/MySQL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有没有好的 PHP 类可以从 mysql 表生成 RSS 文件?

Is there a good PHP Class to generate a RSS file from mysql tables?

推荐答案

我在几个小时前写了一些小类,并使用提要验证器对其进行了测试,效果非常好.这里源代码

I've wrote few hours ago small classes and tested it with feed validator and it work really fine. Here source code

<?php

/**
 * Top Level Element or RSS Feed 2.0.
 *
 * RSS Parent Element.
 *
 * @version 1.0
 * @author makemoney2010
 * @property array $Channels array of RSSChannell
 */
class RSS
{
    public $Channels=array();

    function __construct()
    {
        $this->Channels=array();
    }
    /**
     * Add a new RSSChannell to the Channells
     * @method void
     * @param RSSChannell $RssChannell 
     */
    function addChannell($RssChannell)
    {
        $this->Channels[]=$RssChannell;
    }
    /**
     * Clear all the item within the channells
     * @method void
     */
    function clearChannells()
    {
        $this->Channels=array();
    }
    /**
     * Get full RSS xml
     * @param boolean $forceCData Define is Cdata must be used or not this value will be propagated within all child RSSchannels and/or their itemChannell
     * @return  string Full RSS structure that should be used as response or even as string to put within a static file.
     */
    function getOutputXML($forceCData)
    {
        $output='<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';

        foreach($this as $key=>$value)
        {
            if (is_array($value))
            {
                foreach($value as $key => $item)
                {
                    /** @var RSSChannell $item */
                    $output.= $item->getOutputXML($forceCData);
                }
            }

            //$output.=$value->getOutputXML($forceCData);
        }
        $output.='</rss>';
        return $output;
    }
}

/**
 * Class Channell
 * @property string $title Channell title  REQUIRED NOT OPTIONAL IN RSS
 * @property string $description Description of the channell REQUIRED NOT OPTIONAL IN RSS
 * @property string $atomlink <atom:link href="http://dallas.example.com/rss.xml" rel="self" type="application/rss+xml" />
 * @property string $copyright Copyright notice for content in the channel: Example {copyright 2002, Spartanburg Herald-Journal} OPTIONAL NOT REQUIRED IN RSS
 * @property string $managingEditor Email address for person responsible for editorial content. Example {geo(et)herald.com (George Matesky)} OPTIONAL NOT REQUIRED IN RSS
 * @property string $webMaster Email address for person responsible for technical issues relating to channel. Example {betty(et)herald.com (Betty Guernsey)} OPTIONAL NOT REQUIRED IN RSS
 * @property string $language Language of the channell OPTIONAL NOT REQUIRED IN RSS
 * @property string $pubDate The publication date for the content in the channel. For example, the New York Times publishes on a daily basis, the publication date flips once every 24 hours. That's when the pubDate of the channel changes. All date-times in RSS conform to the Date and Time Specification of RFC 822, with the exception that the year may be expressed with two characters or four characters (four preferred). Example {Sat, 07 Sep 2002 00:00:01 GMT} OPTIONAL NOT REQUIRED IN RSS
 * @property string $lastBuildDate  The last time the content of the channel changed. Example {Sat, 07 Sep 2002 09:42:31 GMT} OPTIONAL NOT REQUIRED IN RSS
 * @property string $category Specify one or more categories that the channel belongs to. Follows the same rules as the <item>-level category element. OPTIONA NOT REQUIRED IN RSS
 * @property string $generator A string indicating the program used to generate the channel. Example {MightyInHouse Content System v2.3}
 * @property string $docs A URL that points to the documentation for the format used in the RSS file. It's probably a pointer to this page. It's for people who might stumble across an RSS file on a Web server 25 years from now and wonder what it is. More info at http://blogs.law.harvard.edu/tech/rss OPTIONAL NOT REQUIRED IN RSS
 * @property string $cloud Allows processes to register with a cloud to be notified of updates to the channel, implementing a lightweight publish-subscribe protocol for RSS feeds. More info here. <cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="pingMe" protocol="soap"/> OPTIONAL NOT REQUIRED IN RSS
 * @property string $ttl ttl stands for time to live. It's a number of minutes that indicates how long a channel can be cached before refreshing from the source.  OPTIONAL NOT REQUIRED IN RSS
 * @property string $image Specifies a GIF, JPEG or PNG image that can be displayed with the channel OPTIONAL NOT REQUIRED IN RSS
 * @property int $rating    The PICS rating for the channel OPTIONAL NOT REQUIRED IN RSS
 * @property int $skipHours A hint for aggregators telling them which hours they can skip OPTIONAL NOT REQUIRED IN RSS
 * @property int $skipDays A hint for aggregators telling them which days they can skip OPTIONAL NOT REQUIRED IN RSS
 * @method getCountItems()  Get count of items inclued into array ChannellsItems
 */
class RSSChannell{
    #region properties
    public $language;
    private $channellsItems=array();
    public $atomlink;
    public $title;
    public $description;
    public $pubDate;
    public $copyright;
    public $managingEditor;
    public $webMaster;
    public $lastBuildDate;
    public $category;
    public $generator;
    public $docs;
    public $cloud;
    public $ttl;
    public $image;
    public $rating;
    public $skipHours;
    public $skipDays;
    #endregion
    #region void
    /**
     * Summary of __construct
     * @param string $lang setup the channell language and the default array of ItemChannell
     * @param array $channellsItems as collection of itemChannell
     */
    function __construct($lang) 
    {
        $this->language=$lang;
        $this->channellsItems=array();
    }

    /**
     * Clear all the items within the $channellsItems array
     * @method void clearChannellItems() 
     */
    function clearChannellItems()
    {
        $this->channellsItems=array();
    }
    /**
     * Add a new item to the channellsItems collection
     * @method void addItemChannell(itemChannell $itemChannell)
     * @param ItemChannell $itemChannell 
     */
    function addItemChannell($itemChannell)
    {
        $this->channellsItems[]=$itemChannell;
    }
    /**
     * Set basic Email information within the feed about webmaster, copyright,managingEditor at once.If need it could be changed one by one setting its own right value.
     * @param mixed $email 
     * @param mixed $name 
     */
    function setBasicEmail($email,$name)
    {
        $this->copyright=$email.' ('.$name.')';
        $this->managingEditor=$email.' ('.$name.')';
        $this->webMaster=$email.' ('.$name.')';
    }
    /**
     * Set Email information about copyright.
     * @param string $email 
     * @param string $name 
     * @method void
     */
    function setCopyright($email,$name)
    {
        $this->copyright=$email.' ('.$name.')';
    }
    /**
     * Set  Email information about managingEditor
     * @param string $email 
     * @param string $name 
     * @method void
     */
    function setmanagingEditor($email,$name)
    {
        $this->managingEditor=$email.' ('.$name.')';
    }
    /**
     * Set basic Email information about webmaster
     * @param string $email 
     * @param string $name 
     * @method void
     */
    function setwebMaster($email,$name)
    {
        $this->webMaster=$email.' ('.$name.')';
    }
    #endregion
    #region functions
    /**
     * Return the count of all the items within channellsItems
     * @return int
     */
    function getCountItems()
    {
        return count($this->channellsItems);
    }
    /**
     * @method function 
     * @param boolean $forceCData For default True indicate if use CDATA section within string field in order to prevent wrong markup in RSS feed too
     */
    function getOutputXML($forceCData=true)
    {
        $output='<channel>';
        $items='';
        foreach($this as $key=>$value)
        {
            if(is_array($value))
            {
                $o=new ItemChannell();
                foreach($value as $item)
                {
                    /** @var ItemChannell $item */
                $items.= $item->getOutputXML($forceCData);
                }
            }else
            {
                if(!empty($value) || $value !=null || $value!=0 || $value!='')
                {
                    //cheking for atomlink element
                    if($key==='atomlink')
                    {
                        $output.='<atom:link href="'.$value.'" rel="self" type="application/rss+xml" />';
                    }
                    else{
                        if($forceCData)
                        {
                            $value=htmlspecialchars($value);
                            $output.=sprintf('<%1$s><![CDATA[%2$s]]></%1$s>',$key,$value); 
                        }
                        else
                        {
                            $value=htmlspecialchars($value);
                            $output.=sprintf('<%1$s>%2$s</%1$s>',$key,$value); 
                        }
                    }
                }
            }

        }

        $output.=$items;
        $output.='</channel>';
        return $output;
    }
    #endregion

}
/**
 * Class ItemChannel exposes all the properties within a fully compliant RSS item element
 * @property string $title  The title of the item. Example: Venice Film Festival Tries to Quit Sinking
 * @property string $link   The URL of the item. Example: http://nytimes.com/2004/12/07FEST.html
 * @property string $description Example: The item synopsis.Some of the most heated chatter at the Venice Film Festival this week was about the way that the arrival of the stars at the Palazzo del Cinema was being staged.
 * @property string $author Email address of the author of the item. 
 * @property string $category Includes the item in one or more categories.   
 * @property string $comments URL of a page for comments relating to the item. Example: http://www.myblog.org/cgi-local/mt/mt-comments.cgi?entry_id=290
 * @property string $enclosure Describes a media object that is attached to the item.   
 * @property string $guid A string that uniquely identifies the item.   
 * @property datetime $pubDate Indicates when the item was published. Example: Sun, 19 May 2002 15:21:36 GMT
 * @property string $source The RSS channel that the item came from.
 */
class ItemChannell{
    #region properties
    public $title;
    public $link;
    public $description;
    public $author;
    public $category;
    public $comments;
    public $enclosure;
    public $guid;
    public $pubDate;
    public $source;
    #endregion
    #region void
    /**
     * Constructor of the Items
     */
    function __construct()  
    {
    //Nothing required
    }
    /**
     * Set the title of the item
     * @method void 
     * @param string $title 
     */
    function setTitle($title)
    {
        $this->title=$title;
    }
    /**
     * Set the link of the item
     * @method void 
     * @param string $link 
     */
    function setLink($link)
    {
        $this->link=$link;
    }
    /**
     * Set the description of the item
     * @method void 
     * @param string $description 
     */
    function setDescription($description)
    {
        $this->description=$description;
    }
    /**
     * Set the author of the item
     * @method void 
     * @param string $author 
     */
    function setAuthor($author)
    {
        $this->author=$author;
    }
    /**
     * Set the category of the item
     * @method void 
     * @param string $category 
     */
    function setCategory($category)
    {
        $this->category=$category;
    }
    /**
     * Set comments url of the item
     * @method void
     * @param mixed $comments 
     */
    function setCommentsUrl($comments)
    {
        $this->comments=$comments;
    }
    /**
     * Set enclosure of item
     * @method void
     * @param string $enclosure 
     */
    function setEnclosure($enclosure)
    {
        $this->enclosure=$enclosure;
    }
    /**
     * Set guid of the item
     * @method void
     * @param string $guid 
     */
    function setGuidItem($guid)
    {
        $this->guid=$guid;
    }
    /**
     * Set pubdate of the item
     * @method void
     * @param datetime $pubDate 
     */
    function setPubDate($pubDate)
    {
        $this->pubDate=$pubDate;
    }
    /**
     * Set source of item
     * @method void
     * @param string $source 
     */
    function  setSource($source)
    {
        $this->source=$source;
    }
    #endregion
    #region function
    /**
     * Get the output in xml format for the rss item
     * @method function
     * @param boolean $forceCDATA Include all the item of type string within a CDATA section in order to prevent issues.Default use it.
     * @return string Xml well formatted as requires
     */
    function getOutputXML($forceCDATA=true)
    {
        $output='<item>';
        foreach($this as $key=> $value)
        {
            if(!empty($value) || $value !=null || $value!=0 || $value!='')
            {
                if($forceCDATA)
                {
                    $value=htmlspecialchars($value);
                    $output.=sprintf('<%1$s><![CDATA[%2$s]]></%1$s>',$key,$value); 
                }
                else
                {
                    $output.=sprintf('<%1$s>%2$s</%1$s>',$key,$value); 
                }
            }

        }
        $output.='</item>';
        return $output;
    }
    #endregion
}

使用该文件,您可以完全访问创建完整 RSS 所需的所有类.

With that file you have complete access to all the classes that you could need to create a complete RSS.

下面是使用这些类的简单示例

Here below a simple example of the use of those classes

function test()
 {
     //Define a basic RSS object which represent the root ot the RSS Feed too
     $rss= new RSS();
     //Declare a RSS Channell object and fill the property that you need here below a simple example
     $rssChan= new RSSChannell('en');
     $rssChan->title='This is my first Channell RSS';
     $rssChan->description='this channell is very cool and is built in a simple manner with a specialized class';
     $rssChan->category='Category';
     $rssChan->setBasicEmail('domain@domain.com','Jhon Doe');
     $rssChan->atomlink='http://domain.com/';
     $rssChan->link='http://domain.com/';
     //Add the channell to the rss root to
     $rss->addChannell($rssChan);

     //create a simple iteration in order to create specialized list of ItemChannel whith will be used as item in the RSSChannell above
     for ($i = 0; $i < 10; $i++)
     {
         $rssItem= new ItemChannell();
         $rssItem->guid='http://domain.com/'.$i;
         $rssItem->setCategory('Category names in this fields '.$i);
         $rssItem->setAuthor('jhondoe@domain.com (Jhon Doe)');
         $rssItem->setDescription('this is a description item within rss');
         //Add each item to the RSSChannell collection
         $rssChan->addItemChannell($rssItem);
     }


     //print output into your page don\'t forget that this is an xml output and so you have to set your header as application/xml.
     header('Content-Type: application/xml');
     //call RSS root Method getOutputXML($bool) (Take a look into description of all methods properties of the class),
    echo $rss->getOutputXML(false);
 }

这就是您完成完整 RSS 提要的全部内容.有更多可用的东西可以实现到类中,但因为我只需要这个并没有扩展到这个,但是您可以使用方法扩展以保存到文件中,将更多其他东西附加到文件中.

That's all you will have a full RSS feed done. There are more available stuff that could be implemented into the classes but as i need just this have no extened to much this one however you can extend with method to save into a file, append to a file a more other stuff.

我希望这是一个很好的起点,以便有一个简单的方法来实现您的目标并使其变得更加容易.

I hope this could be a good point to start in order to have a simple way to achieve your goal and make it very easier.

问候赚钱2010

这篇关于RSS 提要 PHP/MySQL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆