Joomlaでは標準でRSS(Syndicate)を出力できるようになっている。
けれど、出力できるのはFrontページの内容だけ。
#設定方法を知らないだけかも・・・?
このサイトの構成上、FrontページのRSSを配信しても更新情報が見れる
わけではないので、BlogページのRSSを配信したい!
ということで、適当にソースを書き換えた。
#真似する際は自己責任で!!影響調査とかしてません。
rss.phpの改造
まずは、実際にRSSを出力している部分の修正を行う。
作業内容はこんな感じ。
1.パラメータの取得
今回、既存のrss.phpを改造するにあたって、出力するRSSがFrontページ用
なのかBlogページ用なのかを判断するためのパラメータを追加した。
パラメータ:mode
このパラメータは、設定画面からFrontなのかBlogなのかを設定出来るよう
にする。(後述)
2.SQLの改造
既存のrss.phpでは、Frontページに表示するアイテムデータを収めている
テーブルと結合しているために、Blogモードの時は結合しないようにする。
また、Order byも作成日付が新しい順に変更してしまう。
3.キャッシュ
rss.phpでは、キャッシュを使い一定期間の間はRSSにアクセスされた場合、
キャッシュを表示するようになっている。
既存のままでは、FrontでもBlogでも同じキャッシュを使うはめになって
しまうのでキャッシュファイル名にモードを追加してあげる。
ということで、DIFF。
| 99,100d98 < // get feed mode from url < $info[ 'mode' ] = strval( mosGetParam( $_GET, 'mode', 'front' ) ); 163c161 < $filename = $info[ 'mode' ] . '_' . $info[ 'file' ] .'.xml'; --- > $filename = $info[ 'file' ] .'.xml'; 182c180 < $rss->title = $info[ 'title' ] . '[' . $info[ 'mode' ] . ']'; --- > $rss->title = $info[ 'title' ]; 197a196,229 > // Determine ordering for sql > switch ( strtolower( $info[ 'orderby' ] ) ) { > case 'date': > $orderby = 'a.created'; > break; > > case 'rdate': > $orderby = 'a.created DESC'; > break; > > case 'alpha': > $orderby = 'a.title'; > break; > > case 'ralpha': > $orderby = 'a.title DESC'; > break; > > case 'hits': > $orderby = 'a.hits DESC'; > break; > > case 'rhits': > $orderby = 'a.hits ASC'; > break; > > case 'front': > $orderby = 'f.ordering'; > break; > > default: > $orderby = 'f.ordering'; > break; > } 200,306c232,247 < if($info[ 'mode' ] == 'blog') { < < // Determine ordering for sql < switch ( strtolower( $info[ 'orderby' ] ) ) { < case 'date': < $orderby = 'a.created'; < break; < < case 'rdate': < $orderby = 'a.created DESC'; < break; < < case 'alpha': < $orderby = 'a.title'; < break; < < case 'ralpha': < $orderby = 'a.title DESC'; < break; < < case 'hits': < $orderby = 'a.hits DESC'; < break; < < case 'rhits': < $orderby = 'a.hits ASC'; < break; < < default: < $orderby = 'a.created DESC'; < break; < } < < // blog < $query = "SELECT a.*, u.name AS author, u.usertype, UNIX_TIMESTAMP( a.created ) AS created_ts, cat.title AS cat_title, sec.title AS section_title" < . "\n FROM #__content AS a" < // . "\n INNER JOIN #__content_frontpage AS f ON f.content_id = a.id" < . "\n LEFT JOIN #__users AS u ON u.id = a.created_by" < . "\n LEFT JOIN #__categories AS cat ON cat.id = a.catid" < . "\n LEFT JOIN #__sections AS sec ON sec.id = a.sectionid" < . "\n WHERE a.state = 1" < . "\n AND cat.published = 1" < . "\n AND sec.published = 1" < . "\n AND a.access = 0" < . "\n AND cat.access = 0" < . "\n AND sec.access = 0" < . "\n AND ( a.publish_up = '$nullDate' OR a.publish_up <= '$now' )" < . "\n AND ( a.publish_down = '$nullDate' OR a.publish_down >= '$now' )" < . "\n ORDER BY $orderby" < ; < < } else { < < // Determine ordering for sql < switch ( strtolower( $info[ 'orderby' ] ) ) { < case 'date': < $orderby = 'a.created'; < break; < < case 'rdate': < $orderby = 'a.created DESC'; < break; < < case 'alpha': < $orderby = 'a.title'; < break; < < case 'ralpha': < $orderby = 'a.title DESC'; < break; < < case 'hits': < $orderby = 'a.hits DESC'; < break; < < case 'rhits': < $orderby = 'a.hits ASC'; < break; < < case 'front': < $orderby = 'f.ordering'; < break; < < default: < $orderby = 'f.ordering'; < break; < } < < // front < $query = "SELECT a.*, u.name AS author, u.usertype, UNIX_TIMESTAMP( a.created ) AS created_ts, cat.title AS cat_title, sec.title AS section_title" < . "\n FROM #__content AS a" < . "\n INNER JOIN #__content_frontpage AS f ON f.content_id = a.id" < . "\n LEFT JOIN #__users AS u ON u.id = a.created_by" < . "\n LEFT JOIN #__categories AS cat ON cat.id = a.catid" < . "\n LEFT JOIN #__sections AS sec ON sec.id = a.sectionid" < . "\n WHERE a.state = 1" < . "\n AND cat.published = 1" < . "\n AND sec.published = 1" < . "\n AND a.access = 0" < . "\n AND cat.access = 0" < . "\n AND sec.access = 0" < . "\n AND ( a.publish_up = '$nullDate' OR a.publish_up <= '$now' )" < . "\n AND ( a.publish_down = '$nullDate' OR a.publish_down >= '$now' )" < . "\n ORDER BY $orderby" < ; < < } --- > $query = "SELECT a.*, u.name AS author, u.usertype, UNIX_TIMESTAMP( a.created ) AS created_ts, cat.title AS cat_title, sec.title AS section_title" > . "\n FROM #__content AS a" > . "\n INNER JOIN #__content_frontpage AS f ON f.content_id = a.id" > . "\n LEFT JOIN #__users AS u ON u.id = a.created_by" > . "\n LEFT JOIN #__categories AS cat ON cat.id = a.catid" > . "\n LEFT JOIN #__sections AS sec ON sec.id = a.sectionid" > . "\n WHERE a.state = 1" > . "\n AND cat.published = 1" > . "\n AND sec.published = 1" > . "\n AND a.access = 0" > . "\n AND cat.access = 0" > . "\n AND sec.access = 0" > . "\n AND ( a.publish_up = '$nullDate' OR a.publish_up <= '$now' )" > . "\n AND ( a.publish_down = '$nullDate' OR a.publish_down >= '$now' )" > . "\n ORDER BY $orderby" > ; 366c307 < ?> --- > ?> |
mod_rssfeed.xmlの改造
設定画面(administrator画面?)で、ログインを行いモジュールの設定画面で
RSS(Syndicate)を開いた際に表示される内容を定義してあるファイルを
改造し、モードの選択を出来るようにする。
作業は以下。
1.セレクトボックスの追加
モジュールを表示する際に、どちらのモード(FrontかBlog)かを選択出来る
ようにセレクトボックスを表示出来るように定義を追加する。
ということで、DIFF。
これを、自分の好きな場所に貼り付ければOK。
| < <param name="mode" type="list" default="front" label="Mode" description="RSS"> < <option value="front">Front</option> < <option value="blog">Blog</option> < </param> |
mod_rssfeed.phpの改造
実際にRSSへのリンクを表示するファイルである。
#このサイトの左下に表示されている部分
これを、モードによってRSSへのリンクの出し分けが出来るように改造する。
1.パラメータの取得
上で設定したモードを取得するように修正を行う。
2.モードの追加
取得したモードによって&mode=frontもしくは&mode=blogをリンクの末尾に
付加するように修正を行う。
ということでDIFF。
| 46d45 < $mode = $params->get( 'mode', 'front' ); 100c99 < $link = 'index.php?option=com_rss&feed=RSS0.91&no_html=1&mode=' . $mode; --- > $link = 'index.php?option=com_rss&feed=RSS0.91&no_html=1'; 106,107c105 < $link = 'index.php?option=com_rss&feed=RSS1.0&no_html=1&mode=' . $mode; < --- > $link = 'index.php?option=com_rss&feed=RSS1.0&no_html=1'; 113,114c111 < $link = 'index.php?option=com_rss&feed=RSS2.0&no_html=1&mode=' . $mode; < --- > $link = 'index.php?option=com_rss&feed=RSS2.0&no_html=1'; 120,121c117 < $link = 'index.php?option=com_rss&feed=ATOM0.3&no_html=1&mode=' . $mode; < --- > $link = 'index.php?option=com_rss&feed=ATOM0.3&no_html=1'; 127,128c123 < $link = 'index.php?option=com_rss&feed=OPML&no_html=1&mode=' . $mode; < --- > $link = 'index.php?option=com_rss&feed=OPML&no_html=1'; 132c127 < </div> --- > </div> |
これで、設定画面からBlogを選べばBlogのRSSが、Frontを選べばFrontページ
のRSSへのリンクが表示出来るようになる。
ソースが欲しい方は、Forumまで。
| < 前 | 次 > |
|---|


