Cube2.1 alpha3とD3モジュールとの相性問題

Date 2006-07-19 05:05:52 | Category: XOOPS

in englishin japanese
D3モジュールは当然にCube2.1で動くものと思い込んでいたのですが、実際にα3で試してみたところ、インストーラでこけてました。

基本的にD3モジュールは、modulesadmin のおかしな仕様を回避するために、モジュールインストーラを利用せず、onInstall, onUpdate, onUninstall で自前の処理を施します。

その中で以下のような非互換コードがありました。

(1) /class/database/sqlutility.php がゴッソリ入れ替わっていた
(2) class XoopsBlock の定義が読み込まれていなかった
(3) メッセージがまったく出力されない


(1) 2.0.xまでのsqlutility.phpは、oldsqlutility.phpとして用意されていたので、状況に応じてそちらをincludeするようにした。

(2) これはどちらかというと、今までが偶然動いていただけだったのかもしれません。というわけで、/class/xoopsblock.phpをinclude_onceするようにしました。

(3) これも元々、modulesadminのメッセージ保存配列 $GLOBALS['ret'] (onUpdateのみ $GLOBALS['msgs'])に無理矢理押し込む、なんて無茶な方法だったので、まともなコードになった途端にメッセージが非表示になるのはある程度仕方がありません。

最初は、onInstall関数実行時にメッセージを保持しているオブジェクトを捕まえようと頑張ったのですが、どうやっても捕まえられそうにないので、Cube2.1らしく、Delegateを利用しました。


$root =& XCube_Root::getSingleton();
$root->mEventManager->add("Module.Legacy.ModuleInstall.Success", new XCube_Delegate( 'wraps_message_append_oninstall' ) ) ;



function wraps_message_append_oninstall( &$controller , &$eventArgs )
{
	if( is_array( @$GLOBALS['ret'] ) ) {
		foreach( $GLOBALS['ret'] as $message ) {
			$controller->mLog->add( $message ) ;
		}
	}
}


Cube2.1 でも XOOPS 2.0.x でも動くように、相変わらず$GLOBALS['ret']を利用しているところがナニですが、Cube2.1でモジュール操作についてのメッセージがちゃんと表示されるのはメリットとして大きいと思います。

ただ、Delegateの問題は、肝心なイベントがraiseされないとどうしようもない、ということです。今回も、Uninstallについては、イベントがraiseされていないので、α3では、アンインストール時のメッセージが表示されません。

また、インストールが成功した場合のイベントはraiseされていても、失敗した時のイベントはraiseされていません。(単に、onInstall関数がfalseを返した時の処理が甘い、とも言えるわけですが)

このあたり、もっとバシバシとraiseEvent()を挿入していただけると嬉しいですね。

ともあれ、wraps 1.03 はCube2.1で正常に動作しているようです。また、bulletin 2.0 についても、同様の処理を施すことで、正常に動作しました。

XTC前に解決できて、一安心というところですね




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=343