悪戦苦闘してた XCL のモジュール作りなんですが。
cubson 使って作ってもね、なんかダメだったわけですよ。
「なんでじゃー うだー うだー」と、テンション下がりつつ、人様に迷惑かけつつ、自分のアホも晒しつつ作業してたわけですが。
この度、氷川さんの協力を得てモジュール動くトコまでいったわけです。
いぇー! ホントに出来たー! こんなアホにも(爆)
きっとこのブログ読んでる大半の人間がドッチラケてると思いますが!
空気嫁とか言われそうだけど気にしない。嬉しいから(^^
* * *
さて、ここからは僕が今までコケてきた箇所と、その解法についてのメモ。
親切な方たちに過度の苦労をさせないために。
それとコケるとすぐ投げ出そうとする俺みたいな人のために(笑)
ビバ人柱! (……そんな大したアレじゃない)
註:[3][4] は Cubson-1.00 Alpha の話です。1.02 では解消されていました。
ページの内容
1. DB 名前の罠(?)
なぜかウチの環境(XAMPP basic 1.5.5 + MySQL ODBC 3.51 Driver)では、DBの名前に [_] (アンダースコア)が使用されていると、cubson でデータを取得してくれませんでした。
他所でもそうなのかな?
(XCL で動かす分には [_] の入る DB にテーブル置いても大丈夫です。cubson で作る過程だけ)
2. ODBC の設定ミス
DB を新しく作ってやりなおしたのに、ODBC で DataBase の指定を変えるの忘れてました。
そりゃデータベースからデータ取得しようったって無理だよ…orz
3. /sql/mysql.sql の罠
さあ、cubson> wizard が成功したぞ。これでモジュールの雛形完成!
じゃあ早速、雛形だけだとどんなモノなのか見てみよう。
インストール。
* You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘鏤?REATE TABLE `{prefix}_{modulename}_{tablename}` ( `{tablename}_id` int ( 11 ) unsigned NOT NULL auto_in’ at line 1
* {modulename} モジュールのインストールに失敗しました
* Force Uninstallation is started.
(註:斜体記述部分はモジュールごとに異なる)
いかんいかん。
/sql/mysql.sql のファイルは作ってないから xoops_version.php を編集せんと。
【xoops_version.php】
27行目 : $modversion[‘sqlfile’][‘mysql’] = “sql/mysql.sql”;
ここを、
【xoops_version.php】
27行目 : //$modversion[‘sqlfile’][‘mysql’] = “sql/mysql.sql”;
コメントアウトして、と。
とりあえずコレでインストールできます。
4. /class/Module.class.php の罠
インストールできたモジュールを動かしてみようということで、/class/Module.class.php の 72行目、Default になってる部分を {Tablename}Edit に書き換えて、走らせてみる。
Fatal error: Call to a member function load() on a non-object in {xoops_url}modules{modulename}actions{Tablename}EditAction.class.php on line 27
これは正直、めげました。
でも辛抱強く教えていただいたので、折れてる場合じゃないと立ち直り。
正常に動作するテストファイルをいただいて、クロスチェック。
あれこれ彷徨ったあげく、var_dump 攻撃を勧められて、発見しました。
以下の箇所を編集しないといけませんでした。
【/class/Module.class.php】
function startup()
{
parent::startup();
XCube_DelegateUtils::call(‘Module.test01.Event.GetAssetManager’, new XCube_Ref($this->mAssetManager));
$root =& XCube_Root::getSingleton();
$root->mController->mExecute->add(array(&$this, “execute”));
}
上記の test01 を {modulename} へ書き換えれば、動きます。
これもまあ、ちゃんとスクリプト読めば、直下に
//
// TODO/Insert your initialization code.
//
それっぽいことが書いてあったんですが…orz