CakePHP1.2でRSSを出力する。
今回はCakePHPに標準で用意されているものを使ってRSSを出力させる。
まずはじめに参照させて頂いたサイトです。
http://www.msng.info/archives/2009/04/how_to_use_cakephp_rss_helper.php
ありがとうございます。
大まかな流れはこんな感じで動きました。
1:Route.phpに1行追加
2:コントローラーでコンポーネントRequestHandler呼び出す
3:RSS用のビューレイアウトを作成
4:RSS用のビューページを作成
ではさっそく。
コントローラーに
<?php
var $components = array('RequestHandler');
Route.phpに
<?php Router::parseExtensions();
レイアウトに
/app/views/layouts/rss/default.ctp
<?php
echo $rss->header();
if (!isset($channel)) {
$channel = array();
}
if (!isset($channel['title'])) {
$channel['title'] = $title_for_layout;
}
echo $rss->document(
$rss->channel(
array(), $channel, $content_for_layout
)
);
ビュー用ページ
/app/views/コントローラー/rss/index.ctp
<?php
$this->set('channel', array (
'title' => 'サイトタイトル',
'link' => 'サイトURL',
'description' => 'サイト説明文'));
echo $rss->items($posts, 'transformRSS');
function transformRSS($data) {
return array(
'title' => $posts['Post']['title'],
'link' => array('action' => 'view', $posts['Post']['id']),
'guid' => array('action' => 'view', $posts['Post']['id']),
'description' => $posts['Post']['body'],
'pubDate' => $posts['Post']['created']
);
}
以上です。
以上で一連の動作が動くようになります。
http://example.com/posts.rss
http://example.com/posts/index.rss
とかが
http://example.com/posts/index
が吐き出すデータになります。
もし何も表示されない場合は、
・自作コントローラー側で、別の配列名にデータを入れている(※$postDataなど)
・自作コントローラー側で、特別なレイアウトや特別なRenderを指定していないか
を確認してみてください。
特別なレイアウトや特別なRenderを指定していないかは
/app/views/layouts/rss/users.ctpとか/app/views/layouts/rss/post.ctpとか合わせてやれば動きます。
RequestHandler の isRSS()メソッドを使って
$count = $this->RequestHandler->isRSS() ? 200 : 10;
こんな感じでやりました
RSS内容に画像も出力させたいのでHTMLタグをエスケープさせない&CDATA処理してくれる方法を探してみる
/cake/libs/view/helpers/rss.php
の253行目あたり
$escape = true;
if (is_array($val) && isset($val['convertEntities'])) {
$escape = $val['convertEntities'];
unset($val['convertEntities']);
}
if (!is_null($val) && $escape) {
$val = h($val);
}
この部分で処理している。
クラスに汎用的に使えるように改修いれようかと思ったけど、
他でこのメソッドを特に使ってないので、こういじってみたw
$escape = true; ↓↓ $escape = false;
これでHTMLタグをエスケープさせないようになりました。
このままだとセキュリティ上良くないのでデータ渡すときにCDATA記述を書いて終了。
このメソッド他で使ってないしまぁいいかなとw
でもそもそもここはHTMLをエスケープするんじゃなくてCDATA処理をして対応して欲しいなぁ;;;
次にCDATA処理してくれるところを探してみる。
/cake/libs/xml.phpの1345行目あたりのString()メソッドでこんな処理があった。
if ($options['cdata'] === true && !is_numeric($val)) {
$val = '<![CDATA[' . $val . ']]>';
}
Cakeの中でCDATA処理をしているのはここだけっぽい。
たぶんこのメソッドをうまく経由させればCDATAで吐き出してくれそうですけど
調べるのめんどくさいのとただのバグだったらやなので結局上の方法でやっちゃいましたw
[...] CakePHP1.2上で外部サイトのRSSを取得&表示します。 CakePHP1.2でRSS2.0を出力する場合はこちらです。 [...]
type:ピンバック [ ]
このブログを参考にRSS対応できました。どうもありがとうございます。
さて、CDATAについて調べました。
(エスケープしない)descriptionに、配列を渡すと、お察しのとおりxml.phpが良きに計らってくれるようです。詳しくは私のブログで。
type:コメント [ ]