今日は、ジェネリック・データベース・メッセージ(GDM)のうち、GenericCommitについて、紹介します。(原文タイトル:Using modelglue.GenericCommit)
modelglue.GenericCommit
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルにレコードを保存しようとします。
その実行プロセスは以下のとおりです。
1.アップデートするために既存レコードをロードするか、criteriaで指定されたものにマッチするものがない場合は、挿入するために新規レコードをクリエイトします。
2.レコードのフィールド値をアップデートします。 デフォルトでは、viewstate(FORMとURLスコープの組み合わせ)に対応するフィールドはどれもviewstateの値で設定されます。
このことは、所与のcontactテーブルに関して、"firstname"というフォーム入力の値が、contactレコードのFirstnameの値に自動的に永続化されることを意味します。
デフォルトで、DataControllerはすべてのフィールドに対してviewstate内の同一プロパティ名の値で永続化しようとします。どのプロパティを永続化するかをコントロールするために、以下に示される「properties」引数を使用してください。
3.Validate()メソッドと呼ぶことによって、レコードを検証します。
4.レコードが検証されると、DataControllerはデータベースにデータを保存します。
5.最後に、DataControllerは、2つの結果"commit"か"validationError"のいずれかの1つを加えます。これらのresult名をもつresultマッピングの追加は、他のresultマッピングとも同様に動作します。
このmodelglue.genericCommitメッセージは、次の<argument>タグを使用することによって構成されます:
1.Object (必須) -Commitするレコードオブジェクトのテーブル名
2.Criteria (必須) -フィルタとして使用するviewstate値のリスト
ターゲットテーブル中のカラム名にマッチする名前の値リストが、クエリーの'WHERE'節で使用するフィルタとして使用されます。
通常は、テーブルのプライマリーキーのリストに設定されます。ヌルだと、新しいレコードが作成されます。 所与のレコードが、指定されたCriteriaに合致すると、レコードはアップデートされます。さもなければ、新しいレコードが挿入されます。
3.RecordName (任意) -レコードデータセットを格納するviewstate名
デフォルトは、Object&"Record"です。
4.ValidationName (任意) -検証エラー時のメッセージコレクションを格納するviewstate名
デフォルトは、Object&"Validation"です。
5.Properties (任意) -viewstate内の同一名の値から永続化しようとするRecordのフィールド名
デフォルトでは、全てのレコードフィールドが対象となります。
例)基本的なGenericCommit
Contactテーブルで基本的なGenericCommitを実行するために、次のように<event-handler>タグに<message>タグを追加できます:
<message name="modelglue.GenericCommit">
<argument name="object" value="Contact" />
<argument name="contactId" value="Contact" />
</message>
ビューで次のコードを実行することによって、レコードを<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactRecord") />
ビューで次のコードを実行することによって、検証メッセージを<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactValidation") />
イベントハンドラ名を"contact.commit"として、以下のURLでこのイベントハンドラーを呼び出すと、'ContactId=42'の'firstname'を'Fred'にアップデートする結果を得るでしょう。
index.cfm?event=contact.commit&contactId=42&firstname=Fred
Viewstate値の引数リストをカスタマイズする。
Contactテーブルに基本的なGenericCommitを実行し、レコードと検証の両方を格納するviewstate名を指定するためには、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericCommit">
<argument name="object" value="Contact" />
<argument name="contactId" value="Contact" />
<argument name="recordName" value="myCommittedContact" />
<argument name="validationName" value="validationForContact" />
</message>
ビューで次のコードを実行することによって、レコードを<cfdump>できます:
<cfdump var="#viewstate.getValue("myCommittedContact") />
ビューで次のコードを実行することによって、検証メッセージを<cfdump>できます:
<cfdump var="#viewstate.getValue("validationForContact") />
イベントハンドラ名を"contact.commit"として、以下のURLでこのイベントハンドラーを呼び出すと、'ContactId=42'の'firstname'を'Fred'にアップデートする結果を得ます。
index.cfm?event=contact.commit&contactId=42&firstname=Fred
特定のプロパティをコミットする。
Firstnameだけ更新されるようにContactテーブルに基本的なGenericCommitを実行するには、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericCommit">
<argument name="object" value="Contact" />
<argument name="contactId" value="Contact" />
<argument name="properties" value="Firstname" />
</message>
ビューで次のコードを実行することによって、レコードを<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactRecord") />
ビューで次のコードを実行することによって、検証メッセージを<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactValidation") />
イベントハンドラ名を"contact.commit"として、以下のURLでこのイベントハンドラーを呼び出すと、'ContactId=42'の'firstname'のみ'Fred'にアップデートし、Lastnameは"finklebuster"にアップデートしない結果を得ます。
index.cfm?event=contact.commit&contactId=42&firstname=Fred&lastname=Finklebuster
最近のコメント