軽くなった’シナプスぶろぐ’
シナプスぶろぐが、今朝のバージョンアップでたいぶ軽くなった。
ブログの表示は、体感的にサクサクって感じ。
投稿は、この結果次第だけど、軽くなっていることを期待して、エイッ!
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
シナプスぶろぐが、今朝のバージョンアップでたいぶ軽くなった。
ブログの表示は、体感的にサクサクって感じ。
投稿は、この結果次第だけど、軽くなっていることを期待して、エイッ!
ちょっと古い記事(6/12)ですが、Joe Rinehartが"Model-Glue:Unity ActionPacks"を彼のブログで紹介していました。今後のために、意訳してみます。
私がModel-Glueに関して聞いた1つの批評は、既存のアプリケーションに「ぶら下がれる」機能モジュールを作成する簡単な方法が全くないということでした。
私は、フォーラムアプリケーションを書くのが楽しくないので、「これをModel-Glueアプリケーションに追加してくださいか?」とただただ言うだけです。
さて、Model-Glue:Unityには、まさしくこれを可能にする新しいタグがあります:
<modelglue>の子としての<include>タグです。しばらくその批評に耐えてきましたが、<include>タグが正常に動作して、Model-Glueフレームワークにとても素晴らしい機能が追加できたと思います。この機能追加は、どんなModelGlue.xmlファイルも他のModel-Glue.xml形式のファイルになリ得るし、そして、"子"ファイルでは、それ自身の<controllers>と<event-handlers>を定義できることです。
さらに、"部品化"されたModel-Glue XMLファイルでは、Viewマッピングに使用する追加ディレクトリはもちろん、ColdSpringにロードする追加XMLファイルを宣言するための<setting>タグを使用できます。
例)
以下は、Wiki.xml用"部品"ファイルに、mgwikiに必要なすべてを宣言できることを意味します:<modelglue>
<config>
<!-- Add the wiki /views dir to the viewmappings -->
<setting name="viewMappings" setting="/mgwiki/views" />
</config>
<controller name="wikiController" type="mgwiki.WikiController">
<message-listener message="wiki.page" function="getPage" />
<!--- other listeners... --->
</controller>
<event-handlers>
<event-handler name="wiki.displayPage">
<broadcasts>
<message name="wiki.page" />
</broadcasts>
<views>
<include name="body" template="dspWikiPage.cfm" />
</views>
<results>
<result do="view.template" />
</results>
</event-handler>
<!--- More event handlers... --->
</event-handlers>
</modelglue>
次に、Wiki機能を他のModel-Glueアプリケーションに加えたいなら、Wiki"部品"を含むように、ModelGlue.xmlファイルを以下のように変更すればいいのです:<modelglue>
<include template="/mgwiki/config/Wiki.xml" />
<!--- Application stuff...--->
</modelglue>
◆<include>の危険性
<include>を使用することに、全く危険がない訳ではありません:<include>タグが、既存のイベントハンドラーやコントローラーを上書きする可能性も有り得ます。"wiki"部品を親アプリケーション定義の前に置いたのはその理由に拠ります:-)。
◆"ActionPacks?"
Model-Glue:Unity(2.0)の正式リリースに向けて、"ActionPacks"と呼ぶ2、3のModel-Glue部品のリリースを計画しています。ひとつ目は、使いやすく、構成変更可能なe-mailサービスです。他に、ロールベース兼行レベルのセキュリティ対策、ユーザプロファイル管理及びユーザ管理用のインタフェースを提供する予定です。
これらの"ActionPacks"は、Model-Glueフレームワークに少しの変化も必要とせず、まさしくModel-Glue XML部品であるので、誰でも自由にModel-Glueコミュニティに貢献できます。もし誰かがその開発に興味を持ったなら、私は可能な範囲で手伝うことに満足するでしょう。そして、Action Packsの選定(多分フォーラムアプリがそうなるでしょうけど)のために、それをModel-Glueの開発に追加するでしょう。
今回は、Scaffoldのテンプレートで使用される.XSLファイルのカスタマイズ方法について紹介します(原文タイトル:Customizing Scaffold .XSL Files)
■Scaffold.xslファイルをカスタマイズする。
scaffoldタグが生み出すView CFMLを変えることは、全く可能です。全ては、.XSLファイルを編集することから始まります。xslファイルの編集は、このガイドの範囲外です。しかし、全く難しいわけではありません。
.XSLファイルをカスタマイズするには、3つの方法があります。
□デフォルト.XSLファイルを直接編集する方法
/ModelGlue/unity/xslティレクトリを参照すると、アプリケーションにscaffoldを追加する際に生成されるためにCFMLを定義したいくつかの.XSLファイル(edit.xsl, list.xsl, view.xsl)を見出すでしょう。
全Model-Glueアプリケーションの振る舞いを変更するためには、直接これらのファイルを編集してください。
□新しく.XSLファイルを作成する
自分用の.XSLファイルを作成することによっても、全Model-Glueアプリケーションの振る舞いを変更できます。所与のscaffoldにカスタムXSLファイルを使用するように教えてあげるために、以下のことを行います。
1./ModelGlue/unity/config/Configuration.xmlを開きます。
2."eventHandlerFactory"ビーンを探します。
3.EventHandlerTypesのコンストラクタ引数を定義する<map>タグにある.xslファイルの場所を示すxslキーをカスタム.XSL用に変更します。
以下、list.xslの例を抜粋します。
<constructor-arg name="EventHandlerTypes">
<map>
<entry key="eventhandler">
<map>
<entry key="scaffold"><value>false</value></entry>
<entry key="class"><value>ModelGlue.unity.eventhandler.EventHandler</value></entry>
<entry key="views"><list /></entry>
</map>
</entry>
<entry key="list">
<map>
<entry key="scaffold"><value>true</value></entry>
<entry key="class"><value>ModelGlue.unity.eventhandler.scaffold.List</value></entry>
<entry key="views">
<list>
<map>
<entry key="name"><value>List</value></entry>
<entry key="xsl"><value>/ModelGlue/unity/xsl/list.xsl</value></entry>
<entry key="prefix"><value>dsp</value></entry>
<entry key="suffix"><value>List.cfm</value></entry>
</map>
</list>
</entry>
</map>
</entry>
全Model-Glueアプリケーションの振る舞いを変更するために、直接これらを編集します。
□アプリケーション固有の.XSLファイルを編集する方法
特定のModel-Glueアプリケーションで使用される.XSLファイルを変更するには、/ModelGlue/unity/config/Configuration.xml内のEventHandlerFactoryビーン全体を適用したいアプリケーションのColdspring.xmlにコピーします。
そして、"新しく.XSLファイルを作成する"内のインストラクションに従い、/ModelGlue/unity/config/Configuration.xmlファイルの代わりにColdspring.xmlファイル内EventHandlerFactoryセッティングを編集します。
今回は、Scaffoldによって生成されたCFMLをカスタマイズする方法について紹介します。
(原文タイトル:Customizing Generated CFML)
■生成されたHTMLをカスタマイズする
Scaffoldタグは、list機能、View表示とEditフォームなど関連ファイルを必ず生成します。これらの生成されたコードは、ColdSpring.xml内のModelGlueConfigurationBeanのScaffoldPathのプロパティによって管理されるディレクトリに入れられます。
拡張メモ:このセッティング値は、ViewMappingsセッティングに追加され、inculdeタグに遭遇した際に、最後にサーチしたディレクトリを作成します。
デフォルトで、以下の.CFMテンプレートは、scaffoldされたテーブルに対して各々生成されます:
1.dspTableList.cfm - テーブルからレコードリストを表示
2.dspTable.cfm - テーブルから単一レコードを表示
3.frmTable.cfm - テーブルから単一レコードに対する編集フォームを表示
生成されたCFMLをカスタマイズするために、直接これらのファイルを編集することができません。フレームワークが再ロードされる次のとき、これは上書きされるからです。
Viewを編集するために、アプリケーション内の/viewディレクトリに前述のファイルをコピーします。その時点で、コピーされたファイルは上書きされることはなくなります。データベースのコラムを追加された場合、新しいコラムのCFMLをコピー&ペースト可能な資源として生成されたコードを使用できます。
拡張メモ:ViewMappingsセッティングにリストされたどのディレクトリにでも、コピーできます。
今回は、Scaffoldタグで、Broadcasts、Results、Viewsタグを使用することについてご紹介します。
■Scaffoldsで、Broadcats, Results及びViewを使用する
"Scaffoldを追加する"で見てきたように、単なるscaffoldタグは複数のイベントハンドラーを定義するだけです。Model-Glue XMLフォーマットを容易に学習するために、scaffoldタグはイベントハンドラーと同じ子タグ(broadcasts, views, and results)をサポートします。
scaffoldタグ配下に追加されたbroadcasts, views, もしくは resultsタグは、与えられたscaffoldが作成する全てのイベントハンドラーに適用されます。(broadcasts, views, 及び resultsの作成方法を学習するには、クイックスタートガイドを参照してください。)
このことによって、よりパワフルにScaffold機能を拡張できます。
たとえば、Model-Glue Application Templateから、所定のScaffoldから作成される全てのイベントハンドラーにサイト全般のテンプレートを使用するためには、単にresultタグを追加するだけです。
<scaffold object="Contact">
<results>
<result do="view.template" />
</results>
</scaffold>
同一オブジェクトに対して、複数のscaffoldタグを作成し、scaffoldのTYPE属性で分割することによって、メッセージのブロードキャストを特定のscaffoldが生成するイベントハンドラーに適用することもできます。
誰でもcontacsを参照可能で、管理者だけがcontactを更新可能なアプリケーションがある場合、非認証アクセスからEdit、Commit及びDeleteイベントハンドラーを保護するため、ModelGlue.xml内に次のXML(セキュリティ機能と果たす"UserMustBeAdministrator"というメッセージをリスンし、イベントへの不正アクセスに対して"SecurityViolation"と呼ぶresult結果を追加する)を使用します。
<scaffold object="contact" type="list,view" />
<scaffold object="contact" type="edit,commit,delete">
<broadcasts>
<message name="UserMustBeAdministrator" />
</broadcasts>
<results>
<result name="SecurityViolation" do="SecurityViolation" redirect="true" />
</results>
</scaffold>
今回は、Scaffoldタグに特定のイベントハンドラーを追加する方法を紹介します。
(原文タイトル:Adding Specific Event Handlers)
■特定のイベントハンドラーを追加する。
デフォルトで、<scaffold>タグは、5つのイベントハンドラー:table.list, table.view, table.edit, table.commit, table.deleteを追加します。
しかしながら、デフォルトで追加されるこれらのイベントハンドラーの全てを必要としないともあるでしょう。自動的に生成されるscaffoldsのイベントリストを調整するために、ColdSpring.xml内のModelGlueコンフィグいーンのデフォルトScaffoldsプロパティの値リストを変更します。
<property name="defaultScaffolds"><value>list,view</value></property>
Edit, Commit及びDelete Scaffoldsは、まだ利用できますが、scaffoldsタグのTYPE属性を指定する必要があります(以下、参照)。
■TYPE属性を使用する
所与のscaffoldタグにTYPE属性を使用することによって、作成するイベントハンドラーのリストを指定できます。
例えば、誰でもcontacsを参照可能で、管理者だけがcontactを更新可能なアプリケーションがある場合、非認証アクセスからEdit、Commit及びDeleteイベントハンドラーを保護するため、ModelGlue.xml内に次のXML(セキュリティ機能と果たす"UserMustBeAdministrator"というメッセージをリスンし、イベントへの不正アクセスに対して"SecurityViolation"と呼ぶresult結果を追加する)を記述します。
<scaffold object="contact" type="list,view" />
<scaffold object="contact" type="edit,commit,delete">
<broadcasts>
<message name="UserMustBeAdministrator" />
</broadcasts>
<results>
<result name="SecurityViolation" do="SecurityViolation" redirect="true" />
</results>
</scaffold>
今回は、Scaffoldsの追加方法を紹介します。(原文タイトル:How To Add A Scaffolds)
■Scaffoldsを追加する。
1.データベースにテーブルを追加します。
現時点では、このテーブル(及びリレーションシップで使用するどのテーブルも)は、プライマリキーとして動作する1つのカラムだけを有しているものとします。
2.テーブルが、1対多や多対多の形態で他のテーブルと結合している場合、そのリレーションシップを<objects>、<hasMany>、<hasOne>及び関連するタグを使ってReactor.xmlファイルに追加します。
3.ModelGlue.xmlに以下のタグを追加します。
<scaffold object="contact" />
そうすると、次のようなイベントハンドラーを作成します。
1.Contact.List -contactテーブルの全リストを表示
2.Contact.View -特定レコードを読み出し専用で表示
3.Contact.Edit -contactレコードの編集用フォームの提供
4.Contact.Commit -contactレコードのデータベースへの保存
5.Contact.Delete -所定のcontactレコードの削除
前回までModel-Glue:UnityのGDMを紹介してきましたが、今回からScaffoldsを紹介していきます。
(原文:How To Use Scaffolds)
■Scaffoldsの使用方法
・Scaffoldsは、データベースアクセス用基本ユーザインタフェースをとても簡単に作成できるツールです。
*Display a "master list" of records in a table
テーブルのマスターリストレコードの表示
*Display an editing form capable of editing both a record's data and its relations to other tables (one-to-many and many-to-many)
レコードデータと他のテーブルとのリレーションシップ(1対多、多対多)を編集可能な編集フォームの表示
*Display a read-only view of a record
レコードの読み出し専用ビューの表示
*Update a record's data
レコードデータを更新
*Delete a record
レコードの削除
Scaffoldsを使用し、Scaffoldsが生み出すコードの修正することを適切に学習することによって、データベース制御タスクの開発時間を大幅に削減できます。
今日は、ジェネリック・データベース・メッセージ(GDM)のGenericDeleteについて、紹介します。(原文タイトル:Using modelglue.GenericDelete)
modelglue.GenericDelete
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルから特定のレコードを削除しようとします。
このmodelglue.genericListメッセージは、次の<argument>タグを使用することによって構成されます:
1.Object (必須) -レコードを削除したいテーブル名
2.Criteria (必須) -フィルタとして使用するviewstateプロパティリストです。ターゲットテーブル中のカラム名にマッチする名前の値リストが、クエリーの'WHERE'節で使用するフィルタとして使用されます。
例)基本的なGenericRead
Contactテーブルに基本的なGenericDeleteを実行するためには、次のように<event-handler>タグに<message>タグを追加します:
<message name="modelglue.GenericDelete">
<argument name="object" value="Contact" />
<argument name="contactId" value="Contact" />
</message>
イベントハンドラ名を"contact.delete"として、以下のURLでこのイベントハンドラーを呼び出すと、'ContractId'が'42'であるcontactテーブルの削除結果を得るでしょう。
index.cfm?event=contact.delete&contactId=42
今日は、ジェネリック・データベース・メッセージ(GDM)のGenericReadについて、紹介します。(原文タイトル:Using modelglue.GenericRead)
modelglue.GenericRead
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルから特定のレコードを読み出そうとします。
このmodelglue.genericListメッセージは、次の<argument>タグを使用することによって構成されます:
1.Object (必須) -レコードを読み出したいテーブル名
2.RecordName (任意) -レコードデータセットを格納するviewstate名
デフォルトは、Object&"Record"です。
3.Criteria (任意) -フィルタとして使用するviewstateプロパティリストです。ターゲットテーブル中のカラム名にマッチする名前の値リストが、クエリーの'WHERE'節で使用するフィルタとして使用されます。
例)基本的なGenericRead
Contactテーブルに基本的なGenericReadを実行するためには、次のように<event-handler>タグに<message>タグを追加します:
<message name="modelglue.GenericRead">
<argument name="object" value="Contact" />
</message>
ビューで次のコードを実行することによって、クエリー結果を<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactRecord") />
注:Criteriaを全く指定していないので、新しく空のレコードを返します。
■Viewstate名をカスタマイズする
Contactテーブルに基本的なGenericReadを実行し、Viewstateに特定名をセットするために、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericRead">
<argument name="object" value="Contact" />
<argument name="recordName" value="myContact" />
</message>
ビューで次のコードを実行することによって、クエリー結果を<cfdump>できます:
<cfdump var="#viewstate.getValue("myContact") />
注:Criteriaを全く指定していないので、新しく空のレコードを返します。
■特定のレコードを読み出す
Contactテーブルに基本的なGenericReadを実行し、ViewstateのContactId値でフィルタリングするために、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericRead">
<argument name="object" value="Contact" />
<argument name="criteria" value="ContactId" />
</message>
イベントハンドラ名を"contact.read"として、以下のURLでこのイベントハンドラーを呼び出すと、'ContractId'が'42'であるcontactテーブルの読み出し結果を得るでしょう。
index.cfm?event=contact.read&contactId=42
今日は、ジェネリック・データベース・メッセージ(GDM)のGenericListについて、紹介します。(原文タイトル:Using modelglue.GenericList)
modelglue.GenericList
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルからレコードをリストアップしようとします。
このmodelglue.genericListメッセージは、次の<argument>タグを使用することによって構成されます:
1.Object (必須) -リストアップするテーブル名
2.QueryName (任意) -クエリー結果を格納するviewstate名
デフォルトは、Object&"Query"です。
3.Criteria (任意) -フィルタとして使用するviewstateリストです。ターゲットテーブル中のカラム名にマッチする名前リストが、クエリーの'WHERE'節で使用するフィルタとして使用されます。
4.OrderBy (任意) -クエリーをソートするための単一カラム名
5.Accending (任意) -真(true)の場合、昇順になります。偽(false)の場合、降順になります。
例)基本的なGenericList
Contactテーブルに基本的なGenericListを実行するためには、次のように<event-handler>タグに<message>タグを追加します:
<message name="modelglue.GenericList">
<argument name="object" value="Contact" />
</message>
ビューで次のコードを実行することによって、レコードを<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactQuery") />
■Viewstateのをカスタマイズする
Contactテーブルに基本的なGenericListを実行し、Viewstateに特定名をセットするために、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericList">
<argument name="object" value="Contact" />
<argument name="queryName" value="aListOfContacts" />
</message>
ビューで次のコードを実行することによって、レコードを<cfdump>できます:
<cfdump var="#viewstate.getValue("aListOfContacts") />
■フィルターを適用する
Contactテーブルに基本的なGenericListを実行し、ViewstateのFirstname値でフィルタリングするために、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericList">
<argument name="object" value="Contact" />
<argument name="criteria" value="Firstname" />
</message>
イベントハンドラ名を"contact.list"として、以下のURLでこのイベントハンドラーを呼び出すと、'firstname'が'Fred'であるSELECT結果を得るでしょう。
index.cfm?event=contact.list&firstname=Fred
■ソート
Lastnameを昇順でソートされたContactテーブルの基本的なGenericListを実行するには、次のように<message>タグを<event-handler>タグに追加します:
<message name="modelglue.GenericList">
<argument name="object" value="Contact" />
<argument name="orderBy" value="Lastname" />
</message>
降順にするには、次の引数を追加します:
<argument name="ascending" value="false" />
ビューで次のコードを実行することによって、クエリー結果を<cfdump>できます:
<cfdump var="#viewstate.getValue("ContactQuery") />
今日は、ジェネリック・データベース・メッセージ(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
今回は、ジェネリック・データベース・メッセージ(GDM)の使用方法について、紹介します。(原文タイトル:How To Use Generic Database Messages)
Model-Glue:Unityの最も無視できない特徴の1つは、自動化されたデータベース能力です。Reactorフレームワークを使用することによって、Model-Glue:Unityは、一般的なデータベースタスクの創造-単一テーブルCRUD(Create、read、update、delete)と実行を自動化します。
Reactorフレームワークは、"Generic Database Messages" (GDMs)をリスンするコントローラ("DataController")を自動的にロードすることによって、このことを達成します。GDMsは、ModelGlue.xmlの中で自動的に呼び出し可能なコマンドセットです。
また、GDMsは、<scaffold>タグを通して作成されるイベントハンドラに対するすべてのデータ・アクセス機能を提供します。
DataControllerがリスンするように構成されている4つのGDMsは、以下の通りです:
1.modelglue.GenericList
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルからレコードをリストアップしようとします。2.modelglue.GenericRead
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルから特定レコードの読み出しようとします。3.modelglue.GenericCommit
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルにレコードを保存しようとします。4.modelglue.GenericDelete
このメッセージがブロードキャストされると、DataControllerは与えられたテーブルからレコードを削除しようとします。
今日から数回に分けて、Model-Glue:Unity(MG2:Unity)のマニュアルのうち、Ver1.1から大きく変更・追加されたところを紹介していきます。
第一回目は、ColdSpring.xmlを利用したカスタムコンフィグレーション方法についてです。
(原文タイトル:How To Add Custom Configuration)
メールサーバの情報を、Coldspring.xmlにbean定義し、メッセージリスナー内でこれを呼び出す方法を紹介しています。
アプリケーションでは、しばしばデータソース名かメールサーバなどの何らかの構成情報を知る必要があります。 例として、アプリケーションで<cfmail>タグを使用する必要があり、ファイル中にサーバ名、ユーザ名およびパスワードを、ソースコードの外部に保存する場合を仮定しましょう。このことは、とても良い習慣です。
(1.xからのアップグレードでない)どのModel-Glue: Unityアプリケーションには、全てのアプリケーション構成情報を集中管理するためのColdSpring.xmlがあります。
このColdsping.xmlファイルは、数組の<bean>タグで構成されています。 各々のbeanは、Model-Glueアプリケーション内で問い合わせ可能なCFCを表しています。
Model-Glue:Unityには、一般的な構成の雑事に適したbean(ModelGlue.Bean.CommonBeans.SimpleConfig)があります。そのbeanは、setConfig()ファンクションを通して構造体をセット可能な単一プロパティ(のコンフィグ)を持っています。 この構造は、アプリケーション構成情報を「登録」するのに役立ちます。beanのgetConfigSetting()ファンクションに検索するプロパティ名を与えることによって、各々の設定値にアクセスできます。
これをメールサーバのシナリオに適用するために、ColdSpring.xmlに以下を加えます:
<bean id="mailConfiguration" class="ModelGlue.Bean.CommonBeans.SimpleConfig">
<property name="config">
<!-- In Coldspring, a "map" represents a struct -->
<map>
<entry key="mailserver">
<value>mail.mydomain.com</value>
</entry>
<entry key="username">
<value>smtpUsername</value>
</entry>
<entry key="password">
<value>smtpPassword</value>
</entry>
</map>
</property>
</bean>このXMLベースの構成情報をColdSpring.xmlに追加した後に、この構成設定を使用するのは簡単です。以下に、<cfmail>タグで構成設定を使用する例のリスナー機能を示します:
<cffunction name="sendEmail" access="public" returnType="void" output="false">
<cfargument name="event" type="any"><cfset var message = arguments.event.getValue("message") />
<cfset var subj = arguments.event.getValue("subj") />
<cfset var to = arguments.event.getValue("to") /><!--- Get mail configuration --->
<cfset var mailCfg = getModelGlue().getBean("mailConfiguration") /><!--- Use the mail configuration to send mail --->
<cfmail
to="#to#"
subject="#subject#"
server="#mailCfg.getConfigSetting("mailserver")#"
username="#mailCfg.getConfigSetting("username")#"
password="#mailCfg.getConfigSetting("password")#"
>
#message#
</cfmail></cffunction>
最近のコメント