クライアントバリデータを自作するには
今回から数回かけてSAStrutsのvalidatorの話をしようかなと。
まあ、あまり需要がないネタかなと思いますが。
基本的に自分用のメモと言うことで。
一番最初はSAStrutsでクライアントバリデータを自作する機会があったので
そのことについて忘れないようにメモ。
まあ、ソースを追っていけばいいだけですがね。
まず、クライアントバリデータのソースを見ておきます。
クライアントバリデータのソースはcommons-validate-XXX.jarの中にあります。
validateRequired.jsを今回はピックアップします。(でも実は結構ソースがややこしい・・・)
クライアントバリデータは二つのメソッドがセットになります。
その二つとはこれ。
function loginActionForm_login_required(){ this.a0 = new Array("user","ユーザは必須です。",new Function("varName","〜")); } function validateRequired(form) { }
上のActionFormが入っている部分がフレームワークの方で生成するバリデータを実行する関数。
下が実際のバリデータメソッドになります。
では、validateRequired.jsを大事な部分だけつまみ食いしていきましょう。
まず、変数宣言の後に次の処理が来ます。
oRequired = eval('new ' + retrieveFormName(form) + '_required()');
_requiredはvalidator-rules.xmlでvalidator設定した時のname属性で指定した値になります。
jsFunctionNameで指定してもOKです。
さて、何かしら知りませんがevalした値がoRequired[x][y]が出てきました。
ここでoRequired[x][y]が何が格納されているか理解するのが
クライアントバリデータを作る上で一番の肝になります。
ここでのoRequired[x][y]には function loginActionForm_login_required()でセットした
new Arrayの中身が配列の形で入っています。
すなわち
oRequired[0][0] = "user"、
oRequired[0][1] = "ユーザは必須です。"
oRequired[0][2] = new Function(〜)
となります。
次のfor文でoRequired[0]、oRequired[1]、oRequired[2]・・・
と一個一個見ていきます。
そのすぐ下にある次の一文、
var field = form[oRequired[x][0]];
これによりformの"user"すなわち対象の入力ボックスを取得するわけです。
ここまでくればしめたもの。
filed.typeで対象の入力ボックスがテキストなのかプルダウンなのか、
それとも別のものなのか調べることが出来ますし、
filed.valueで入力されている値を取得出来ます。
ですので、これ以上は好き勝手やれるわけです。
標準のクライアントバリデータでは、
必須チェックなら必須チェックでまとめてエラーメッセージを表示します。
ですので、エラーが発生した場合、
メソッド始めで定義しているfiledsにエラーメッセージ格納しを、
isValidをfalseにすることでエラーが発生したというフラグを立てています。
エラーメッセージはoRequired[x][1]なので、これをfiledsに代入しているわけです。
最後はfieldsが1以上の場合はメッセージを全部つなげてalertしているわけです。
以上、簡単にソースを解読してみましたので、
これにあわせて処理を書けば自作のクライアントバリデータを作ることが出来ます。
基本的にfor (x in oRequired)まではそのままで、
for文の中を変える感じでしょうか。値の取得は上に書いたのでそれを参考にすればいいかと思います。