ExtJS入門38 独自のVTypeを定義してフォームを検証する
今回はフォームのVTypeに独自のバリデーションを設定して、フォームの検証を行うサンプルです。
フォーム関連の過去の記事はこちらからです。
- ExtJS入門 ExtJSのフォームについて(基本編)
- ExtJS入門32 フォームパネルとフィールド(基本編)
- ExtJS入門33 Columnレイアウトのフォー
- ExtJS入門34 ComboBoxの基本
- ExtJS入門35 Tableレイアウトのフォーム
- ExtJS入門37 サーバーサイドで処理したフォームのエラーメッセージを表示するム
リファレンスはこちらから
ExtJS -3.0 日本語APIドキュメント – Ext.form.VTypesクラス
http://extdocs.xenophy.com/?class=Ext.form.VTypes
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ExtJS名古屋勉強会 フォーム カスタムのVTypeの作成</title>
<!--Ext JS CSS-->
<link rel="stylesheet" href="../js/ext/resources/css/ext-all.css" type="text/css" />
<!--Ext JS-->
<script type="text/javascript" src="../js/ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../js/ext/ext-all.js"></script>
<script type="text/javascript" src="../js/ext/src/locale/ext-lang-ja.js"></script>
<script type="text/javascript" src="form-vtype.js"></script>
<style TYPE="text/css">
<!--
.tick {background-image: url(../img/icon/tick.png) !important;}
-->
</style>
</head>
<body>
<div style="width:500px;margin:0 auto;padding:15px;background-color:#D3E1F1;font-size:small;">
<p style="font-weight:bold;padding:3px;margin-bottom:10px;">
Extのフォーム カスタムVTypeの作成してフォームを検証します。
</p>
<div id="form"></div>
<br/>
Java Script:<a href="form-vtype.js">form-vtype.js</a><br/>
</div>
</body>
</html>
Java Script:
Ext.onReady(function()
{
Ext.apply(Ext.form.VTypes,{
//EXTという文字以外を入力させないルール
onlyEXT:function(val){
var pattern = /[^EXT]/g;
return !pattern.test(val);
},
onlyEXTText:'EXTしか入力できません。大文字と小文字を区別します。',
onlyEXTMask:/[EXT]/,
//自分で設定した日付形式でチェックする場合
mydate:function(val) {
var dt = Date.parseDate(val,'Y:m:d',true);
return dt ? val : false;
},
mydateText:'日付の形式が間違っています。2010:01:01の形式で入力してください。',
mydateMask:/[0-9:]/
});
var form = new Ext.form.FormPanel({
renderTo:'form',
title:'カスタムのVTypeを使ったフォーム',
height:280,
width:500,
bodyStyle:{
padding:'8px'
},
footerStyle:{ //ボタン周りの表示の調整用スタイル
border:'solid 1px #99BBE8',
'border-top':'none'
},
labelWidth:180,
monitorValid:true, //定期的に妥当性のチェックを行いボタンを連動させます。ボタン側でformBindを設定する
defaults:{
xtype:'textfield',
anchor:'90%',
msgTarget:'under'
},
items:[
{
name:'normal',
fieldLabel:'チェックなしフィールド',
emptyText:'チェックなし'
},
{
name:'email',
fieldLabel:'Emailフィールド',
emptyText:'Email入力してください',
vtype:'email' //vtypeコンフィグでバリデーションが設定 emailはデフォルトであるvtype
},
{
name:'onlyabc',
fieldLabel:'onlyEXTフィールド',
emptyText:'EXTのみ入力可',
vtype:'onlyEXT'
},
{
name:'mydatefield',
fieldLabel:'mydateフィールド',
emptyText:'日付を入力', //空のときのテキスト
anchor:'90%',
vtype:'mydate'
},
],
buttonAlign:'center',
buttons:[
{
text:'決定',
formBind:true,
iconCls:'tick',
handler:function(){
//値の取り出し
//フォームパネルからフィールドを取得
var formFields = form.getForm();
//フィールドから値を取得
var formValues = formFields.getValues();
//入力項目を表示する処理(普通は値をポストしますが、今回はフィールド名と値を表示する)
var data = [];
Ext.iterate(formValues,function(key,val,arr){
data.push({
fieldname:key,
formvalue:val
});
});
var tpl = new Ext.XTemplate(
'<tpl for=".">',
'<p>{fieldname}:{formvalue}</p>',
'</tpl>'
);
//表示処理
Ext.Msg.show({
title:'フォームの値を取得',
msg:tpl.apply(data),
width:300,
buttons:Ext.Msg.OK
});
}
}
]
});
});
実行結果:
ExtJSでは予め、いくつかのVtypeが用意されています。
- alpha:アルファベット
- alphanum:アルファベットと数字
- email:E-mailアドレス
- url:URL
これをフォームフィールドのvtypeコンフィグに設定することでフィールドのvalidateが実行されたときに、検証方法を指定できます。
使用例は以下のような形です。vtypeを文字列で指定します。
//emailを設定する場合
new Ext.form.Textfield({
name:'email',
fieldLabel:'Emailフィールド',
emptyText:'Email入力してください',
vtype:'email' //vtypeコンフィグでバリデーションが設定 emailはデフォルトであるvtype
}),
さて今回の本題ですが、VTypeに独自の検証法を定義する方法です。今回のサンプルでは2種類の独自VTypeを定義して使っています。
一つはE、X、T、の3文字のうちどれかしか入力できないフィールド。もう一つは独自の日付チェックを設定しています。
ExtJSのVTypeはExt.form.VTypesクラスというシングルトンクラスで管理されています。独自で作成したvtypeもここに登録しなければいけません。
登録方法はExt.form.VTypesクラスをオーバーライドすることで登録します。ExtJSのクラスのオーバーライドではExt.apply()を使ってExtJSで2つのオブジェクトをマージする方法があります。
Ext.apply()メソッドは引数を2つもち、第一引数側に第二引数のオブジェクトを追記します。
Ext.apply(targetObj,{srcObj});
仮にtargetObjとsrcObjに同じプロパティが設定されいる場合は、srcObj側のプロパティに上書きされます。またマージする方向を逆にしたExt.applyIf()というメソッドも用意されています。
今回の場合
Ext.apply(Ext.form.VTypes,{
//EXTという文字以外を入力させないルール
onlyEXT:function(val){
var pattern = /[^EXT]/g;
return !pattern.test(val);
},
onlyEXTText:'EXTしか入力できません。大文字と小文字を区別します。',
onlyEXTMask:/[EXT]/,
・・・
});
[/code]
というようにExt.form.VTypesにオブジェクトを追加しています。Ext.form.VTypesクラスに登録を行うと各フィールドのコンフィグで独自のvtypeを読み出すことができます。
では実際のvtypeの記述方法です。まずEXTしか入力できないルールを作成します 。
独自のvtypeのためには3つのプロパティを設定できます。
- vtype名:実際の検証処理関数。falseを返すとInvalidになる。またこの関数名がフィールドのvtypeコンフィグから呼び出す名前になる。
- vtype名Text:このルールで検証結果がInvalidの場合に表示されるエラーメッセージ
- vtype名Mask:このvtypeが設定されているフィールドへの入力を制限する。正規表現でしてい
オブジェクトとしては以下のように記述して、Ext.form.VTypesに追加します。
Ext.apply(Ext.form.VTypes,
{
//EXTという文字以外を入力させないルール
onlyEXT:function(val){
var pattern = /[^EXT]/g;
return !pattern.test(val);
},
onlyEXTText:'EXTしか入力できません。大文字と小文字を区別します。',
onlyEXTMask:/[EXT]/,
}
);
[/code]
VTypeを登録したら、使いたいフィールドで
vtype:'onlyEXT'
を設定します。
vtype:onlyExtのフィールドではEXTの3文字のうちどれかしか入力できません。onlyEXTMaskで設定した入力制限が効いているためです。しかし日本語環境では日本語が入力できてしまいます。入力があるとonlyEXTに設定した検証関数で検証されます。ここでEXT以外の文字列があった場合はfalseを返すようにしています。検証関数からfalseが返るとfieldはInvalidになりエラーメッセージを表示します。ここにはonlyEXTTextで設定したエラーメッセージが表示されることになります。
これで指定した文字以外の入力を制限します。
次に独自の日付フォーマットをチェックするVTypeの例です。VTypeの設定は以下のようになります。
Ext.apply(Ext.form.VTypes,
{
//自分で設定した日付形式でチェックする場合
mydate:function(val) {
var dt = Date.parseDate(val,'Y:m:d',true);
return dt ? val : false;
},
mydateText:'日付の形式が間違っています。2010:01:01の形式で入力してください。',
mydateMask:/[0-9:]/
}
);
このVTypeではmydate関数内でDate.parseDate()で独自の日付形式でDateオブジェクトの生成を行っています。valにパースできない文字列が入ってきたばあいはdtにはundefinedが返されます。
parseDate()メソッドは賢く例えば5/32を指定した場合は、自動的に6/1にしてくれます。しかし現実的に5/32とは入力された場合は5/31の入力間違いの可能性が高いので、エラーにして欲しいと思います。その場合はparseDate
()メソッドの第三引数にbooleanで厳密な日付のチェックを行うか指定できます。ここがtrueの場合は5/32といった実際にはない日付はエラーになります。
今回はVTypesに独自のVtypeを追加する方法を紹介しました。フォームの検証はサーバーサイドでも行う必要がありますが、クライアントサイドのUIで処理することで、わざわざ情報をポストすることがないので高速に実行できます。前回紹介したサーバーからエラーメッセージを表示する方法と一緒に利用することで、ユーザビリティのよいフォームパネルが作成できます。



