XOOPS Cube 2.1でProtectorモジュール
実はXOOPS Cube2.1に変えてから、GIJOEさんのProtectorモジュールを設定するのをしばらくの間忘れていました。 ^^;
で、遅ればせながらインストールしました。
もちろん、XOOPS 2.0.xと同様に、mainfile.phpの書換えを行う事で正しく動かす事が出来ます。しかし、今回はコアを全くハック無しというのを前提に考えているので、mainfile.phpさえも変えたくない。
という事で、XC2.1のpreloadを使って、Protectorモジュールを動かす事にしました。
本来Protectorモジュールでは、mainfile.php内で、common.phpをrequireしている前後で、
precheck.inc.php とpostcheck.inc.php を includeする事が前提になっています、
これをpreloadで行うのであれば、単純にpreFilter()とpreBlockFilter()にてそれぞれをincludeすればよいのではと考えていました。
が・・・・、
少々考えが甘すぎました。Protectorモジュールのpostcheckでは、$xoopsUser情報が取得できないといけないようで、preBlockFilter()段階はまだ、その時点に至っていないので、これだと、アクセスの度に不正ログインをトライしているようにとられてしまいました。
ということで、現在とりあえず動いているpreloadは、以下の通りです
<?php
class ProtectorGIJ extends XCube_ActionFilter
{
function preFilter()
{
include( XOOPS_ROOT_PATH . '/modules/protector/include/precheck.inc.php' ) ;
}
function preBlockFilter()
{
$root=&XCube_Root::getSingleton();
// ToDo: Use More Appropriate Event
$root->mEventManager->setAnchorDelegate("Site.Login",new XCube_InstanceDelegate($this,'postCheck'));
}
function &postCheck(&$controller,&$eventArgs)
{
// ToDo: I don't like set $xoopsUsers GLOBAL Here. But Protector needs it.
if($eventArgs->getXoopsUser()) {
$GLOBALS['xoopsUser'] =& $eventArgs->getXoopsUser();
}
include( XOOPS_ROOT_PATH . '/modules/protector/include/postcheck.inc.php' ) ;
return $eventArgs;
}
}
?>
というファイルを、/preload フォルダーに、ProtectorGIJ.class.php という名前で保存すればOKです。
結局、precheckの読込実行は、preFilter() 部分でOKですが、postcheckの読込実行は、"Site.Login"イベント発生時にそのイベントハンドラの一番最後で行う事にしました。
これ、とりあえず窮余の一策的な解法でしかありません。
やはり、XOOPS2.0.xでいうcommon.phpの実行終わりに相当する、$xoopsController->executeCommon(); の終了時にraiseEventを追加した方が良いかもしれませんね。
preload + delegateベースでの機能追加を行っていくためには、適切なところにraiseEventが仕掛けてある事が前提になります。なのでこのようなケーススタディーをどんどん進めていって、適切にraiseEventを追加していきたいと思っています。
コメント
コメントの投稿
ごめんなさい、現在コメントを付けることは出来ません
> が・・・・、
> 少々考えが甘すぎました。Protectorモジュールのpostcheckでは、
> $xoopsUser情報が取得できないといけないようで
Oh! My God!! orz
ActionFilter にコールバックメソッドを追加するより、(そう多くのデリゲートが登録されないのであれば)イベント追加のほうがよさそうですね。
Comment by minahito — 2006年5月25日(木曜日) @ 15時11分24秒