tohokuaikiのチラシの裏

技術的ネタとか。

XOOPSCubeのモジュール開発に置けるJavaScriptライブラリの使い方と競合

2008-06-03 - 氷川 XOOPS Module 開発室

先日,Google Ajax Libraries API というのが新たに追加されました。

jQuery など,主要な javascript のライブラリを Google がホストし,各自のサイトから利用できるようにした API です。

サイトに設置する手間が省けるというのと,運が良ければ,他のサイトを開いたときのキャッシュを利用できる,というのが主なメリットで,最初きいたときは「ふうん,便利かもね」と思いました。

が,こういった話もあるので,XOOPS のように一人の開発者が作り上げるわけではないシステムにとって,これは助かるんでわないかと考え直しました。

(略)

あーでもブロックでうかつに使うと競合する可能性がありますね。

です。
正直、このあたりは頭が痛い・・・。PHPのライブラリ競合の場合はFatalを起こすのである意味まだ楽なんですが、JavaScriptのライブラリ競合の場合は一件問題なく行けてしまうように見えたりそうでなかったりするので、面倒ですよね。

ブロックでJavaScriptコールしている場合なんて、さらに再現状況が複雑に・・・・。



で、一応「自分の守備範囲だけでも」という感じでxanhteにはjs/cssのコールの競合を避けるような気がする微妙なシステムがあります。・・・といっても現時点ではSVNに上げてるだけですが。

説明すると、xanhteのpreloadのひとつにAssignModuleHeaderというのがあるのですが、これはxoops_version.php

$modversion['js'] = array(
    '/modules/xanhte/js/lib/prototype.js' => 1,
    '/modules/xanhte/js/lib/blockshow.js' => 10,
);

とか書いておくと、自動的に<{$xoops_module_header}>テンプレート変数でこのJsをコールするようになります。

右側の1とか10とかはプライオリティです。


で、ブロックでも

$modversion['blocks'][1] = array(
.....
    'js' => array(
        '/modules/xanhte/js/lib/prototype.js' => 1,
        '/modules/xanhte/js/lib/blockshow.js' => 10,
    )
);

ってやればコールできます。CSSも同じ。


ただ、全然完璧ではなく、block-procedureは$xoopsTplが作られるより先に実行されるから良いんですが、module-procedureが$xoopsTpl作成後に行われるので、追いついていない・・・・。なんとか競合をしないようにAssignはできますが。微妙。


さらに、これは別に中のライブラリを見て判断しているわけじゃないので、全然別所にprototype.jsがあった場合も無力。



なので、本当は「XOOPSCube ServiceとしてJsライブラリをコールできる」もの*1を作って、みんなそれに従ってXOOPSCubeのコードを書きましょうねっていうのが正解なんですが、それは絶対ムリ。そういう統一感の無さこそがXOOPSCubeなんだから。

そういうコーディングガイドというか、規約が無い。アナーキズムな世界。否定するというより、「じゃあ、自分で作ってれば良いじゃん」という。。。。言い方が良くないな。ま、そりゃそうなんです。だから、私は自分のモジュールだけは上記の方法で競合を避けてます。jsのライブラリは一カ所においている。

だからXOOPSCubeにおけるコラボっていうのは実は難しい。自分だけのモジュールで完結させるならまだしも、「他のモジュール入れたら動きませんー」とかユーザーがいうからね。HDとかよくやってるよなー。(とかいう。あれは参加者が全員顔を突き合わせてるからできてるって気もしないでもない。)

*1:一応、xanhteのjsコールシステムはServiceで作ってる