SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「Dojo道場」~実用アプリ構築のためのベストプラクティス

Dojo道場 ~ 第6回「Dijitウィジェットを利用したアプリケーション作成の基礎」

「Dojo道場」~実用アプリ構築のためのベストプラクティス

  • X ポスト
  • このエントリーをはてなブックマークに追加

Validation

 Webアプリケーションにの入力画面には、個数を入力するフィールドに数字以外の値が入力されていないか、指定した以外の文字列が使用されていないか、 というように、入力フォームの値が適切であるかをチェックする機能があります。この機能は、妥当性検査またはValidationと呼ばれます。

required属性

 サンプル・アプリケーションでは、会計処理手続きのユーザー情報の入力時に、dijit.form.ValidationTextBoxを使用して入力データのチェックをしています。 ValidationTextBoxウィジェットにはrequired属性があり、その値を"true"にすると、その入力フィールドは必須項目として扱われます。 会社名以外のフィールドは、必須項目として扱うため、それらのフィールドのrequired属性の値をtrueにしています。

リスト16. required属性の使用例
<tr>
  <td><label for="userName">氏名:</label></td>
  <td><div dojoType="dijit.form.ValidationTextBox" id="userName"
    required="true"></div></td>
</tr>
<tr>
  <td><label for="zipCode">郵便番号:</label></td>
  <td><div dojoType="dijit.form.ValidationTextBox" id="zipCode"
    required="true" regExp="\d{3}-\d{4}" maxLength="8"
    promptMessage="(例:100-1000)" invalidMessage=""
    style="width: 8em;"></div></td>
</tr>
...

 required属性がtrueのフィールドに値が指定されていないと、図4のようにフィールドの見た目が変わり、さらに必須項目が未入力であることを伝えるツール・チップが表示されます。

図4 ツール・チップ
図4 ツール・チップ

regExp属性

 dijit.form.ValidationTextは、正規表現を用いて制約を指定することもできます。 サンプル・アプリケーション内の電話番号やクレジットカードの番号の入力フォームでは、正規表現で特定の文字が正しいフォーマットで入力されているかを確認しています。 正規表現は、reqExp属性を使って指定します。 例えば、16桁のクレジットカード番号を4桁ずつ"-"(ハイフン)区切りで入力させたい場合は、リスト17のようにregExp属性の値を指定します。

リスト17. regExp属性の使用例
<td><div dojoType="dijit.form.ValidationTextBox" id="cardNo"
	required="true" regExp="\d{4}-\d{4}-\d{4}-\d{4}" maxLength="19"
	promptMessage="(例:1234-5678-9012-3456)" invalidMessage=""
	style="width: 19em;"></div>
</td>

promptMessage属性とinvalidMessage属性

 リスト17では、promptMessage属性とinvalidMessage属性を指定しています。 promptMessageはフィールドがフォーカスされたときに表示されるツール・チップのメッセージです。 何も指定しない場合はDojoが提供しているデフォルトのメッセージが表示されます。 invalidMessage属性は、Validationでエラーが起きたときに表示されるメッセージです。 invalidMessage属性をブランクにすると、promptMessageの値がinvalidMessageとして使われます。 図5は電話番号のpromptMessageです。

図5 promptMessage
図5 promptMessage

isValidメソッド

 各フィールドの妥当性はdijit.form.ValidationTextBoxのisValidメソッドを呼ぶことで確認できます。 リスト18は、「OK」ボタンが押されたときのイベント・ハンドラーです。必須フィールドのisVaidメソッドがtrueを返さないときは、エラー・ダイアログを表示します。 会計画面に存在する7つ全ての必須フィールドのisValidメソッドがtrueを返すときのみ購入手続き完了処理を行っています。

リスト18. doSubmitイベント・ハンドラー
doSubmit: function() {
  var errorField = null;
  if(!dijit.byId("userName").isValid()) {
    errorField = dijit.byId("userName");
  } else if(!dijit.byId("zipCode").isValid()) {
    errorField = dijit.byId("zipCode");
  } else if(!dijit.byId("userAddress").isValid()) {
    errorField = dijit.byId("userAddress");
  } else if(!dijit.byId("phoneNumber").isValid()) {
    errorField = dijit.byId("phoneNumber");
  } else if(!dijit.byId("cardNo").isValid()) {
    errorField = dijit.byId("cardNo");
  } else if(!dijit.byId("cardOwner").isValid()) {
    errorField = dijit.byId("cardOwner");
  } else if(!dijit.byId("validPeriod").isValid()) {
    errorField = dijit.byId("validPeriod");
  }
  
  if(errorField) {
    errorField.focus();
    sampleApp.showSimpleDlg("入力値が正しくありません。", "入力エラー");
  } else {
    sampleApp.cart.clearAllList();
    dijit.byId("submitDlg").hide();
    sampleApp.showSimpleDlg("購入手続きが完了しました。", "確認");
  }
},

入力フォームの構成方法

 サンプル・アプリケーションではValidation機能の紹介のため、電話番号やクレジット・カード番号および有効期限のValidationに正規表現を使用し、 またpromptMessageを利用して入力フォーマットをユーザーに通知しています。 複雑な正規表現で入力値を制限するような場合は、入力フィールドを分割することで個々の制約を簡略化することを検討してください。 例えば、郵便番号、カード番号、有効期限を図6のようなフィールドで入力させることもできます。

図6 入力フォームを分割した例
図6 入力フォームを分割した例

 上記の例では、各入力フィールドのValidationは数字以外の入力の検出のみでOKです。 ただし、入力フィールドを分割することで、サーバーへ送信するデータの数やフォーマットが、分割する前とは異なる点に注意してください。 サーバー側で受け入れるデータのフォーマットを変換するか、 クライアント側で先のデータ・フォーマットと同じデータ・フォーマットに変換する必要があります。

その他の便利なウィジェット

  Dojoには他にも様々なフォーム・ウィジェットが用意されています。 dijit.form.NumberSpinnerは数字を入力させるのに便利なフォーム・ウィジェットです。 スピン・コントロールを利用して入力値を変更することができます。 サンプル・アプリケーションでは、購入数の指定にこのウィジェットを使用しています。

リスト19. NumberSpinnerの使用例
<label for="numOfProduct">数量:<label>
<div dojoType="dijit.form.NumberSpinner" id="numOfProduct"
  constraints="{max:10,min:1}"
  style="width:50px;"></div>
図7 NumberSpinnerの実行結果
図7 NumberSpinnerの実行結果

 NumberSpinnerを使えば、入力値に数字以外のものを指定するとinvalidErrorが表示されます。 また、constraints属性で最大値や最小値を指定することもできます。

 その他のValidation機能の使用例については、こちらを参照してください。

 図8および図9は、サンプル・アプリケーションの実行画面です。

図8 実行結果(商品選択画面)
図8 実行結果(商品選択画面)
図9 実行結果(カート画面)
図9 実行結果(カート画面)

まとめ

 今回はウィジェット利用の基礎編としてテーマ、ウィジェットの配置からイベント処理までに必要な項目と、サンプルのオンライン・ブックストアを通じて実際の利用例をおさらいしました。Dijitの基本的なウィジェットを利用することでさまざまなアプリケーションを作成することができます。

 さらに複雑なウェブ・アプリケーションを作るには標準のDijitウィジェットを利用するだけでは難しいと感じるかもしれません。次回以降では高度なトピックとして、ウィジェットの自作を含むウィジェット・システムの高度な話題、レイアウト・ウィジェットの詳細などが続きます。ご期待ください。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
「Dojo道場」~実用アプリ構築のためのベストプラクティス連載記事一覧

もっと読む

この記事の著者

仁田 圭祐(ニッタ ケイスケ)

日本アイ・ビー・エム株式会社ソフトウェア開発研究所にて日々Webアプリケーションに関わる製品開発をしています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

三浦 圭司(ミウラ ケイジ)

日本アイ・ビー・エム株式会社ソフトウェア開発研究所に勤務。現在は、エンタープライズ向け製品のWebアプリケーションのユーザー・インターフェース開発に従事。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5835 2011/04/06 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング