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 ) ;
}
}
}
XoopsBlock下のメソッドはdeprecatedになると思います。
/class/xoopsblock.phpをinclude_onceするようにしました。