RSS最終版
最終的に試行錯誤の結果、こういう形になりました。
スニペットコール
[!rssrss!]
<?php $rssCount = isset($rssCount) ? $rssCount : '20'; $rssTpl = isset ($rssTpl) ? $modx->getChunk($rssTpl) : '<ul> <!-- start --> <li><a href="[+rsslink+]">[+rsstitle+]</a>([+rssdate+] / [+blogtitle+])</li> <!-- end --> </ul> '; define('MAGPIE_OUTPUT_ENCODING', 'UTF-8'); //文字コード化け対策 $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'); //次に読み込むRSSの配列を作成する $mainrss = array ('http://www.xxx.net/rss.xml' => 'BLOG 1', 'http://www.yyy.com/rss.rdf' => 'ブログ2' ); //あとで使う配列を規定しておく $rsslines = array(); $rsslineItem = array(); $rssNum = 0; $output = ""; //1970年1月1日からの秒数を今の時間で取得 $today = date(U); //$mainrssを分解してURLと名前に分けて取り出す。このあたりは通常のMagpierssと変わらない。 foreach ($mainrss as $url=>$names){ $rss = fetch_rss($url); $title = $rss->channel['title']; $bloglink = $rss->channel['link']; foreach ($rss->items as $item ) { $title = $item['title']; $urls = $item['link']; //アイテムの日付を拾う、RSSによって変更する必要あり、if文が必要かも $date_timestamp = $item[date_timestamp]; if ($date_timestamp) { $date = Date("Y年m月d日",$date_timestamp); } else { $date_timestamp = strtotime($item[pubdate]); $date = Date("Y年m月d日",$date_timestamp); } //出力はここでタイムスタンプとセットで出力 $title = mb_convert_encoding($title,$modx->config["modx_charset"],"AUTO"); if($title == preg_match("/^PR:/",$title)){ $rsslineItem[$rssNum]['timestamp'] = $date_timestamp; $rsslineItem[$rssNum]['rssdate'] = $date; $rsslineItem[$rssNum]['blogtitle'] = $names; $rsslineItem[$rssNum]['rsslink'] = $urls; $rsslineItem[$rssNum]['rsstitle'] = $title; $rsslineItem[$rssNum]['bloglink'] = $bloglink; $rssNum += 1; } } } if (count($rsslineItem) > 0) { $tpl = str_replace("<!-- start -->","\0",$rssTpl); $tpl = str_replace("<!-- end -->","\0",$tpl); $parts = explode("\0",$tpl); if (count($parts) != 3) { return "Template Error"; } $frame = $parts[0]; foreach ($rsslineItem as $key1 => $val1) { $tmp_data = $parts[1]; foreach ($val1 as $key2 => $val2) { $tmp_data = str_replace("[+".$key2."+]",$val2,$tmp_data); } //タイムスタンプで配列を作る。 $rsslines["{$val1['timestamp']}"] = $tmp_data; } //タイムスタンプでkrsort (配列をキーで逆順にソートする) krsort($rsslines); $count = "0"; for(reset($rsslines); $key=key($rsslines); next($rsslines)){ $frame .= $rsslines[$key]; $count++; if($count == $rssCount){ break; } } $frame .= $parts[2]; $output .= $frame; } return $output; ?>
テンプレートはチャンクで。
<table> <!-- start --> <tr> <th>[+rssdate+]</th> <td><a href="[+bloglink+]">[+blogtitle+]</a></td> <td><a href="[+rsslink+]">[+rsstitle+]</a></td> </tr> <!-- end --> </table>
以下パラメータ。
rssCount
表示する記事件数。デフォルトは20。
rssTpl
出力するテンプレート(チャンク名)。指定されていない場合は、リスト形式で出力される。
以下テンプレートのプレースホルダ。
rssdate
日付。Y年m月d日の形式で出力される。
形式を変更できるようにしたほうがいいか?
blogtitle
ブログのタイトル。
bloglink
ブログトップへのリンク。
rsslink
記事へのリンク。
rsstitle
記事タイトル。
今後手を加えるとしたら、記事の日付形式をパラメータで指定できるようにする、ですかね。とりあえずはこれでいったんは完成。