CGI-FormBuilder
view release on metacpan or search on metacpan
lib/CGI/FormBuilder/Field.pm view on Meta::CPAN
###########################################################################
# Copyright (c) Nate Wiger http://nateware.com. All Rights Reserved.
# Please visit http://formbuilder.org for tutorials, support, and examples.
###########################################################################
package CGI::FormBuilder::Field;
=head1 NAME
CGI::FormBuilder::Field - Base class for FormBuilder fields
=head1 SYNOPSIS
use CGI::FormBuilder::Field;
# delegated straight from FormBuilder
my $f = CGI::FormBuilder::Field->new($form, name => 'whatever');
# attribute functions
my $n = $f->name; # name of field
my $n = "$f"; # stringify to $f->name
my $t = $f->type; # auto-type
my @v = $f->value; # auto-stickiness
my @o = $f->options; # options, aligned and sorted
my $l = $f->label; # auto-label
my $h = $f->tag; # field XHTML tag (name/type/value)
my $s = $f->script; # per-field JS validation script
my $m = $f->message; # error message if invalid
my $m = $f->jsmessage; # JavaScript error message
my $r = $f->required; # required?
my $k = $f->validate; # run validation check
my $v = $f->tag_value; # value in tag (stickiness handling)
my $v = $f->cgi_value; # CGI value if any
my $v = $f->def_value; # manually-specified value
$f->field(opt => 'val'); # FormBuilder field() call
=cut
use Carp; # confess used manually in this pkg
use strict;
use warnings;
no warnings 'uninitialized';
use CGI::FormBuilder::Util;
our $VERSION = '3.20';
our $AUTOLOAD;
# what to generate for tag
our @TAGATTR = qw(name type multiple jsclick);
# Catches for special validation patterns
# These are semi-Perl patterns; they must be usable by JavaScript
# as well so they do not take advantage of features JS can't use
# If the value is an arrayref, then the second arg is a tag to
# spit out at the person after the field label to help with format
our %VALIDATE = (
WORD => '/^\w+$/',
NAME => '/^[a-zA-Z]+$/',
NUM => '/^-?\s*[0-9]+\.?[0-9]*$|^-?\s*\.[0-9]+$/', # 1, 1.25, .25
INT => '/^-?\s*[0-9]+$/',
FLOAT => '/^-?\s*[0-9]+\.[0-9]+$/',
PHONE => '/^\d{3}\-\d{3}\-\d{4}$|^\(\d{3}\)\s+\d{3}\-\d{4}$/',
INTPHONE => '/^\+\d+[\s\-][\d\-\s]+$/',
EMAIL => '/^[\w\-\+\._]+\@[a-zA-Z0-9][-a-zA-Z0-9\.]*\.[a-zA-Z]+$/',
CARD => '/^\d{4}[\- ]?\d{4}[\- ]?\d{4}[\- ]?\d{4}$|^\d{4}[\- ]?\d{6}[\- ]?\d{5}$/',
MMYY => '/^(0?[1-9]|1[0-2])\/?[0-9]{2}$/',
MMYYYY => '/^(0?[1-9]|1[0-2])\/?[0-9]{4}$/',
DATE => '/^(0?[1-9]|1[0-2])\/?(0?[1-9]|[1-2][0-9]|3[0-1])\/?[0-9]{4}$/',
EUDATE => '/^(0?[1-9]|[1-2][0-9]|3[0-1])\/?(0?[1-9]|1[0-2])\/?[0-9]{4}$/',
TIME => '/^[0-9]{1,2}:[0-9]{2}$/',
AMPM => '/^[0-9]{1,2}:[0-9]{2}\s*([aA]|[pP])[mM]$/',
ZIPCODE => '/^\d{5}$|^\d{5}\-\d{4}$/',
STATE => '/^[a-zA-Z]{2}$/',
COUNTRY => '/^[a-zA-Z]{2}$/',
IPV4 => '/^([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])$/',
NETMASK => '/^([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])\.([0-1]??\d{1,2}|2[0-4]\d|25[0-5])$/',
FILE => '/^[\/\w\.\-_]+$/',
WINFILE => '/^[a-zA-Z]:\\[\\\w\s\.\-]+$/',
MACFILE => '/^[:\w\.\-_]+$/',
USER => '/^[-a-zA-Z0-9_]{4,8}$/',
lib/CGI/FormBuilder/Field.pm view on Meta::CPAN
allowing you to check for certain fields. However, since it is an object,
you can then run accessor methods directly on that object.
The most useful method is C<tag()>. It generates the HTML input tag
for the field, including all option and type handling, and returns a
string which you can then print out or manipulate appropriately.
Second to this method is the C<script> method, which returns the appropriate
JavaScript validation routine for that field. This is useful at the top of
your form rendering, when you are printing out the leading C<< <head> >> section
of your HTML document. It is called by the C<$form> method of the same name.
The following methods are provided for each C<$field> object.
=head1 METHODS
=head2 new($form, %args)
This creates a new C<$field> object. The first argument must be a reference
to the top-level C<$form> object, for callbacks. The remaining arguments
should be hash, of which one C<key/value> pair must specify the C<name> of
the field. Normally you should not touch this method. Ever.
=head2 field(%args)
This is a delegated field call. This is how B<FormBuilder> tweaks its fields.
Once you have a C<$field> object, you call this method the exact same way
that you would call the main C<field()> method, minus the field name. Again
you should use the top-level call instead.
=head2 inflate($subref)
This sets the inflate attribute: subroutine reference used to inflate values
returned by value() into objects or whatever you want. If no parameter,
returns the inflate subroutine reference that is set. For example:
use DateTime::Format::Strptime;
my $date_format = DateTime::Format::Strptime->new(
pattern => '%D', # for MM/DD/YYYY american dates
locale => 'en_US',
time_zone => 'America/Los_Angeles',
);
$field->inflate( sub { return $date_format->format_datetime(shift) } );
=head2 invalid
This returns the opposite value that C<validate()> would return, with
some extra magic that keeps state for form rendering purposes.
=head2 jsfunc()
Returns the appropriate JavaScript validation code (see above).
=head2 label($str)
This sets and returns the field's label. If unset, it will be generated
from the name of the field.
=head2 tag($type)
Returns an XHTML form input tag (see above). By default it renders the
tag based on the type set from the top-level field method:
$form->field(name => 'poetry', type => 'textarea');
However, if you are doing custom rendering you can override this temporarily
by passing in the type explicitly. This is usually not useful unless you
have a custom rendering module that forcibly overrides types for certain
fields.
=head2 type($type)
This sets and returns the field's type. If unset, it will automatically
generate the appropriate field type, depending on the number of options and
whether multiple values are allowed:
Field options?
No = text (done)
Yes:
Less than 'selectnum' setting?
No = select (done)
Yes:
Is the 'multiple' option set?
Yes = checkbox (done)
No:
Have just one single option?
Yes = checkbox (done)
No = radio (done)
For an example, view the inside guts of this module.
=head2 validate($pattern)
This returns 1 if the field passes the validation pattern(s) and C<required>
status previously set via required() and (possibly) the top-level new()
call in FormBuilder. Usually running per-field validate() calls is not
what you want. Instead, you want to run the one on C<$form>, which in
turn calls each individual field's and saves some temp state.
=head2 value($val)
This sets the field's value. It also returns the appropriate value: CGI if
set, otherwise the manual default value. Same as using C<field()> to
retrieve values.
=head2 tag_value()
This obeys the C<sticky> flag to give a different interpretation of CGI
values. B<Use this to get the value if generating your own tag.> Otherwise,
ignore it completely.
=head2 cgi_value()
This always returns the CGI value, regardless of C<sticky>.
=head2 def_value()
This always returns the default value, regardless of C<sticky>.
=head2 tag_name()
( run in 0.731 second using v1.01-cache-2.11-cpan-39bf76dae61 )