codeigniterでfeed出力でハマる
久しぶりにプログラムネタでも、、、なんせサンデープログラマーなので、思った通りに動かない時はあきらめるというのも選択肢の一つです。今回codeigniterでfeedを出力しようとぽちぽち作成していたのですが、どうしても解決出来ず別の方法で実現させました。その顛末記。
ちょっと、お客さんのサイトをみてて、そのクライアントのサイトは、会員サイトで、会員さんが外部に向けて自分の情報を発信するという、ありがちなサイトです。
会員さんが自分の情報発信する部分は、独自開発のプログラムなので、RSSを出力するような機能はありません。今回、その情報をRSSにして出力するプログラムをCodeigniterで作成しましょうと思い、ぽちぽち作成しました。こんな感じ
<?php class Feeds extends CI_Controller { function __construct() { parent::__construct(); $this->load->helper('xml'); } function index() { $data['encoding'] = 'utf-8'; $data['feed_name'] = '○○サイト'; $data['feed_url'] = site_url("feed/index"); $data['page_description'] = '○○サイトのフィードを配信します'; $data['page_language'] = 'ja'; $data['records'] = $this->getRecentArticles(); header("Content-Type: text/xml; charset=utf-8"); //header("Content-Type: application/rss+xml .rdf"); $xmldata = $this->load->view('feed/rss', $data, true); } function getRecentArticles() { $this->db->order_by("update_day", "desc"); $this->db->limit(10); $result=$this->db->get('article')->result(); return $result; } } ?>
Viewには、以下を作成
<?php echo '<?xml version="1.0" encoding="utf-8"?>' . "\n"; ?> <rss version="2.0"> <channel> <title><?php echo $feed_name; ?></title> <link><?php echo $feed_url; ?></link> <description><?php echo $page_description; ?></description> <language><?php echo $page_language; ?><language> <?php foreach ($records as $value): ?> <item> <title><?php echo xml_convert($value->title); ?></title> <link><?php echo xml_convert($value->url); ?></link> <description><![CDATA[ <?php echo $value->description;?> ]]></description> <pubDate><?php echo date(DATE_RSS, strtotime($value->update_day)); ?></pubDate> </item> <?php endforeach; ?> </channel> </rss>
ここのをそのままコピペして、自分用に調整しました(先人達に感謝!) でも、どうしても動作しません。以下のエラーがでてしまい、このエラーもいろいろ調べてみたのですが、結局正常にRSSを出力出来ず。
ソースをなにげに見てみたら、1行目が変
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"> <rss version="0.91"> <channel> <title>○○サイト</title>
1行目の <?xml のところの前に、スペースがあってこのスペースがジャマをしている感じです。念のためソースをファイルに落として、スペースを削除
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd"> <rss version="0.91"> <channel> <title>○○サイト</title>
として、それを、ブラウザに読み込ませると正常に表示・・・??やっぱり半角スペース4個分がジャマをしている感じです。
これが、load->view を echo とか var_dump とかしても、なぜかスペース4個入ります。なんなのこれ?いろいろ調べてみたのですが、時間もかかってハマりそうだったので、この手はすっぱりとあきらめました。codeigniterのソース追っかけるとかできれば良いんですが、それ、私にはできません。エグエグ
で、すっぱりあきらめて、他の手を探します。そしたら、こんなの見つけました。おーまさにこれだ!ということで、これを試してみます。
一応テストでは問題なくFeedを出力できました。イケそう!
あとは、DBにつないで、10件ほどのレコードをグルグル回してFeedにすればOKです。普通ならPHPにDBへの接続情報を書いて、ホゲホゲすると思いますが、こういう重要な情報はあちこちに散乱したくないので、どこか一つにまとめたいところ・・・
で、codeigniterのDB情報を利用することにしました。その件は、こちらのブログに書いてありました(感謝!)これでDBが利用できると、外部からcodeigniterが利用できて便利になります。
<?php // CodeIgniterの定数 define('APPPATH', __DIR__.'/application/'); define('BASEPATH', __DIR__.'/system/'); // 実行に必要なファイルや関数などを準備 require BASEPATH.'database/DB.php'; require BASEPATH.'core/Common.php'; require BASEPATH.'core/Controller.php'; function &get_instance() { return CI_Controller::get_instance(); } new CI_Controller(); // ここからがDatabaseクラスを使うコード $db = DB(); $query = $db->query('SELECT * FROM example'); foreach ($query->result() as $row) { echo $row->id . ' '; echo $row->language . "\n"; }
上記の、
$db = DB();
までをコピーしてfeedを出力するPHPに貼り付け、forearchでグルグル回して、最後ファイルに保存。そのファイルにブラウザでアクセスすると、ばっちり(死語)でした。
あとは、上記PHPをcronで回して定期的にfeedを出力させます。出力したRSSファイルは、iftttでtwitterやfacebookに転送させれば、アクセス数アップに多少は役立つかもしれません。よかったねクライアントさん。
[…] マックでのSSD換装の前に、こちらでWindowsPCで換装…
[…] マックでのSSD換装の前に、こちらでWindowsPCで換装…
[…] ここの続きですが、つまり、タイトルの通りでして、HDDが常時…