CakePHP1.2 RC3でwebサイトを作ったので、
RSS配信してみました。

Googleで検索したところ、
ブログの場合は、トップページに記事を表示する、
例えばindexアクションを使いまわす方法が紹介されていましたが、
ぼくの場合は、webサイトだったので、
新しくrssアクションを作成する方法を採りました。

お探しのRSS配信方法が、
ブログのような感じをご希望の方はこちらが詳しいです。

それでは、CakePHPでwebサイトを作成している方や、
CMSとしてお使いの方にお勧めかと思われる
RSS配信方法を書いていきたいと思います。

結論から言うと、RSS配信URLは以下のようになります。

http://www.your-dummy-domain.com/コントローラ/RSS用のアクション

つまり、posts_controller.phpにrssというアクションを追加した場合、
http://www.your-dummy-domain.com/posts/rss
がRSS配信URLとなります。

前提知識

まず、前提知識を2点。

(1)RSSはdebugモードだと認識されないようです。

コントローラのアクション内で、

Configure::write ('debug', 0);

を設定しますが、core.phpに大元の設定があることも、
基本として認識しておきましょう。

(2)RSS用のlayoutをcakeからコピー

cake/libs/view/layouts/rss/default.ctp
を以下のフォルダにコピー
app/view/layouts/rss/

名前はrss.ctpとすると、
app/view/layouts/rss/rss.ctp
になります。

おそらく、layouts内には既にrssディレクトリがあり、
中にemptyファイルがあると思います。
emptyは無視しておくか、削除で良いでしょう。

(3)RSSの知識

下記、guidやlinkの意味がわからない場合は、
RSS 2.0 Notesが役立つと思います。

コントローラー

一般的にはposts_controller.phpという名前が使われますが、
エントリをDBからSelectするコントローラーに
下記を追加していきます。

まずは、上部の定義部分に、
helperのRssと、
componentsのRequestHandlerを追加します。

var $helpers = array('Html', 'Form', 'Rss');
var $components = array('RequestHandler');

お次はRSS専用のアクションの追加です。
findのfields部分は、
RSS配信ページに表示したい項目を記入します。

1エントリの全文を表示したい場合や、
descriptionを使っていない場合は、
下記descriptionがbodyになるかもしれませんね。

面倒ならfields部分を削除して、
全項目を持ってきましょう。

並び順は、ブログのように、
データ作成日(created)の降順で並べています。

最終更新日の場合は、modifiedになりますね。

function rss() {
Configure::write ('debug', 0);
$rssmeta = $this->Post->find('all',array('fields' => array('id','category','title','description','created'), 'order' => 'created DESC', 'limit'  => '10'));
$this->set('channel', array(
'title' => "RSS配信ページのタイトルを定義",
'description' => 'RSS配信ページのディスクリプションを定義',
'link' => 'webサイトのURLを定義',
'language' => 'ja'
)
);

$this->set(compact('rssmeta'));
$this->RequestHandler->respondAs('rss');
$this->layoutPath = 'rss/rss';
}

また、上記layoutPathは、
app/view/layouts/配下にあるrssフォルダの中にある
rss.ctpを意味しています。

つまり、app/view/layouts/rss/rss.ctp

ビュー

続いてViewの設定です。
/app/views/posts/rss.ctpを作成します。

<?php
function transform_rss($rssmeta) {
return array(
'title' => $rssmeta['Post']['title'],
'link'  => "/".$rssmeta['Post']['theme']."/".$rssmeta['Post']['id'],
'guid'  => "/".$rssmeta['Post']['theme']."/".$rssmeta['Post']['id'],
'description' => $rssmeta['Post']['description'],
'pubDate' => $rssmeta['Post']['created']
);
}
echo $rss->items($rssmeta, 'transform_rss');
?>

linkやguidは、
各URLの構造に合わせてください。

上記の場合は、データ作成時であるcreatedを設定していますが、
修正日を管理していて、それを表示したい場合はmodifiedでしょうね。

layoutの設定

トップページ、カテゴリ、エントリを管理している
layoutsのheader内でrssを定義しておきます。

viewsのctpではなく、layoutsの設定ファイルで行います。

<?php echo $html->meta('RSS2.0', '/posts/rss'); ?>

routes.php

他のサイトを調べていると、
Router::parseExtensions(’rss’);

Router::connect
の設定をしていますが、
この方法の場合、
http://www.your-dummy-domain.com/コントローラ/RSS用のアクション
という、そのままのアクセスですので、
拡張子の.rssに対応させる必要がありません。

なので、
/app/config/routes.php
は変更なしです。

RSS配信のまとめ

いかがでしたでしょうか?
Googleで検索した時は、みんなRSS配信簡単!
みたいに書いていましたが、
ぼくは丸一日費やしてしまいました。

ですが、満足のいく形にはなったと思います。
最後に、参考サイトを紹介しておきます。Thanks!

【関連している記事】