デリゲートによる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(10, 0);
$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という入口を変えることなく実現させる事が出来ます。
コメント
この投稿には、まだコメントが付いていません
コメントの投稿
ごめんなさい、現在コメントを付けることは出来ません