make-object-xml
※以下の解説通りに試してみるのはちょっとお待ちください。上手く動かないかも。~
どうも,やっぱり cbs.xml ファイルで指定した一対多,多対一の関係の生成が Cubson 1.00 では上手くいかないようです(Cubson 0.52 では生成されます)。Cubson のバージョンアップを待った方が良いかも
引き続き Cubson の(ちょっと怪しげな)解説。
Cubson は,テーブルを元に自動的に登録,更新,一覧表示,削除,詳細表示のための php, html コードを出力してくれる非常に便利なコードジェネレータです。これだけでも非常に助かるのですが,さらに,make-object-xml というコマンドを使うと,複数のテーブルの関連づけのためのコードまで生成してくれます。
ちょっと分かりにくいと思いますので,どんなことができるか,具体的な例を元に説明します。例によって,Cuestaurant というレストラン評価モジュールを例に出します。
make-object-xml の使用例
(1)多対一
「レストラン店舗情報」を登録するときに,「都道府県テーブル」から都道府県の一覧を取得してその中から選ばせることを考えます。
このような場合,make-object-xml コマンドでコードを生成すると,php で「都道府県テーブル」から一覧を取得し,入力フォームで select の option としてその一覧をセットしてくれるところまでやってくれます。
なんと,モジュール制作者は,何もコードをいじる必要はありません!
(2)一対多
「レストラン店舗情報」に対して,たくさんのユーザが「評価」を登録でき,「レストラン店舗情報」の詳細表示画面でその評価が一覧表示されるような画面を作ることを考えます。
1件の「レストラン店舗情報」に対して複数の「評価」がぶら下がるケースです。
Cubson の make-object-xml コマンドでコードを生成すると,対象のレストランにぶら下がる評価の配列を html に渡すところまでをやってくれます。モジュール制作者は,渡された配列情報を使って,表示部分を作るだけです。
(1)のケースと違って,見せ方は人によって千差万別なので,流石に Cubson でもそこまではコードを出せません。
make-object-xmlの使い方
前提
make-object-xml は,make-object-xml resutaurant の用にテーブル名を指定するだけで関係する他のテーブルとの連携コードを自動生成してくれます。
しかし自動でそれを作るにあたって,ある「規則」に従ってテーブル名や項目名を作っておく必要があります。正確なロジックは不明(^ ^;)ですが,今まで氷川が作ってきた経験から,以下のような規則があります。
- テーブル名
- {モジュール名}_{テーブル名}。例:モジュール名=cuestaurant,テーブル名:restaurant の場合,テーブル名は cuestaurant_restaurant にします(実際のテーブル名は,これに XOOPS の DB Prefix がついて,xoops_cuestaurant_restaurant のようになる)。
- 主キー
- {テーブル名}_id。例:restarant テーブルの場合,主キーは restaurant_id にする。これには,auto_increment 属性を付けてください。
- 主項目名
- 主キーの次(つまり2番目)に置く。例えば restaurant テーブルの主項目名はレストラン名になりますが,これをテーブルの主キーの次(2番目)に作ります。多対一で select を作る場合,主キーが option の value に,2番目の項目が表示内容にセットされるようです(違っているかも)。
- 日付
- xxx_unixtime。xxxは任意で,registerd_unixtime, updated_unixtime, start_unixtime など,項目の内容にあった名前を付けます。この規則で名前を付けると,オブジェクトハンドラやフォームのチェックで日付と認識され,チェックがかかります。
コマンド
make-objecct-xml {テーブル名}
例:
make-object-xml resutaurant
確認
どうも上手く設定が作られないケースがあります。そのため,作られた xml ファイルを開いて以下の記述があるかを確認してください。
多対一の場合:
<many-to-one name="m{相手のテーブル名}" column="{相手のテーブルの主キー}" class="Entity.{相手のテーブル名}" />
例:restaurant テーブルと pref(都道府県)テーブルの場合
<many-to-one name="mPref" column="pref_id" class="Entity.pref" />
一対多の場合
<set name="m{相手のテーブル名}"> <key> <column name="{自テーブルの主キー}" /> </key> <one-to-many class="Entity.{相手テーブル}" /> </set>
例:restaurant テーブルと opinion(評価)テーブルの場合
<set name="mOpinion"> <key> <column name="restaurant_id" /> </key> <one-to-many class="Entity.opinion" /> </set>
コードの生成
./xml/data 内のファイルの設定確認が終わったら,各テーブルに対して wizard コマンドを発行します。これによって,もしあれば既存のコードが上書きされますのでご注意ください。そのため,プロジェクト作成の最初にこの作業は行うべきです。