Detailed commentary on the sample message module
Installer
このモジュールは、
PM
と交換されますので、このモジュールが PM
の現存するデータを移動させることができればベストです。そのような目的のために、 XOOPS2
ではモジュール開発者は onInstall
スクリプトを使用します。Legacy 2.1
では、カスタムインストーラが利用可能です。カスタムインストーラは、
xoops_version
において宣言された特定のクラスです。通常、そのクラスは、コントロールパネルにおけるインストール機能によって使われるインストーラクラスのサブクラスです。
$modversion['legacy_installer']['installer']['class']
= "Installer";
これは、正式なクラス名ではありません。正式なクラス名は、この宣言と dirname
によって生成される合成名です。それは {Dirname}_{class}
です。この場合、正式なクラス名は、 "Messgae_Installer"
になります。そのクラスは、 admin/class/{class}.class.php
において定義されなければなりません。
命名規則は、複写可能なモジュール、及び、 D3
モジュールのためのいくらかのオプションや例外を持っています。詳細は
Legacy_ModuleInstallAction
のコメントを見てください。
モジュール開発者は、カスタムインストーラによってインストールプロセスの全てをコントロールすることが可能です。onInstall
より優れた仕様は、柔軟性、及び、ロギングです。インストーラクラスは、そのメンバープロパティとしてログインスタンスを持っています。それを通じて、このモジュールは、マイグレーションに関するメッセージをユーザーに示します。これらのメッセージは
modinfo.php
において定義されています。
Kernel handler hook
プライベートメッセージは、
Legacy 2.1
の任意の仕様です。しかし、それは、他のフィーチャーにおいてはポピュラーな仕様です。例えば、悪名高き
XoopsMultiMailer
は、メール、及び、メッセージを抽象化します。同じく通知機能は、プライベートメッセージを使います。これらのクラスは、メッセージを送るためにカーネルのプライベートメッセージハンドラを使います。従って、このモジュールはこのハンドラをフックしなければなりません。どうすればよいでしょうか
?
答えはデリゲートを理解することにあります。カーネルのハンドラは、フライウェイトパターンの一種である
xoops_gethandler()
を通じて取得されます。 xoops_gethandler()
は、デリゲートイベント "Legacy.Event.GetHandler"
を備えています。従って、プリロードで関数をこのイベントに加えることによってそれをフックすることが可能です。それによって、
xoops_gethandler()
は、プライベートメッセージハンドラを得るためのリクエストに対して、このモジュールのアダプタクラスを返します。それは、興味深いです。kernel/privmessage.class.php
を見てみてください。
Note
xoops_gethandler()
は、キャッシュを持っています。だれかが preBlockFilter()
の前にプライベートメッセージハンドラを得るならば、イベントは、プライベートメッセージハンドラのために、二度と呼び出されないでしょう。
プリロードをプライマリプリロードとして指定可能な状態につくっておくことはよい解決策になります。