この演習では、サーバーサイド検証とクライアントサイド検証を比較します。そして "testedit.cfm" ページを編集して、クライアントサイドのスクリプトを使用します。
サーバーサイドのデータの検証には 2 つの欠点があります。まず、検証にアクションページが使用されるので、エラーが見つかった時点で、フォームページはブラウザのコンテキストに含まれません。したがって、ユーザーはデータを入力したページからすぐにフィードバックを受け取ることができません。もう 1 つは、データがクライアントで取得され、サーバーで検証されるので、サーバーへのアクセス回数が増加します。このため、ネットワークとサーバーのトラフィックが増加します。データがクライアントで検証される場合、有効なデータのみがサーバーに送信されるので、トラフィックが減少します。
サーバーサイドの編集に代わる方法は、クライアントサイドのスクリプトを使用することです。クライアントサイドのスクリプトを使用すると、入力されたフォームデータをクライアント上で、サーバーに送信する前に検証できます。CFML は、クライアントサイドのデータ検証の利点を備えた標準 HTML フォームタグの代替バージョンを提供します。これらのデータ入力タグには、cfinput text、cfinput radio、cfinput checkbox、cfselect などがあります。詳細については、『ColdFusion MX 開発ガイド』のデータの検証を参照してください。
ColdFusion フォームタグには、次の属性が存在します。
| 属性 | 説明 |
|---|---|
|
validate |
フィールドタグが照合するデータタイプ。値には、integer、date、time、telephone、zipcode があります。 |
|
message |
検証が失敗した場合に表示されるエラーメッセージ |
|
range |
このタグに許可される値の範囲 |
|
required |
対応するタグにデータが必要かどうかを示すインジケータ |
改善されたフォームタグを使用するには、HTML フォームタグを cfform タグで置き換えます。次のコードで、改善された ColdFusion フォームタグを説明します。最初の抜粋は、継続時間フィールドがサーバーでどのように検証されるかを示します。2 番めの抜粋は、ColdFusion フォームタグが、クライアント上でのフィールド検証をどのようにして簡素化しているのかを示します。
次に、サーバー上のコード (tripedit.cfm ページ) を示します。
<!--- 人数は必須であり、数値を指定する必要があります。 ---> <cfif Form.numberPeople EQ "" or IsNumeric(Form.numberPeople) EQ False> <cfset IsOk = "No"> <cfoutput>The number of people must be a number and cannot be blank. </cfoutput> </cfif>
| コード | 説明 |
|---|---|
<cfif Form.numberPeople EQ "" or |
|
次に、クライアント上のコード (tripedit.cfm ページ) を示します。
<cfinput name="duration" message="Duration must be a number and cannot be blank."
validate="integer" required="Yes" size="3" maxlength="3">
| コード | 説明 |
|---|---|
<cfinput name="duration" |
|
この演習では、ColdFusion フォームタグを使って多数のビジネスルールの検証をサーバーからクライアントに移動します。この操作を行うためには、"tripedit.cfm" ページの HTML フォームタグを、クライアントサイドでフィールドを検証する ColdFusion フォームタグに変更します。次に、"tripeditaction.cfm" ページから不要なサーバーサイドのシングルフィールド検証コードを削除します。最後にフォームをテストして、クライアントサイドの検証が正常に機能していることを確認します。
<form> タグと </form> タグを検索して、それぞれを <cfform> タグと </cfform> タグに変更します。
<input> タグを <cfinput> タグに、<select> タグを <cfselect> タグに、<textarea> タグを <cftextarea> タグにそれぞれ変更します。
メモ: 送信ボタンの入力タイプは cfinput ではなく、標準の入力のままにする必要があります。
cfinput と cfselect) に対して、次に示す適切な値を割り当てます。
| 属性値 | 説明 |
|---|---|
|
required |
入力または選択が必要なフィールドにはこの属性を使用します。 |
|
validate |
検証に特殊なデータタイプを必要とするフィールドに、この属性を使用します。値には、integer、date、time、telephone、および zip code があります。 |
|
message |
検証に失敗した場合にエラーメッセージを必要とするフィールドに、この属性を使用します。メッセージはビジネスルールを説明するテキストを反映します。 |
次の表に、編集されたコードブロックを示します。
| ルール | 説明 | 検証コード |
|---|---|---|
|
1 |
すべての旅行には名前が必要です。 |
<cfinput name= "tripName" maxlength = "50" size = "50" required = "Yes" message = "Trip name must not be blank"> |
|
2 |
すべての旅行には詳細な説明が必要です。 |
<cftextarea name="tripDescription" required="Yes" message="Trip description must not be blank."> </cftextarea> |
|
3 |
旅行はイベントタイプで分類する必要があります。有効なイベントタイプ (1-surfing、2-mountain climbing など) のみを許可します。 |
<cfselect size="1" name="eventType"
required="Yes"
message="Type of event must be selected.">
<option value="1" selected>Surfing</option>
<option value="2">Mountain Climbing</option>
<option value="3">Mountain Biking</option>
</cfselect>
|
|
4 |
旅行先は必須です。 |
<cfinput size="50" name="tripLocation" required="Yes" message="Trip location must not be blank."> |
|
5 |
旅行に参加できる定員を指定する必要があります。 |
<cfinput name="numberPeople" size="6" required="Yes" validate="integer" message="The number of people field must be a number and cannot be blank."> |
|
6 |
旅行ごとに出発日と帰着日を指定する必要があります。 すべての旅行日は、入力日以降の有効な日付でなければなりません。出発日は帰着日よりも以前の日付でなければなりません。 |
<cfinput name="departureDate" size="10" required="Yes" validate="date" message="Departure date must be a valid date."> <cfinput name="returnDate" size="10" required="Yes" validate="date" message="Return date must be a valid date."> |
|
7 |
旅行代金とベースコストは必須です。値は両方とも正の数値です。旅行代金には少なくともベースコストの最低 20% の利掛けを加算する必要があります。 |
<cfinput name="price" size="10" required="Yes" validate="integer" message="Price is required and must be numeric."> <cfinput name="baseCost" size="10" required="Yes" validate="integer" message="Base cost is required and must be numeric."> |
|
8 |
旅行費用が $750 を越える場合は前払いが必要です。 |
<cfinput name="depositRequired" type="checkbox" value="Yes" > |
|
9 |
旅行リーダーを指定する必要があります。 |
<cfinput name="tripLeader" maxlength="50" size="50" required="Yes" message="A trip leader must be specified."> |
|
10 |
すべての新規旅行にはフォトが必要です。 |
<cfinput name="photo" maxlength="50" size="50" required="Yes" message="Valid photo file name must be specified."> |
ヒント: 詳しい説明については、solutions ディレクトリ内の "ttripedit_lesson7_ex5.cfm" ファイルの完成コードを参照してください。ColdFusion フォームタグと属性の詳細については、『ColdFusion MX 開発ガイド』を参照してください。
メモ: "tripedit.cfm" ページに追加したクライアントサイド検証コードは、クロスフィールドルールの検証を実行しません。
修正された "tripeditaction.cfm" ページは次のように表示されます。
<cfset isOk = "Yes">
<cfif not isdefined("Form.depositRequired")>
<cfset form.depositRequired = "No">
</cfif>
<cfif Form.price GT 750 AND Form.depositRequired EQ "No">
<cfset IsOk = "No">
<cfoutput>Deposit is required for trips priced over $750.</cfoutput>
</cfif>
<cfif Form.basecost * 1.2 GT #Form.price#>
<cfset IsOk = "No">
<cfoutput>Price must be marked up at least 20% above cost.</cfoutput>
</cfif>
<cfif form.departureDate GT form.returnDate>
<cfset isOk = "No">
<cfoutput>Return date cannot precede departure date.Please re-enter.</cfoutput>
</cfif><html>
<head>
<title>Trip Maintenance Confirmation</title>
</head>
<body>
<cfif isOk EQ "Yes">
<h1>Trip Added</h1>
<cfoutput>You have added #Form.TripName# to the trips database.
</cfoutput>
</cfif>
</body>
</html>
推奨するテスト方法 :
ColdFusion MX 7 | ColdFusion MX 6.1 | ColdFusion MX* | ColdFusion 5* | フォーラム* | デベロッパーセンター | サポート情報 | バグ報告
バージョン7
このページに新しいコメントが追加された場合に、電子メールでの通知を希望する。 | コメントレポート
現在のページ: http://livedocs.adobe.com/coldfusion/7_jp/htmldocs/bus_rul8.htm