クライアントバリデータを自作するには

今回から数回かけて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文の中を変える感じでしょうか。値の取得は上に書いたのでそれを参考にすればいいかと思います。