CodeIgniter: Build RSS Feed

Posted by – September 22, 2011

rss icon最近自己用 CodeIgniter 寫了個小網站,讓網友可以提供一些圖片素材。雖然後台有做了統計和紀錄功能,不過想再加一個訂閱 RSS 的功能,這樣我從 Google Reader 就能知道又有新素材出現。因為新網站是用 CI 寫的,想說就用 CI 寫一個 RSS feed。查了一資料,相關教學都有互抄的感覺,連 bug 都很一致是怎樣?

所以我又做了一些修改,確認每個瀏覽器打開都會認得它是一份 RSS 文件,Google Reader 也能正確讀取。

設計 RSS 功能需要用到 Controller、Model 和 View。首先是 model 的部份,這邊寫得比較簡化,要注意的是時間的部份,多做了一個 UNIX timestamp,因為 RSS 的時間格式要照 RFC #822 規範,有 timestamp 比較好轉。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class File_model extends CI_Model{
	public function __construct(){
		parent::__construct();

		$this->load->database();
	}
	public function get_files(){
		// 用 MySQL 內建的 UNIX_TIMESTAMP 函式取得 unix timestamp
		$this->db->select("*, UNIX_TIMESTAMP(publish_date) as unixtime", FALSE);
		$this->db->order_by('publish_date', 'desc');
		return $this->db->get_where(TBL_NAME)->result_array();
	}
}
/* End of file file_model.php */

再來是 Controller 的部份,將 Model 傳回的資料打包,準備傳給 View。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Feed extends CI_Controller {

	public function __construct(){
		parent::__construct();

		$this->load->model('file_model', 'file');
		$this->load->helper('xml');
	}
	public function index()
	{		
		$data['feed_name'] = 'Qoding.us'; // your website
		$data['encoding'] = 'utf-8'; // the encoding
        $data['feed_url'] = base_url('feed'); // the url to your feed
        $data['page_description'] = 'We love programming!'; // some description
        $data['page_language'] = 'zh-tw'; // the language
        $data['posts'] = $this->file->get_files();
        header("Content-Type: text/xml"); // important!

		$this->load->view('rss', $data);
	}
}

/* End of file feed.php */
/* Location: ./application/controllers/feed.php */

最後的 View 就是 RSS XML 本身。

<?php echo '<?xml version="1.0" encoding="utf-8"?>' . "\n";?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

    <channel>    
		<title><?php echo $feed_name; ?></title>
		<atom:link href="<?php echo $feed_url; ?>" rel="self" type="application/rss+xml" /> 
		<link><?php echo $feed_url; ?></link>
		<description><?php echo $page_description; ?></description>
		<language><?php echo $page_language; ?></language>
		<sy:updatePeriod>hourly</sy:updatePeriod> 
		<sy:updateFrequency>1</sy:updateFrequency> 
		<generator>http://codeigniter.com</generator>

		<?php foreach($posts as $k => $uf): ?>
		<item>
			<title><?php echo '篇名';?></title>
			<link><?php echo 'http://本文連結';?></link>
			<guid><?php echo '可以辨識本文的獨特 id,一般用 permalink 就可以';?></guid>
			<description><![CDATA[
			文章內容
			]]></description>
			<pubDate><?php echo date('r', $uf['unixtime']);?></pubDate>
		</item>
		<?php endforeach; ?>    
    </channel>
</rss>

最後產出的結果就是 http://你的網址/feed,把這網址丟到幾個瀏覽器試試,如果可以正確辨識訂閱資訊就是成功了。

RSS feed in Firefox

RSS feed in Firefox

 

References:

Leave a Reply

Your email address will not be published. Required fields are marked *