XOOPS CubeのProfileモジュールをServiceManagerに登録する

XOOPS Cubeのコアに同梱されているProfileモジュールは、ユーザー情報の項目を自由に追加できるモジュールです。
XOOPS CubeのServiceManagerは、モジュール間の連携を実現するXCube_Serviceを管理するコンポーネントです。
コア同梱のモジュールは基本的にServiceManagerにサービスを登録していますが、なぜかProfileモジュールだけは登録されていません。
そこで、登録するためのモジュールプリロードとパッチ(後述)を作りました。

コード

とりあえずコードはGistにあげておきました。

ちょっと解説

Definitions.class.php.patchはご覧の通りパッチファイルです。
メソッドを追加しただけですが、これがないとFATALになります。
呼び出し元を改変することも考えましたが、サービスの機能を減らす修正となってしまうのでこうなりました。
特に怪しい挙動もないので問題なく動作するとは思いますが、自己責任でお願いします。

RegisterService.class.phpはモジュールプリロードです。
このプリロードがServiceManagerへの登録を行います。
こちらのファイルはXOOPS_ROOT_PATH/modules/profile/preloadに配置してください。

まとめ

Profileモジュールのサービスは戻り型にXCube_Objectを継承したクラスを定義していますが、実際に帰ってくるのが配列だったりするので注意が必要っぽいです。
XOOPS Cubeのモジュール開発やカスタマイズに関するドキュメントが少ない印象があるので、こういうネタはもっと拡充したいですね。

参考

PHP – XOOPS Cube ServiceManager – Qiita


Photo By: Robert SchroederCC BY-NC-SA 2.0

[XOOPS Cube] Protectorモジュールに初Pull Requestした話

XOOPS Cubeの定番モジュールである「Protector」に、これまた定番のALTSYSがインストールされていないときにメニューの「一般設定」リンクがXOOPS2のSystemモジュールを指してしまうバグを見つけたので、修正してPull Request、すぐにマージされました。
管理メニューのリンクは正しく生成されているので、管理メニューから移動している限り見つけにくいバグです。

コードについてはhttps://github.com/xoopscube/protector/pull/3をご覧ください。

発生条件

ALTSYSがインストールされていないという1点だけです。
ALTSYSがインストールされている場合、Protector自身のadmin/index.phpを指すようにリンクが生成されます。
しかしALTSYSがインストールされていない場合、Systemモジュールのadmin.phpを指すリンクとなります。
Protector自身はALTSYSのインストールが必須ではないので、これではXOOPS CubeでALTSYSを使わずにProtectorを使いにくくなってしまいます。

修正

ALTSYSの有無を判定している部分で、ALTSYSがインストールされていない場合にlegacyモジュールの有無を判定し、インストールされていればlegacy/admin/index.phpを指すリンクを生成するようにしました。

蛇足

今回Pull Requestを出したのはXOOPS Cubeのリポジトリでしたが、よく見たらXoopsXのProtectorにも同様のバグがありました。
XoopsXは確かALTSYSが必須になっていたような気がするので、ほとんど気づけないですね。
最近のXOOPS Cubeコミュニティは、XoopsXとXOOPS Cubeで別のリポジトリを持ってしまっているせいで外から構造がよくわからなくなっている気がします。


Image By: Barbara DieuCC BY-NC-SA 2.0