logo       

Re: [FormBuilder] validate + commas in FB source files: msg#00014

Subject: Re: [FormBuilder] validate + commas in FB source files
        Hello Nate,

Nate Wiger wrote:
Looks like a good addition.

I hope not to be too confusing, I can provide a real patch if needed (I
am lazy today ;-) )

Please do. Provide a diff -u and also a couple tests, and I'll apply
it to the tree.

        Ok, here it is, in attachment.

        With it, I can use this kind of YAML config file (I use Catalyst):

        File '.../MyApp/root/forms/user/create.fb':

-----------------------------------------------------------
name: user_create
method: post
fields:
        login:
                label:    Login
                type:     text
                size:     40
                validate: /^.{4\,40}$/, /^\w*$/
                required: 1
                message:  Between 4 and 40 characters, Only alphanumeric 
characters
        disp_name:
                label:    Real name (public)
                type:     text
                size:     50
                validate: /^.{0\,50}$/, LNAME
                message:  Max 50 characters, Forbidden character(s)
        mail:
                label:    Real Email
                type:     text
                size:     80
                validate: EMAIL
                required: 1
                message:  Invalid Email
        disp_mail:
                label:    Displayed Email (public)
                type:     text
                size:     80
                validate: /^.{0\,80}$/
                message:  Max 80 characters
        home_page:
                label:    URL
                type:     text
                size:     100
                validate: /^.{0\,100}$/
                message:  Invalid URL
        pass:
                label:    Password
                type:     password
                size:     40
                validate: /^.{4\,40}$/
                required: 1
                message:  Between 4 and 40 characters
        pass2:
                label:    Password confirmation
                type:     password
                size:     40
                validate: /^.{4\,40}$/
                required: 1
                message:  Between 4 and 40 characters
submit: Create
reset:  Reset
-----------------------------------------------------------

Notice in "validate:" items the values separated by a comma. Also, the corresponding "messages:" are also separated by a comma.

Also notice the '\,' in the regexps, for which in the patch I remove the leading '\'.

I won't repeat the template I use to render this form as I provided it in my previous message. The only thing to know is that a new attribute, $fb->{array} indicates an array instead of a single value.

I'm looking for other predefined regexps, like URLs. I can build one myself but if I find one on the web / MLs, I'll also patch again the file Field.pm to include it. If you (or anyone) find a good one, please tell us.

I'm also looking for a good way to translate the 'submit' and 'reset' buttons. Any clue ?

Tell me if you need anything else. Unfortunately I've never built any Perl test suite, so I can't, for the moment, give you any. Sorry for this :-(

        Regards,
--
--      \^/                                            --
--    -/ O \---------------------------------------    --
--   | |/ \|      Alexandre (Midnite) Jousset      |   --
--    -|___|---------------------------------------    --
--- /root/.cpan/build/CGI-FormBuilder-3.0501/lib/CGI/FormBuilder/Field.pm       
2007-03-02 19:13:14.000000000 +0100
+++ /usr/local/share/perl/5.8.8/CGI/FormBuilder/Field.pm        2007-03-13 
12:31:21.000000000 +0100
@@ -620,7 +620,7 @@
     elsif (ref $pattern eq 'ARRAY') {
         # Must be w/i this set of values
         # Can you figure out how this piece of Perl works? No, seriously, I 
forgot.
-        $jsfunc .= qq[${in}if ($notnull ($jsfield != ']
+        $jsfunc .= qq[${in}if ($notnull ($jsfield != \']
                  . join("' && $jsfield != '", @{$pattern}) . "')) {\n";
     }
     elsif (ref $pattern eq 'CODE' || $pattern eq 'VALUE' || ($self->required 
&& ! $pattern)) {
@@ -676,7 +676,13 @@
     debug 1, "$self->{name}: called \$field->validate(@_) for field '$field'";
 
     # Check our hash to see if it's a special pattern
-    ($pattern) = autodata($VALIDATE{$pattern}) if $VALIDATE{$pattern};
+    if (ref $pattern eq 'ARRAY') {
+       $self->{array} = 1;
+       $VALIDATE{$_} && (($_) = autodata($VALIDATE{$_})) for @{$pattern};
+    } else {
+       $self->{array} = 0;
+       ($pattern) = autodata($VALIDATE{$pattern}) if $VALIDATE{$pattern};
+    }
 
     # Hashref is a grouping per-language
     if (ref $pattern eq 'HASH') {
@@ -685,6 +691,7 @@
 
     # Counter for fail or success
     my $bad = 0;
+    my @failed;
 
     # Loop thru, and if something isn't valid, we tag it
     my $atleastone = 0;
@@ -713,11 +720,27 @@
                 $thisfail = ++$bad;
             }
         } elsif (ref $pattern eq 'ARRAY') {
-            # must be w/i this set of values
-            debug 2, "$field: is '$value' in (@{$pattern}) ?";
-            unless (ismember($value, @{$pattern})) {
-                $thisfail = ++$bad;
-            }
+           my $cnt = 0;
+           foreach my $elem (@{$pattern}) {
+               if ($elem =~ m,^m(\S)(.*)\1$, || $elem =~ m,^(/)(.*)\1$,) {
+                   # it be a regexp, handle / escaping
+                   (my $tpat = $2) =~ s#\\/#/#g;
+                   $tpat =~ s#/#\\/#g;
+                   debug 2, "$field: does '$value' =~ /$tpat/ ?";
+                   unless ($value =~ /$tpat/) {
+                       $thisfail = ++$bad;
+                       push @failed, $cnt;
+                   }
+               } else {
+                   # must be w/i this set of values
+                   debug 2, "$field: is '$value' eq $elem ?";
+                   unless ($value eq $elem) {
+                       $thisfail = ++$bad;
+                       push @failed, $cnt;
+                   }
+               }
+               $cnt++;
+           }
         } elsif (ref $pattern eq 'CODE') {
             # eval that mofo, which gives them $form
             my $extra = $form->{c} || $form;
@@ -769,11 +792,13 @@
     if ($bad || (! $atleastone && $self->required)) {
         debug 1, "$field: validation FAILED";
         $self->{invalid} = $bad || 1;
+        $self->{failed} = \@failed;
         $self->{missing} = $atleastone;  
         return;
     } else {
         debug 1, "$field: validation passed";
         delete $self->{invalid};    # in case of previous run
+        delete $self->{failed};
         delete $self->{missing};    # ditto
         return 1;
     }
_______________________________________________
FBusers mailing list
FBusers@xxxxxxxxxxxxxxx
http://www.formbuilder.org/mailman/listinfo/fbusers
<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

Recently Viewed:
audio.irate.dev...    yellowdog.gener...    ietf.ips/2002-0...    xfree86.fonts/2...    busybox/2003-07...    emacs.jdee/2004...    linux.mandrake....    hardware.microc...    user-groups.lin...    science.analysi...    version-control...    db.filemaker.de...    cluster.openmos...    mail.eyebrowse....    text.xml.xerces...    kde.devel.kwrit...    finance.moneyda...    gcc.regression/...    network.routing...    os.freebsd.deve...    recreation.radi...    qnx.openqnx.dev...    python.xml/2002...   
Home | blog view | USPTO Patent Archive | advertise | OSDir is an inevitable website. super tiny logo

Free Magazines

Cisco News
Receive a free quarterly e-newsletter with exclusive articles on how Cisco IT uses its own products and solutions to enable the business.
subscribe

Systems Management News, the newspaper for IT systems administration and data center managers! Each issue of Systems Management News is chock-full of news and analysis to help you understand what's happening in your field.
subscribe

The Enterprise Newsweekly eWeek is the essential technology information source for builders of e-business.
subscribe

Oracle Magazine Oracle Magazine contains technology strategy articles, sample code, tips, Oracle and partner news, how to articles for developers and DBAs, and more. Oracle (NASDAQ: ORCL) is the world's largest enterprise software company.
subscribe

Total Telecom Total Telecom is "The Economist of the communications industry".
subscribe