FormValidator::Simple で同名の複数パラメータを扱う
id:cooldaemon:20070301 で、FormValidator::Simple の Author id:lyokato 様にトラックバックを頂いたので、そのご返信。
Codin’ In The Free World - FormValidator::Simple multivalue fields
こういうのはどうかなーっていう案はあるんだけど。
COUNTっていう特殊Constraintを作って下記のように。my $result = $fvs->check( [ param1 => [ [COUNT, 1, 5], 'NOT_BLANK' ], # 1〜5個の値を持つ 0個や6個だった場合はアウト param2 => [ [COUNT, 1], 'INT' ], # 値は1つだけ param3 => [ 'NOT_BLANK', 'INT' ], # 省略した場合は [COUNT, 1] として扱う ]);
パラメータの数を管理する事には大賛成です!
ですが、[COUNT, N] を省略した際の処理は・・・[COUNT, 1] として扱わずに、最初のパラメータ値だけ判定するのが宜しいかと思います。
理由としては、CGI 制作者がパラメータとして「name=hoge」 が渡される事を想定しているが、実際は「name=hoge&name=fuga」が渡された場合、COUNT エラーとするか、「name=huga」だけ使うかは、CGI 制作者のポリシーの問題ではないかと思うからです。
(省略時は、"name" が "hoge" になるか、"huga" になるかは、どちらでも良いと CGI 制作者は割り切っていると仮定)
また、FormValidator::Simple 利用者は、[COUNT, N] 省略時であっても、COUNT エラーが発生する事に、気がつき難いのではないかと思います。(エラーメッセージは、"DEFAULT" でカバー可能ですが・・・不親切かなと)
現行バージョンは、下記のコードを書くと・・・
use strict; use warnings; use CGI; use FormValidator::Simple; $q = CGI->new; $q->param(param => 1); $q->append(param => 2); my $r = FormValidator::Simple->check($q => [param => ['INT'],]); if(!$r->has_error){ print 'OK', "?n"; exit; } for my $key ($r->error){ for my $type ($r->error($key)){ print "key = $key : type = $type?n"; } }
「key = param : type = INT」と出力されます。(ARRAY REF をチェックする為)
これを、OK と出力されるように修正するのが良いかなぁと。
ただ、私の提案差し上げている内容は「$q->append(param => 2);」を「$q->append(param => 'a');」に書き換えても、INT エラーが発生しないので、チェックされなかった値を、その後、何かで使用してしまったら問題がありますが・・・
とりあえず、plugin と言う形で何か書きながら考えてみます。
Codin’ In The Free World - FormValidator::Simple multivalue fields
HTML::WidgetやRailsのvalidation、JavaScriptでのクライアントサイドの
realtimevalidationを見ながら色々と考えることはあります。
話はそれますが、messages.yml や、Catalyst::Plugin::FormValidator::Simple::Auto の profiles.yml を、そのまま JavaScript 使えたら DRY で良いなぁと妄想してます。
JavaScript の Validation モジュールでは、下記を試した事があるのですが、毎回、似たようなルールを書くのが、辛いので orz
Mutationevent :: Validate.js :: javascript package to validate various data
Really easy field validation * Dexagogo
Realtime validation using Ajax
早く手を付けたいなぁ・・・。