読者です 読者をやめる 読者になる 読者になる

tohokuaikiのチラシの裏

技術的ネタとか。

Confluenceのプラグイン開発を承ります。ご連絡はこちらのホームページからお願いいたします。

XOOPSCubeLegacyにおける複製可能モジュールの作り方

XOOPSCube

XOOPSCubeLegacyの界隈でいわゆるD3モジュールっていわれているもの。満たすべき機能は「複製可能であること」の一点に尽きる。

そして、これはこよなく便利である。

XOOPS2の頃のD3モジュール作成は本当に大変だった


D3って名付けたのは、XOOPS界の大御所にして今もモジュールを作り続けているGIJOEさん。

Duplicatable Version3が d3の意味で、何がVersion3なのかっていうと、GIJOEさん的に3つ目の仕様ってこと。それまでは複製する際のモジュールのディレクトリ名に制約があったりしたのだけど、無くなったのがVersion3

XOOPS2の頃は、このD3仕様を満たすのは本当に大変だった。というか、私は「ダメダコリャ」ってなった。とにかくブロックがガン。テンプレートもかなり辛いものがあるんだけど、私はDBテンプレというものを自分が使わないのでこのあたりは恣意的にスルー。

あと、DBのインストールも大変だったり、色々難問が山積み。D2の頃は、ユーザーに「この部分書き換えてな〜〜」みたいなノウハウが無いと複製ができなかった。

このあたり、か弱いフックポイントに自前でインストーラを作って解決したのがGIJOEさん。これは本当にスゴいことです。

GIJOEさんの方式が唯一ではない

だけど、XOOPSCubeLegacy(以下XCL)になってからこの辺りの問題はかなり改善された。それは、そのあたりの大変さを知りつつ作ったから。

だから、複製可能仕様のモジュールを作るのは実はかなり簡単になっている。そして、そのような状況ではGIJOEさんの方式は結構「えー、なんでこんな面倒な・・・」という感じになっている。それは理由があって「GIJOEさんはまだXOOPS2のユーザーをサポートしている」からである。

これはねー、私みたいな「自分が使う分を公開している」という立場からすると、絶対真似できないスゴいポリシーです。道理で私のモジュールを使う人が少ないわけだ(苦笑)。*1


しかし、逆に言うとGIJOEさんの方式はXCLにおいては前々唯一ではないし、XOOPS2で使えなくても良いよっていうならもっと簡単なわけです。

ただし、D3方式には見習うべき点は沢山あり、その一つが

  • バージョンアップした際に、ユーザーがカスタマイズした部分(つまりテンプレートですね)はなるべく上書きしないようにする

というポリシーです。これが意外と面倒で、それゆえDBテンプレートをGIJOEさんは使ってるんですが、前述の通りWeb制作者な自分はDBテンプレートとかは使わないわけです。


もっと自分コードの複製可能仕様が見たいなー

ということで、複製可能モジュールを作る時に注意する点の解説。

  • 動的にHTMLなどを吐き出す部分(プログラム部分)と、静的な部分をしっかり分ける
  • テンプレートとデータベースの複製
動的な部分は、エントリポイントだけにしよう

プログラム部分は、ライブラリみたいに1つあれば良いわけで、むしろ複製するとClassやFunctionの二重定義問題が出てきてとてつもなくややこしくなります。

で、index.phpとかpost.phpとかみたいな表に出る部分はエントリポイントとして2行とか3行くらいにしておきます。すると、バージョンごとの違いがほとんど発生し得ないので、いくらコピーしてもらってもバージョンアップ時にコピーした側はほとんど上書きする必要がなくなります。

静的な部分は、一つのところにまとめよう

JavaScriptや、CSSはエントリポイントを作るわけには行きません。そこで、表側のモジュールにユーティリティ的なものを設置しておき、その中にJs/CSSを入れておき、それをとか<script>で読むようにします。こうすることで、バージョンアップ時にJsファイルを全部入れ替える必要が無くなります。わたしの場合、xanhteモジュールがそれにあたります。これだけは複製可能という仕様を満たす必要がないものです。


この二つは、「バージョンアップした際に以下に複製したディレクトリ全部に上書きさせるようにしないか」というユーザーの煩わしさを回避するためのポリシーです。

テンプレートをどうするか。

これは、DBテンプレートを使う場合は相当ややこしいです。
このあたりは、XUGJのマニュアルとか読んでください。

私はこの部分だけは面倒でも複製した分コピーしてな。しかも、テンプレートファイル名のPrefixはdirnameにしてね。。。とユーザーにお願いします。


インストーラとブロック

これが、XCLで超簡単になりました。くわしくは、下記の書籍を読んでください。私は2冊買いました。

XOOPS Cube Legacy デベロッパーズ・バイブル

XOOPS Cube Legacy デベロッパーズ・バイブル




ということで、

自分なりの複製可能仕様モジュールをどんどん作ってください。


ということで、氷川さんのデブクマモジュールがD3ということなので、これを見てみました。

おぉ!ドキュメントルート側しか無い!!

これは、新しいスタイルかも!と思いましたが、多分やっぱりtrust_path化した方が良いかと思います。

とりあえずxoops_version.phpだよねー

ということで、読んでみる。・・・・・んー、これ本当に複製可能なのかな?

テーブル指定が
$modversion['tables'][0] = "{prefix}_cubookmarken_bm";
$modversion['tables'][1] = "{prefix}_cubookmarken_tag";
ってなってるけど、

$modversion['tables'][0] = "{prefix}_{dirname}_cubookmarken_bm";
$modversion['tables'][1] = "{prefix}_{dirname}_cubookmarken_tag";
とかしないと、1つのDBテーブルを複数のcubookmarkenで共有することに・・・。

あと、mysql.sql
CREATE TABLE `{prefix}_cubookmarken_bm` (
ってあるのを
CREATE TABLE `{prefix}_{dirname}_cubookmarken_bm` (
ってしないと、テーブル名がぶつかって2個目のインストールでコける気が。


DBテンプレートも
$modversion['templates'][0]['file'] = 'cubookmarken_bm_list.html';
ってなってるけど、
$modversion['templates'][0]['file'] = '{dirname}_cubookmarken_bm_list.html';
とかしないと、1つのDBテンプレを共有しちゃうような。


でも、こうやって公開するのは大切ですよね。

最近モジュール作る人増えてるよーな気がします。

XUGJ見てると、ぽつぽつと出てきてるよな感じ。XCL面白いから、ぜひみんなもモジュール作ろう!できれば複製可能仕様で。

*1:今のペースの方が質問に答えられるので良いといえば良い。というSour Grape