外部RSSを複数受信・表示する
PieXではブログタイトルがヘッダ部分にしか表示されなかったため
(レイアウトの問題で、 日付 記事タイトル(ブログタイトル) のように表示したかった)
却下せざるをえず。
こちらのサイトを参考に、スニペットを作ってみた。
今後もう少し手を入れる必要はあるが、現段階でのメモ。
必要なファイル
/rss_utils.inc
/rss_parse.inc
/rss_fetch.inc
/rss_cache.inc
/code_table.ucs2jis
/extlib
MagpieRSS入手先 http://magpierss.sourceforge.net/
(文字化け対策としてrss_parse.incだけver0.61のrss_parse.incで上書きしたモノを設置。上書きしなくても大丈夫かはまだ未確認)
rss_utils.incなどはmanager/media/の中にあるようなので、そちらを使うように設定しなおしたほうがいい気がする。
とりあえず上記ファイルを/assets/snippets/rssrssにアップロード。
スニペットの新規作成(スニペット名:rssrss)で
<?php $rssrss_base = isset($rssrss_base) ? $modx->config['base_path'].$rssrss_base : $modx->config['base_path']."assets/snippets/rssrss/"; //まずMagpieRSSのモジュールを読み込む require_once ($rssrss_base . 'rss_fetch.inc'); require_once ($rssrss_base . 'rss_utils.inc'); require_once ($rssrss_base . 'code_table.ucs2jis'); //次に読み込むRSSの配列を作成する $mainrss = array ('http://www.xxx.com/rss' => 'XXX.com', 'http://d.hatena.ne.jp/m-mitsuki/rss' => '仕事備忘録', ); //あとで使う配列を規定しておく $rssarray = array(); //1970年1月1日からの秒数を今の時間で取得 $today = date(U); //$mainrssを分解してURLと名前に分けて取り出す。このあたりは通常のMagpierssと変わらない。 foreach ($mainrss as $url=>$names){ $rss = fetch_rss($url); $title = $rss->channel['title']; foreach ($rss->items as $item ) { $title = $item['title']; $title = mb_convert_encoding($title,$modx->config["modx_charset"],"AUTO"); $urls = $item['link']; //アイテムの日付を拾う、RSSによって変更する必要あり、if文が必要かも $date = $item[pubdate]; //タイムスタンプを1970年1月1日からの秒数に変換 $timestamp = date("U",strtotime($date)); //ここは表示用の年月 $daytime = date("Y年m月d日",strtotime($date)); $youbi = array(0 => '(日)', 1 => '(月)', 2 => '(火)', 3 => '(水)', 4 => '(木)', 5 => '(金)', 6 => '(土)'); $youbi2 = date("w",strtotime($date)); //出力はここでタイムスタンプとセットで出力 $linkstr = "<tr><th align=\"left\" valign=\"top\"><span>$daytime $youbi[$youbi2]</span>$names</th><td align=\"left\" valign=\"top\"><a href=\"$urls\">$title</a></td></tr>\n"; //タイムスタンプで配列を作る。 $rssarray["{$timestamp}"] = $linkstr; } } //タイムスタンプでkrsort (配列をキーで逆順にソートする) krsort($rssarray); //ここから出力 echo "<table cellspacing=\"0\" cellpadding=\"0\">\n"; //20個まで出力したら終了させる for(reset($rssarray); $key=key($rssarray); next($rssarray)){ echo "$rssarray[$key]"; $count++; if($count == 20){ break; } } echo "</table>\n"; ?>
を貼り付ける。
参考元との変更点は、文字コードの変換をforeach内で行っていること、ついでにJcodeConvertからmb_convert_encodingに変更したこと。
今後の課題としては、2つ目で読み込んでいるRSSが最新1件しか表示されないこと(必須)
できれば表示部分をチャンクに切り分けて、表示方法の変更が容易にできるようにすること。
不必要なファイルの削除。