view release on metacpan or search on metacpan
Subclassable Fields
Each field is now rendered by its own class, named for the field type.
For example, text fields are rendered by
"CGI::FormBuilder::Field::text". This allows you to create custom field
types and plugging them in by creating your own
"CGI::FormBuilder::Field::whatever_you_want" module. Thanks to Peter
Eichman for his contributions to this scheme.
Messages Localization
All messages are now handled in a similar way to field types: They are
delegated to "CGI::FormBuilder::Messages::locale" where "locale" is the
appropriate string such as "en_US" or "da_DK". A number of localizations
are included as part of the standard distribution.
There are two ways to use these messages: Either the 'auto' messages
mode or by specifying a specific locale:
my $form = CGI::FormBuilder->new(messages => 'auto'); # check client
my $form = CGI::FormBuilder->new(messages => ':da_DK'); # specified
You can create your own messages by copying "_example.pm" and modifying
it for your language. When using messages in this way, the HTTP Charset
is changed to "utf-8".
Select optgroup support
By using the "field()" option "optgroups", you can now cause select
lib/CGI/FormBuilder.pod view on Meta::CPAN
# Lesser-used options
action => $script, # not needed (loops back)
cookies => 0 | 1, # use cookies for sessionid?
debug => 0 | 1 | 2 | 3, # gunk into error_log?
fieldsubs => 0 | 1, # allow $form->$field()
javascript => 0 | 1 | 'auto', # generate JS validate() code?
keepextras => 0 | 1 | \@array, # keep non-field params?
params => $object, # instead of CGI.pm
sticky => 0 | 1, # keep CGI values "sticky"?
messages => $file | \%hash | $locale | 'auto',
template => $file | \%hash | $object, # custom HTML
# HTML formatting and JavaScript options
body => \%attr, # {background => 'black'}
disabled => 0 | 1, # display as grayed-out?
fieldsets => \@arrayref # split form into <fieldsets>
font => $font | \%attr, # 'arial,helvetica'
jsfunc => $jscode, # JS code into validate()
jshead => $jscode, # JS code into <head>
linebreaks => 0 | 1, # put breaks in form?
lib/CGI/FormBuilder.pod view on Meta::CPAN
an appropriate C<messages> module, which will set this for you.
See L<CGI::FormBuilder::Messages> for more details.
=item method => 'post' | 'get'
The type of CGI method to use, either C<post> or C<get>. Defaults
to C<get> if nothing is specified. Note that for forms that cause
changes on the server, such as database inserts, you should use
the C<post> method.
=item messages => 'auto' | $file | \%hash | $locale
This option overrides the default B<FormBuilder> messages in order to
provide multilingual locale support (or just different text for the picky ones).
For details on this option, please refer to L<CGI::FormBuilder::Messages>.
=item name => $string
This names the form. It is optional, but when used, it renames several
key variables and functions according to the name of the form. In addition,
it also adds the following C<< <div> >> tags to each row of the table:
<tr id="${form}_${field}_row">
<td id="${form}_${field}_label">Label</td>
lib/CGI/FormBuilder/Field.pm view on Meta::CPAN
=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()
lib/CGI/FormBuilder/Messages.pm view on Meta::CPAN
=head1 NAME
CGI::FormBuilder::Messages - Localized message support for FormBuilder
=head1 SYNOPSIS
use CGI::FormBuilder::Messages;
my $mesg = CGI::FormBuilder::Messages->new(
$file || \%hash || ':locale'
);
print $mesg->js_invalid_text;
=cut
use strict;
use warnings;
no warnings 'uninitialized';
lib/CGI/FormBuilder/Messages.pm view on Meta::CPAN
sub new {
my $self = shift;
my $class = ref($self) || $self;
my $src = shift;
debug 1, "creating Messages object from ", $src || '(default)';
my %hash;
if (my $ref = ref $src) {
# hashref, get values directly
puke "Argument to 'messages' option must be a \$file, \\\%hash, or ':locale'"
if $ref eq 'ARRAY' || $ref eq 'SCALAR';
# load defaults from English
# anonymize the %hash or we get fucked with refs later
require CGI::FormBuilder::Messages::default;
%hash = CGI::FormBuilder::Messages::default->messages;
while(my($k,$v) = each %$src) {
$hash{$k} = $v; # just override individual messages
}
} elsif ($src =~ s/^:+//) {
# A manual ":locale" specification ("auto" is handled by FB->new)
puke "Bad FormBuilder locale specification ':$src'" unless $src && $src ne '';
# load defaults from English, in case we can't find translators
# as we add new features
require CGI::FormBuilder::Messages::default;
%hash = CGI::FormBuilder::Messages::default->messages;
my %h2 = ();
# Note that the $src may be comma-separated, since this is the
# way that browsers present it
for (split /\s*,\s*/, $src) {
debug 2, "trying to load '$_.pm' for messages";
my $mod = __PACKAGE__.'::'.$_;
eval "require $mod";
if ($@) {
# try locale's "basename"
debug 2, "not found; trying locale basename";
$mod = __PACKAGE__.'::'.substr($_,0,2);
eval "require $mod";
}
next if $@;
debug 2, "loading messages from $mod";
%h2 = CGI::FormBuilder::Messages::locale->messages;
last;
}
belch "Could not load messages module '$src.pm': $@" unless %h2;
while (my($k,$v) = each %h2) {
$hash{$k} = $v;
}
} elsif ($src) {
# filename, just *warn* on missing, and use defaults
debug 2, "trying to open the '$src' file for messages";
if (-f $src && -r _ && open(M, "<$src")) {
lib/CGI/FormBuilder/Messages.pm view on Meta::CPAN
return $self->message($name, @_);
}
1;
__END__
=head1 DESCRIPTION
This module handles localization for B<FormBuilder>. It is invoked by
specifying the C<messages> option to B<FormBuilder>'s C<new()> method.
Currently included with B<FormBuilder> are several different locales:
English (default) en_US
Danish da_DK
German/Deutsch de_DE
Spanish/Espanol es_ES
Japanese ja_JP
Norwegian/Norvegian no_NO
Turkish tr_TR
Russian ru_RU
To enable automatic localization that will detect the client's locale
and use one of these included locales, simply turn on C<auto> messages:
my $form = CGI::FormBuilder->new(messages => 'auto');
Or, to use a specific locale, specify it as ":locale"
# Force Danish messages
my $form = CGI::FormBuilder->new(messages => ':da_DK');
In addition to these included locales, you can completely customize your
own messages. Each message that B<FormBuilder> outputs is given a unique key.
You can selectively override B<FormBuilder> messages by specifying a
different message string for a given message key.
To do so, first create a file and give it a unique name. In this example
we will use a shortened locale as the suffix:
# messages.en
# FormBuilder messages for "en" locale
js_invalid_start %s error(s) were found in your form:\n
js_invalid_end Fix these fields and try again!
js_invalid_select - You must choose an option for the "%s" field\n
Then, specify this file to C<new()>.
my $form = CGI::FormBuilder->new(messages => 'messages.en');
Alternatively, you could specify this directly as a hashref:
lib/CGI/FormBuilder/Messages/C.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::Messages::locale;
use strict;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Inherit all messages from default (English) messages
#
# This structure is needed so that we can have a ::default class and
# have all languages inherit from that. Before, we ran into oddities
# where ::default != ::locale and got "base class is empty" errors.
1;
__END__
lib/CGI/FormBuilder/Messages/_example.pm view on Meta::CPAN
# of the define_messages hash to the correct strings for your language.
#
# Save the file as __LANG__.pm, for example, "uk_UA.pm". You can
# then use this in FormBuilder as:
#
# my $form = CGI::FormBuilder->new(messages => ':uk_UA');
#
# That's it!
#
package CGI::FormBuilder::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/da.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/da_DK.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/de.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Simply create a hash of messages for this language
lib/CGI/FormBuilder/Messages/de_DE.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Simply create a hash of messages for this language
lib/CGI/FormBuilder/Messages/en.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::Messages::locale;
use strict;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Inherit all messages from default (English) messages
#
# This structure is needed so that we can have a ::default class and
# have all languages inherit from that. Before, we ran into oddities
# where ::default != ::locale and got "base class is empty" errors.
1;
__END__
lib/CGI/FormBuilder/Messages/en_US.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::Messages::locale;
use strict;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Inherit all messages from default (English) messages
#
# This structure is needed so that we can have a ::default class and
# have all languages inherit from that. Before, we ran into oddities
# where ::default != ::locale and got "base class is empty" errors.
1;
__END__
lib/CGI/FormBuilder/Messages/es.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# First, create a hash of messages for this language
lib/CGI/FormBuilder/Messages/es_ES.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# First, create a hash of messages for this language
lib/CGI/FormBuilder/Messages/fr.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/fr_FR.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/ja.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/ja_JP.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/no.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/no_NO.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/ru.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/ru_RU.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/sv.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/sv_SE.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/tr.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
lib/CGI/FormBuilder/Messages/tr_TR.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::Messages::locale;
use strict;
use utf8;
use CGI::FormBuilder::Messages::default;
use base 'CGI::FormBuilder::Messages::default';
our $VERSION = '3.20';
# Define messages for this language
pod/Changes.pod view on Meta::CPAN
Each field is now rendered by its own class, named for the field type.
For example, text fields are rendered by C<CGI::FormBuilder::Field::text>.
This allows you to create custom field types and plugging them in by
creating your own C<CGI::FormBuilder::Field::whatever_you_want> module.
Thanks to Peter Eichman for his contributions to this scheme.
=head2 Messages Localization
All messages are now handled in a similar way to field types: They are
delegated to C<CGI::FormBuilder::Messages::locale> where "locale" is
the appropriate string such as "en_US" or "da_DK". A number of localizations
are included as part of the standard distribution.
There are two ways to use these messages: Either the 'auto' messages
mode or by specifying a specific locale:
my $form = CGI::FormBuilder->new(messages => 'auto'); # check client
my $form = CGI::FormBuilder->new(messages => ':da_DK'); # specified
You can create your own messages by copying C<_example.pm> and modifying
it for your language. When using messages in this way, the HTTP Charset
is changed to C<utf-8>.
=head2 Select optgroup support
t/1d-messages.t view on Meta::CPAN
plan tests => $numtests;
# success if we said NOTEST
if ($ENV{NOTEST}) {
ok(1) for 1..$numtests;
exit;
}
}
# Messages, both inline and file
my $locale = "fb_FAKE";
my $messages = "messages.$locale";
open(M, ">$messages") || warn "Can't write $messages: $!";
for my $k ( sort keys %messages ) {
my $v = $messages{$k};
print M join(' ', $k, ref($v) ? @$v : $v), "\n";
}
close(M);
# Fake a submission request
$ENV{REQUEST_METHOD} = 'GET';
$ENV{QUERY_STRING} = 'ticket=111&user=pete&replacement=TRUE&action=Unsubscribe&name=Pete+Peteson&email=pete%40peteson.com&extra=junk&_submitted=1&blank=&two=&two=';