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件目を返すという対応で良い気がした。うん。