PEAK XOOPS - Cube2.1 alpha3とD3モジュールとの相性問題 in englishin japanese

Archive | RSS |
XOOPS
XOOPS : Cube2.1 alpha3とD3モジュールとの相性問題
Poster : GIJOE on 2006-07-19 05:05:52 (8300 reads)

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前に解決できて、一安心というところですね


Printer friendly page Send this story to a friend

Comments list

GIJOE  Posted on 2006/8/1 6:45 | Last modified
nobunobuさん、ご指摘ありがとうございます。
Quote:
XoopsBlock下のメソッドはdeprecatedになると思います。
そうなるだろうとは思っていましたが、どうするべきか悩みどころですね。

ブロック回りって、実は、XOOPSコアバージョン間でもっとも異なる部分だったりします。
本家2.2はinstanceとblockとに分離してkernel化。
Cube2.1はblock==instanceのままkernel化。
本家2.0.14はclass/XoopsBlockのままで表示位置が増えている。

このあたりの互換性をどこまでとるか、本当に悩ましいです。
nobunobu  Posted on 2006/7/31 21:07
互換性確認ありがとうございます。
一つだけ
Quote:
/class/xoopsblock.phpをinclude_onceするようにしました。
XOOPS Cube2.1では、XOOPS2.0系で唯一class下に残っていたXoopsObjectの派生クラスである、XoopsBlockをkernel/block.phpにマージして、class/xoopsblock.phpでは、kernel/block.phpをincludeするように変更してあります。
と言う事で、XoopsBlockと、、XoopsBlockHandlerとで同様のメソッドを持っている事になりますので、将来的には、、XoopsBlock下のメソッドはdeprecatedになると思います。
Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!