Labs Zsrv Net

  • フォントサイズを大きくする
  • デフォルトフォントサイズ
  • フォントサイズを小さく

RSS配信をFrontページ以外でも行う

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&amp;feed=RSS0.91&amp;no_html=1&amp;mode=' . $mode;
---
>               $link = 'index.php?option=com_rss&amp;feed=RSS0.91&amp;no_html=1';
106,107c105
<               $link = 'index.php?option=com_rss&amp;feed=RSS1.0&amp;no_html=1&amp;mode=' . $mode;
<
---
>               $link = 'index.php?option=com_rss&amp;feed=RSS1.0&amp;no_html=1';
113,114c111
<               $link = 'index.php?option=com_rss&amp;feed=RSS2.0&amp;no_html=1&amp;mode=' . $mode;
<
---
>               $link = 'index.php?option=com_rss&amp;feed=RSS2.0&amp;no_html=1';
120,121c117
<               $link = 'index.php?option=com_rss&amp;feed=ATOM0.3&amp;no_html=1&amp;mode=' . $mode;
<
---
>               $link = 'index.php?option=com_rss&amp;feed=ATOM0.3&amp;no_html=1';
127,128c123
<               $link = 'index.php?option=com_rss&amp;feed=OPML&amp;no_html=1&amp;mode=' . $mode;
<
---
>               $link = 'index.php?option=com_rss&amp;feed=OPML&amp;no_html=1';
132c127
< </div>
---
> </div>


これで、設定画面からBlogを選べばBlogのRSSが、Frontを選べばFrontページ
のRSSへのリンクが表示出来るようになる。

 ソースが欲しい方は、Forumまで。 

最終更新 2006年 10月 23日(月曜日) 08:11