仕事、学んでいること、興味のあることなどの「アウトプット」を書き出すブログ。心を高め、魂を磨くために、今日も一生懸命働く。
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でしょうね。
トップページ、カテゴリ、エントリを管理している
layoutsのheader内でrssを定義しておきます。
viewsのctpではなく、layoutsの設定ファイルで行います。
<?php echo $html->meta('RSS2.0', '/posts/rss'); ?>
他のサイトを調べていると、
Router::parseExtensions(’rss’);
や
Router::connect
の設定をしていますが、
この方法の場合、
http://www.your-dummy-domain.com/コントローラ/RSS用のアクション
という、そのままのアクセスですので、
拡張子の.rssに対応させる必要がありません。
なので、
/app/config/routes.php
は変更なしです。
いかがでしたでしょうか?
Googleで検索した時は、みんなRSS配信簡単!
みたいに書いていましたが、
ぼくは丸一日費やしてしまいました。
ですが、満足のいく形にはなったと思います。
最後に、参考サイトを紹介しておきます。Thanks!
[ 起業日記のホームへ ]
仕事の成果や興味を持って体験したこと、また今学んでいることで自分なりにまとめられるようになったことなど、とにかくアウトプットを中心として書いていくブログです。
「1日16時間 起業日記」の意味は、WEBの世界で起業した管理人が、京セラの稲盛和夫さん、HONDAの本田宗一郎さんのように、年間5,000時間以上を数十年と働き続けた名経営者達に憧れて、せめて時間だけでも同じことをしよう!という意気込みを表現しています。
コメント