メッセージ

「message」モジュールは、進歩したプライベートメッセージモジュールです。それは、送信ボックス、草稿ボックス、プレビューを可能にします。

あなたは、このサンプルによって次のものを学ぶでしょう :
  • どうやって Legacy 2.1 のカーネルハンドラをフックするか
  • ログと共にある Legacy 2.1 時代におけるインストールスクリプト
  • User-Control-Event の応用
  • Legacy 2.1 のための共通インタフェースとしての仮想サービス
  • cubson 0.52.3 のサンプル(あなたが cubson ユーザーであるならば)
  • そして、 Cube の換装コンセプトの一端

あなたは、このモジュールを動かすのに Cube Legacy 2.1 の最新のスナップショットを必要とします。
ダウンロードページからこのモジュールを得てください。

インストール方法

  1. あなたが pm モジュールをインストールしたならば、それをアンインストールしてください。
  2. このモジュールをインストールしてください。
  3. 現存するメッセージは、インストールスクリプトによって自動的にマイグレーションされます。

詳細解説

重要なポイントは以下の通りです。

インストーラ

このモジュールは、 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 において定義されています。

カーネルハンドラのフック

プライベートメッセージは、 Legacy 2.1 の任意の仕様です。しかし、それは、他のフィーチャーにおいてはポピュラーな仕様です。例えば、悪名高き XoopsMultiMailer は、メール、及び、メッセージを抽象化します。同じく通知機能は、プライベートメッセージを使います。これらのクラスは、メッセージを送るためにカーネルのプライベートメッセージハンドラを使います。従って、このモジュールはこのハンドラをフックしなければなりません。どうすればよいでしょうか ?

答えはデリゲートを理解することにあります。カーネルのハンドラは、フライウェイトパターンの一種である xoops_gethandler() を通じて取得されます。 xoops_gethandler() は、デリゲートイベント "Legacy.Event.GetHandler" を備えています。従って、プリロードで関数をこのイベントに加えることによってそれをフックすることが可能です。それによって、 xoops_gethandler() は、プライベートメッセージハンドラを得るためのリクエストに対して、このモジュールのアダプタクラスを返します。それは、興味深いです。kernel/privmessage.class.php を見てみてください。

覚え書き

xoops_gethandler() は、キャッシュを持っています。だれかが preBlockFilter() の前にプライベートメッセージハンドラを得るならば、イベントは、プライベートメッセージハンドラのために、二度と呼び出されないでしょう。

プリロードをプライマリプリロードとして指定可能な状態につくっておくことはよい解決策になります。