まず、前回の modelglue.xml をちょっと更新した。
ファイル modelglue-02.xml 。念のためファイル名は変えておいた。コード補完部分は変わっていない。
では、今回の本題。Scaffold という機能もなかなか便利。
サンプルアプリケーションでいうと、Transfer.xml に記述してあるオブジェクトを指定して Scaffold を設定すると、そのオブジェクトのデータ管理ができる機能が自動で生成される。
以下のように ModelGlue.xml に一行付け加えるだけで、その機能ができてしまうのである。
<event-handlers>
……
<scaffold object="master.Item" />
</event-handlers>
で、http://localhost/shopping/index.cfm?event=master.Item.list にアクセスすると、そのテーブル内のデータが表示できる。
しかし、これまで Transfer.xml で設定していた内容に問題があったようだ。
<package name="master">
<!-- Category -->
<object name="Category" table="CATEGORYMST">
<id name="PKeyCategoryId" type="numeric" column="categoryid" />
<property name="CategoryName" type="string" column="categoryname" />
<onetomany name="CategoryItemLink" lazy="true">
<link to="master.Item" column="lnkcategoryid" />
<collection type="struct">
<key property="PKeyItemId" />
</collection>
</onetomany>
</object>
<!-- Item -->
<object name="Item" table="ITEMMST" sequence="ITEMMST_itemid_seq">
<id name="PKeyItemId" type="numeric" column="itemid" generate="false" />
<property name="ItemName" type="string" column="itemname" />
<property name="Price" type="numeric" column="price" />
</object>
</package>
設定した状態がどのように機能しているかわかりやすいように、PKeyCategoryId 、PKeyItemId としていたのだが、ここをそれぞれ CategoryId 、ItemId のように実際のカラム名と同じ綴りにしないと、エラーになってしまった。
<package name="master">
<!-- Category -->
<object name="Category" table="CATEGORYMST">
<id name="CategoryId" type="numeric" column="categoryid" />
<property name="CategoryName" type="string" column="categoryname" />
<onetomany name="CategoryItemLink" lazy="true">
<link to="master.Item" column="lnkcategoryid" />
<collection type="struct">
<key property="ItemId" />
</collection>
</onetomany>
</object>
<!-- Item -->
<object name="Item" table="ITEMMST" sequence="ITEMMST_itemid_seq">
<id name="ItemId" type="numeric" column="itemid" generate="false" />
<property name="ItemName" type="string" column="itemname" />
<property name="Price" type="numeric" column="price" />
</object>
</package>
ItemArrayBean.cfc の26行目も
StructInsert(itemStruct, "id", Trim(itemQuery.ItemId));
と書き換える。
CartProcess.cfc もちらほらと PKey があるので、修正する。
Scaffold を利用していなかった今までは問題なかったんだけどなぁ。
問題の箇所を書き換えて、上記アドレスから表示される画面から、master.Item オブジェクトに対する一覧表示、新規登録、編集、削除など一通りの機能が利用できる。なかなか便利だ。本番時には使えないだろうけど、開発当初は、なかなか有効に利用できるのではないだろうか。