Data::FormValidator で複数の入力をチェックするパッチ
$c->form({ required_only_one => [qw/aaa bbb/], optional_only_one => [qw/ccc ddd/], });
個人的な仕様にしたんだけど、
<input type="text" name="aaa" > <input type="text" name="aaa" >
のように2つ来た場合、missing のエラーにする。
また、optionalが2つ来た場合
<input type="text" name="ccc" > <input type="text" name="ccc" >
エラーではなくて、消去するだけ。
Data-FormValidator-4.51用パッチ。
--- FormValidator.pm 2007-07-14 13:39:52.000000000 +0900 --- /home/foo/Data-FormValidator-4.51/lib/Data/FormValidator.pm 2007-07-14 12:32:54.000000000 +0900 @@ -923,6 +923,8 @@ optional optional_regexp require_some + optional_only_one + required_only_one required required_regexp untaint_all_constraints
--- Results.pm 2007-07-14 13:39:52.000000000 +0900 --- /home/foo/Data-FormValidator-4.51/lib/Data/FormValidator/Results.pm 2007-07-14 12:32:54.000000000 +0900 @@ -171,7 +171,13 @@ # store the filtered data away for later use $self->{__FILTERED_DATA} = \%valid; - + + push @{ $profile->{required} } , @{ $profile->{required_only_one} || [] } ; + my %required_only_one = map { $_ => 1 } _arrayify($profile->{required_only_one}); + + push @{ $profile->{optional} } , @{ $profile->{optional_only_one} || [] } ; + my %optional_only_one = map { $_ => 1 } _arrayify($profile->{optional_only_one}); + my %required = map { $_ => 1 } _arrayify($profile->{required}); my %optional = map { $_ => 1 } _arrayify($profile->{optional}); @@ -197,11 +203,15 @@ } } - # Remove all empty fields foreach my $field (keys %valid) { if (ref $valid{$field}) { if ( ref $valid{$field} eq 'ARRAY' ) { + if ( exists $required_only_one{$field} or exists $optional_only_one{$field} ) { + delete $valid{$field}; + next; + } + for (my $i = 0; $i < scalar @{ $valid{$field} }; $i++) { $valid{$field}->[$i] = undef unless (defined $valid{$field}->[$i] and length $valid{$field}->[$i] and $valid{$field}->[$i] !~ /^\x00$/); }
追記:
複数あるのに、missingはやはり気持ち悪いので、新しく変数を作って持たせようかとも考えましたが、複数だと1件目を返すという対応で良い気がした。うん。