Legacy_AbstractModule
Description
サブコア
Legacy
は、仮想コントローラを持っています。このコントローラは、新しいインタフェースを通じて、モジュール、ブロック、及び、テーマを扱います。
(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
- 'Module.class.php' ファイルをモジュールの /class
ディレクトリ下に作成してください
- {Dirname}_Module クラスを Legacy_AbstractModule
のサブクラスとして定義してください
- メソッドを実装してください
{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)