Legacy_AbstractModule

Description

サブコア Legacy は、仮想コントローラを持っています。このコントローラは、新しいインタフェースを通じて、モジュール、ブロック、及び、テーマを扱います。
legmodule_dialogs
(XOOPS Cube における「コントローラ」は CMS の手続きとしての一種の枠組であって、開発フレームワークではありません )

XOOPS2 case

まず初めに、 XOOPS2 の仕様を思い出してください。XOOPS2 には XoopsModule 、及び、 XoopsBlock があります。これらのクラスは、モジュールデータ & ブロックデータを扱うための基底クラスです。 XOOPS2 は、それらを直接扱います。従って、モジュール開発者は、 XOOPS2 xoops_version のデータをどのように解釈するかということに、従わなければなりません。例えば、モジュールは、いかなる影響も XOOPS2 のキャッシュ機能に与え得ず、また、ブロックのタイトルを変更することもできません。

Legacy case

さて、 Legacy の代替アーキテクチャを見ていきましょう。Legacy controller は、 XoopsModule 、及び、 XoopsBlock を直接使いません。Legacy は、データ解釈を Legacy_AbstractModule 、及び、 Legacy_AbstractBlockProcedure に委託します。これらのクラスは、コントローラと接続するためのインタフェースを持つ抽象クラスです。モジュール開発者は、コントローラから使用されるように、これらのクラスのサブクラスを定義し得ます。サブクラスには、そのメンバープロパティとして XoopsModule オブジェクトがあります。従って、モジュール開発者は、彼のモジュールサブクラスにおいてデータ解釈を変えることが可能です。

How to create an instance

  1. 'Module.class.php' ファイルをモジュールの /class ディレクトリ下に作成してください
  2. {Dirname}_Module クラスを Legacy_AbstractModule のサブクラスとして定義してください
  3. メソッドを実装してください
{Dirname}_Module がすでに定義されている場合は、インスタンスファクトリは 'Module.class.php' をロードしません。このルールは複製可モジュールに有効かも知れません。ぜひレビューしてください。

詳細は
/module/legacy/class/Module.class.php を例としてご覧ください。また、実装すべき 'オーバーライド可能' なメンバ関数については、 Legacy_AbstractModule をご覧ください。

For compatibility

大部分のモジュールは、そのようなサブクラスを持っていません。モジュールがそのようなサブクラスを持っていない場合、 Legacy は、 'Legacy_ModuleAdapter' XOOPS2 互換性のためのアダプタクラスとして使います。このアダプタは、完全に XOOPS2 仕様を模倣します。更に、このアダプタクラスは抽象クラスではありませんので、迅速な使用に有益です。モジュール開発者は、このアダプタクラスをサブクラスのための基底クラスに選ぶかもしれません。

Is it possible to change factory?

ファクトリの前提条件は、 $xoopsModule->get('dirname') によって指定されたモジュールが、モジュールの /class ディレクトリに Module.class.php を持っていることです。この仕様は、複写可能なモジュールにとっては、には不幸です。サブクラス、及び、アダプタクラスのインスタンスを生成するためのファクトリは、 Legacy_Utils に静的関数としてあります。そのため、モジュール開発者は、命名規則を変更出来ません。言い換えれば、そのファクトリは固定パイプライン機能です。しかし、ファクトリの関数は、 XCube_Delegate を使います。従って、開発者は、デリゲートを通じて固定パイプラインのファクトリに割り込むことができます。

同様に、既に指定されたクラスが定義されているならば、
Legacy Module.class.php の読み込みをスキップすることは、重要です。従って、複製可能なモジュールへの多くの解決策が発案されるでしょう。ぜひレビューをお願いします。

Note

Legacy が作成するインスタンスは、 $root->mContext->mModule にセットされます。ルートオブジェクトを得ることによって、モジュール内でこのインスタンスにアクセスすることができます。

Reviews

"基底クラスは Legacy モジュールの /kernel ディレクトリにある。したがって、ファクトリもまたファイルを /kernel ディレクトリに求めるべきである。" (minahito)
|