デリゲートによるRSS出力

XOOPS Cube2.1の柔軟性は、3月にOSC2006 Springでお話しさせていただいた様に、デリゲートとpreloadの組合せによって実現されます。

まもなくリリースされる予定のXOOPS Cube2.1 Alpha3では、RSS出力機能もこのデリゲートによる実装がなされています。

XOOPSからのRSS出力は、backend.phpによって行われているわけですが、XOOPS2.0.xまではあくまでも、newsモジュール専用でしかありませんでした。しかしながら、XOOPS Cube2.1ではnewsモジュールは同梱されないでので、今までのbackend.phpの機能自体は意味のない事になります。

そこで、backend.php自体がすべてのモジュールに対して開放される事になり、この実現手段として、デリゲートを使用しているわけです

RSSの出力に関連して発行されるイベントは、

  • Legacypage.Backend.Access
  • Module.Legacy.Backend.getRSS

の2種類です。

このうちで、Module.Legacy.Backend.getRSS が、主にモジュール開発者向けに用意されたイベントです。
モジュール開発者が、このイベントを受け取ってモジュールの最新情報を変えるデリゲートを用意する事によって、backend.php経由で更新情報をFeedすることが可能になります。

たとえば、当サイトの「お知らせ」にて使わせていただいている、suinさんによるBulletinモジュールを例に挙げれば、



<?php
if (!defined('XOOPS_ROOT_PATH')) exit();
class 
bulletinModulePreloadBackend extends XCube_ActionFilter
{
    function 
preBlockFilter() {
        
$delegate=new XCube_Delegate("bulletinModulePreloadBackend""getRSS");
        
$this->mController->mRoot->mEventManager->add("Module.Legacy.Backend.getRSS"$delegate);
    }
    function 
getRSS(&$sender, &$eventArgs) {
        require_once 
XOOPS_ROOT_PATH "/whatsnew/class/bulletin.php";
        
$storyArr Bulletin::getAllPublished(100);
        
$module_handler =& xoops_gethandler('module');
        
$module =& $module_handler->getObjects(new Criteria('dirname''bulletin'));
        foreach (
$storyArr as $story) {
            
$eventArg = array (
                
'title'       => $story->getVar('title'),
                
'link'        => XOOPS_MODULE_URL '/bulletin/article.php?storyid=' $story->getVar('storyid'),
                
'guid'        => XOOPS_MODULE_URL '/bulletin/article.php?storyid=' $story->getVar('storyid'),
                
'pubdate'     => $story->getVar('published'),
                
'description' => $story->getVar('hometext'),
                
'category' => $module[0]->getVar('name').'/'.$story->topic_title(),
            );
            if (
$story->isActiveUser()) $eventArg['author'] = $story->getUname();
            
$eventArgs[] = $eventArg;
        }
    }
}
?>

というソースを、/modules/bulletin/class/modulePreloadBackend.class.php というファイル名で置くことによって、/backend.phpにアクセスする事で、Bulletinモジュールの更新情報がRSS2.0形式にて出力されます。

これは、今までもBopCommentsモジュールやWhatsNewモジュールなどに対して各モジュール開発者などがプラグインを提供する事によって、各モジュールの更新情報を一元的に発信できていたのと、基本的には同じ考え方です。

ただ、XOOPS Cube2.1のさらなる柔軟な点は、これらBopComments等の更新管理ツールに対してもbackend.phpという共通的なエントリーポイントを提供する事が可能になっている点です。

これに関してのサンプルはまだ用意できていませんが、最初の方で紹介したイベントのうちの、Legacypage.Backend.Accessがこの様な更なる柔軟性を用意しています。現状ではこのイベントを受け取るのは、baseモジュール内のクラスで、LegacyControllerの初期化の中で、このイベントを受け取るクラスメソッドが定義されています。
このクラスメソッドが、Module.Legacy.Backend.getRSS イベントを発行して、結果を収集してRSSを出力しているわけです。但しこの標準メソッドは出力件数が決め打ちであるなど、柔軟性に乏しいものとなっています。

こういった場合には、Legacypage.Backend.Accessのイベントハンドラをまるごと取り替える事によって、もっと柔軟性のあるRSS出力処理をbackend.phpという入口を変えることなく実現させる事が出来ます。


コメント

このコメントのRSS

この投稿には、まだコメントが付いていません

コメントの投稿

ごめんなさい、現在コメントを付けることは出来ません


18 queries. 0.011 sec.
Powered by WordPress Module based on WordPress ME & WordPress

flagflag

XOOPS初心者サーチ


Add to Google

Xoops Cube Project

XOOPS Cube Project Site

XC Developers Ring

http://img.simpleapi.net/small/http://www.peak.ne.jp/xoops/ SIZE:128x128(7.6KB)