view release on metacpan or search on metacpan
each one of the form field types; the method has the same name as the type.
However, these are shims, and the real work is still done elsewhere.
* The lower-level methods that do the actual making of form field HTML saw
the most changes and were completely rewritten. As part of the rewrite,
functionality that was crammed into 3 methods is now handled by 9 which are
more specialized.
* All ten single field types now have group counterparts. Although the
usefulness of some of these may vary, you at least now have the choice.
Added are: reset_group, submit_group, popup_menu_group, scrolling_list_group.
The latter two cases differ from their single-field equivalents by
distributing any default values so that each group member gets one rather
than one field getting all. The most useful is probably popup_menu_group.
* All field definition attributes are now the same between corresponding
single and group fields, except for group-only ones, so you can use the
singular or plural names for definition attributes interchangeably.
* The POD documentation was greatly improved. It is now more informative,
better organized, and it's easier to understand what's going on. The
methods are now arranged in a different order, with logically related ones
appearing together. Each field-type method now has a full description,
including what positional and named parameters work with it (each is
lib/HTML/FormTemplate.pm view on Meta::CPAN
name => 'name',
is_required => 1,
}, {
visible_title => "What's the combination?",
type => 'checkbox_group',
name => 'words',
'values' => ['eenie', 'meenie', 'minie', 'moe'],
default => ['eenie', 'minie'],
}, {
visible_title => "What's your favorite colour?",
type => 'popup_menu',
name => 'color',
'values' => ['red', 'green', 'blue', 'chartreuse'],
}, {
type => 'submit',
},
);
my $query_string = '';
read( STDIN, $query_string, $ENV{'CONTENT_LENGTH'} );
chomp( $query_string );
lib/HTML/FormTemplate.pm view on Meta::CPAN
=item 0
B<checkbox> - makes a standalone check box
=item 0
B<radio> - makes a standalone radio button
=item 0
B<popup_menu> - makes a popup menu, one item can be selected at once
=item 0
B<scrolling_list> - makes a scrolling list, multiple selections possible
=back
Groups of related fields of the following types are recognized:
=over 4
lib/HTML/FormTemplate.pm view on Meta::CPAN
=item 0
B<checkbox_group> - makes a group of related checkboxes
=item 0
B<radio_group> - makes a group of related radio buttons
=item 0
B<popup_menu_group> - makes a group of related popup menus
=item 0
B<scrolling_list_group> - makes a group of related scrolling lists
=back
Other field types aren't intrinsically recognized, but can still be generated as
ordinary html tags by using methods of the HTML::EasyTags class. A list of all
the valid field types is returned by the valid_field_type_list() method.
lib/HTML/FormTemplate.pm view on Meta::CPAN
my $TKEY_FLDGRP = 'fldgrp'; # a boolean - is this a field group or not
my $TKEY_MULTIV = 'multiv'; # a boolean - can field use >1 member of VALUES arg
my $TKEY_METHOD = 'method'; # a scalar - what method to use for html rendering
my $TKEY_PARSER = 'parser'; # always a 3-element array - for parsing definitions
my $TKEY_ATTRIB = 'attrib'; # an array - valid defin attribs for this type
# First set the 6 simpler %FIELD_TYPES atributes:
# visible, editable, selectable, field group, multivalued, rendering method
{
foreach my $type (qw( reset submit hidden textfield password_field textarea
checkbox radio popup_menu scrolling_list )) {
$FIELD_TYPES{$type} = {
$TKEY_VISIBL => 1, # true with 9/10, not hidden
$TKEY_EDITAB => 1, # true with 7/10, not reset submit hidden
$TKEY_SELECT => 0, # true with 6/10, not check radio popup scroll
$TKEY_FLDGRP => 0, # true with 10/10
$TKEY_MULTIV => 0, # true with 8/10, not popup scroll
$TKEY_METHOD => '_make_input_html', # true with 7/10, n txa pop scr
};
$FIELD_TYPES{$type."_group"} = {
$TKEY_VISIBL => 1, # true with 9/10, not hidden
$TKEY_EDITAB => 1, # true with 7/10, not reset, submit, hidden
$TKEY_SELECT => 0, # true with 6/10, not check radio popup scroll
$TKEY_FLDGRP => 1, # true with 10/10
$TKEY_MULTIV => 1, # true with 10/10
$TKEY_METHOD => '_make_input_group_html', # true with 7/10, n ...
};
}
foreach my $type (qw( hidden )) {
$FIELD_TYPES{$type}->{$TKEY_VISIBL} = 0;
$FIELD_TYPES{$type."_group"}->{$TKEY_VISIBL} = 0;
}
foreach my $type (qw( reset submit hidden )) {
$FIELD_TYPES{$type}->{$TKEY_EDITAB} = 0;
$FIELD_TYPES{$type."_group"}->{$TKEY_EDITAB} = 0;
}
foreach my $type (qw( checkbox radio popup_menu scrolling_list )) {
$FIELD_TYPES{$type}->{$TKEY_SELECT} = 1;
$FIELD_TYPES{$type."_group"}->{$TKEY_SELECT} = 1;
}
foreach my $type (qw( popup_menu scrolling_list )) {
$FIELD_TYPES{$type}->{$TKEY_MULTIV} = 1;
}
foreach my $type (qw( textarea )) {
$FIELD_TYPES{$type}->{$TKEY_METHOD} = '_make_textarea_html';
$FIELD_TYPES{$type."_group"}->{$TKEY_METHOD} = '_make_textarea_group_html';
}
foreach my $type (qw( popup_menu scrolling_list )) {
$FIELD_TYPES{$type}->{$TKEY_METHOD} = '_make_select_html';
$FIELD_TYPES{$type."_group"}->{$TKEY_METHOD} = '_make_select_group_html';
}
}
# Next set the input parser attribute of %FIELD_TYPES:
{
foreach my $type (qw( reset submit )) {
my $names = [ $FKEY_NAME, $FKEY_DEFAULTS ];
my $rename = {
lib/HTML/FormTemplate.pm view on Meta::CPAN
$FKEY_LINEBREAK, 'rows', 'cols' ];
my $rename = {
'values' => $FKEY_DEFAULTS, value => $FKEY_DEFAULTS,
text => $FKEY_DEFAULTS, columns => 'cols',
};
my $rem = $FKEY_DEFAULTS;
$FIELD_TYPES{$type}->{$TKEY_PARSER} = [$names, $rename, $rem];
$FIELD_TYPES{$type."_group"}->{$TKEY_PARSER} =
[$names_group, $rename, $rem];
}
foreach my $type (qw( checkbox radio popup_menu scrolling_list )) {
my $names = [ $FKEY_NAME, $FKEY_DEFAULTS, $FKEY_VALUES, $FKEY_LABELS ];
my $names_group = [ $FKEY_NAME, $FKEY_VALUES, $FKEY_DEFAULTS,
$FKEY_LINEBREAK, $FKEY_LABELS ];
my $rename = {
value => $FKEY_VALUES, checked => $FKEY_DEFAULTS,
selected => $FKEY_DEFAULTS, on => $FKEY_DEFAULTS,
label => $FKEY_LABELS, text => $FKEY_LABELS,
};
my $rem = $FKEY_LABELS;
$FIELD_TYPES{$type}->{$TKEY_PARSER} = [$names, $rename, $rem];
lib/HTML/FormTemplate.pm view on Meta::CPAN
$FKEY_VALIDATION_RULE, $FKEY_VISIBLE_TITLE, $FKEY_HELP_MESSAGE,
$FKEY_ERROR_MESSAGE, $FKEY_STR_ABOVE_INPUT, $FKEY_STR_BELOW_INPUT,
$FKEY_IS_PRIVATE, $FKEY_EXCLUDE_IN_ECHO);
if( $typerec->{$TKEY_FLDGRP} ) {
push( @attrib, $FKEY_MIN_GRP_COUNT, $FKEY_LIST, $FKEY_LINEBREAK,
$FKEY_TABLE_COLS, $FKEY_TABLE_ROWS, $FKEY_TABLE_ACRF,
$FKEY_REQ_MIN_COUNT, $FKEY_REQ_MAX_COUNT );
}
$typerec->{$TKEY_ATTRIB} = \@attrib;
}
foreach my $type (qw( checkbox radio popup_menu scrolling_list )) {
my @attrib = ($FKEY_VALUES, $FKEY_LABELS);
push( @{$FIELD_TYPES{$type}->{$TKEY_ATTRIB}}, @attrib );
push( @{$FIELD_TYPES{$type."_group"}->{$TKEY_ATTRIB}}, @attrib );
}
foreach my $type (qw( checkbox radio )) {
my @attrib = ($FKEY_NOLABELS);
push( @{$FIELD_TYPES{$type}->{$TKEY_ATTRIB}}, @attrib );
push( @{$FIELD_TYPES{$type."_group"}->{$TKEY_ATTRIB}}, @attrib );
}
foreach my $type (qw( textfield password_field )) {
lib/HTML/FormTemplate.pm view on Meta::CPAN
NAME
VALUE
[DEFAULT or CHECKED or SELECTED or ON]
[LABEL or TEXT]
NOLABEL
This method makes a single radio option that has NAME for its name and
VALUE as its value. The arguments are the same as for a checkbox.
=head2 popup_menu( NAME, [DEFAULTS], VALUES[, LABELS] )
NAME
VALUES
[DEFAULTS or CHECKED or SELECTED or ON]
[LABELS or TEXT]
This method makes a single popup menu that has NAME for its name and option
values populated from the VALUES array ref argument. VALUES defaults to a
one-element list containing 'on' if not defined. If DEFAULTS is a hash ref
then its keys are matched with elements of VALUES and wherever its values are
true then the corresponding menu option is selected; otherwise, DEFAULTS is
taken as a list of option VALUES that are to be selected; by default, no
options are selected. Similarly, if LABELS is a hash ref then its keys are
matched with elements of VALUES and its values provide labels for them;
otherwise, LABELS is taken as a list of labels which are matched to VALUES
by their corresponding array indices. Since options must always have
user-visible labels, any one for which LABELS is undefined will default to
using its value as a label. Note that a popup menu is a simplified case of
a scrolling list where only one option can be selected and the selected option
is the only one visible while the field doesn't have the user's focus (the menu
visually opens up when the field has focus).
=head2 scrolling_list( NAME, [DEFAULTS], VALUES[, LABELS] )
NAME
VALUES
[DEFAULTS or CHECKED or SELECTED or ON]
[LABELS or TEXT]
SIZE
MULTIPLE
This method makes a single scrolling list that has NAME for its name and option
values populated from the VALUES array ref argument. The arguments are the same
as for a popup menu, except that scrolling lists also support SIZE and MULTIPLE.
If MULTIPLE is true then the user can select multiple options; otherwise they
can select only one. If SIZE is a number greater than one then that number of
options is visually displayed at once; this argument defaults to the count of
elements in VALUES if false. Note that setting SIZE to 1 will cause this
field to be a popup menu instead.
=head2 reset_group( NAME[, DEFAULTS] )
NAME
[DEFAULTS or VALUES or LABELS]
This method makes a group of related reset buttons, which have NAME in common.
There is one group member for each element in the array ref DEFAULTS.
=head2 submit_group( NAME[, DEFAULTS] )
lib/HTML/FormTemplate.pm view on Meta::CPAN
NAME
VALUES
[DEFAULTS or CHECKED or SELECTED or ON]
[LABELS or TEXT]
NOLABELS
This method makes a group of related radio options, which have NAME in common.
There is one group member for each element in the array ref VALUES.
The arguments are the same as for a checkbox_group.
=head2 popup_menu_group( NAME, VALUES[, DEFAULTS[, LINEBREAK[, LABELS]]] )
NAME
VALUES
[DEFAULTS or CHECKED or SELECTED or ON]
[LABELS or TEXT]
This method makes a group of related popup menus, which have NAME in common.
There is one group member for each element in the array ref DEFAULTS.
=head2 scrolling_list_group( NAME, VALUES[, DEFAULTS[, LINEBREAK[, LABELS]]] )
NAME
VALUES
[DEFAULTS or CHECKED or SELECTED or ON]
[LABELS or TEXT]
SIZE
MULTIPLE
lib/HTML/FormTemplate.pm view on Meta::CPAN
######################################################################
sub reset { $_[0]->_proxy( 'reset', \@_ ) }
sub submit { $_[0]->_proxy( 'submit', \@_ ) }
sub hidden { $_[0]->_proxy( 'hidden', \@_ ) }
sub textfield { $_[0]->_proxy( 'textfield', \@_ ) }
sub password_field { $_[0]->_proxy( 'password_field', \@_ ) }
sub textarea { $_[0]->_proxy( 'textarea', \@_ ) }
sub checkbox { $_[0]->_proxy( 'checkbox', \@_ ) }
sub radio { $_[0]->_proxy( 'radio', \@_ ) }
sub popup_menu { $_[0]->_proxy( 'popup_menu', \@_ ) }
sub scrolling_list { $_[0]->_proxy( 'scrolling_list', \@_ ) }
sub reset_group { $_[0]->_proxy( 'reset_group', \@_ ) }
sub submit_group { $_[0]->_proxy( 'submit_group', \@_ ) }
sub hidden_group { $_[0]->_proxy( 'hidden_group', \@_ ) }
sub textfield_group { $_[0]->_proxy( 'textfield_group', \@_ ) }
sub password_field_group { $_[0]->_proxy( 'password_field_group', \@_ ) }
sub textarea_group { $_[0]->_proxy( 'textarea_group', \@_ ) }
sub checkbox_group { $_[0]->_proxy( 'checkbox_group', \@_ ) }
sub radio_group { $_[0]->_proxy( 'radio_group', \@_ ) }
sub popup_menu_group { $_[0]->_proxy( 'popup_menu_group', \@_ ) }
sub scrolling_list_group { $_[0]->_proxy( 'scrolling_list_group', \@_ ) }
######################################################################
=head1 METHODS FOR MAKING TOPS AND BOTTOMS OF HTML FORMS
Besides the field-type methods above, these can be used to make pieces of forms
at a time giving you more control of the whole form layout.
=head2 start_form([ METHOD[, ACTION] ])
lib/HTML/FormTemplate.pm view on Meta::CPAN
}
# Set up default attributes common to all select tags.
my %params = (
%{$defin->fetch_value( $FKEY_TAG_ATTR )},
name => $defin->fetch_value( $FKEY_NAME ),
);
$params{size} ||= scalar( @{$ra_values} );
# Set up attributes that are unique to popup menus. They are
# different in that only one item can be displayed at a time, and
# correspondingly the user can only choose one item at a time.
if( $defin->fetch_value( $FKEY_TYPE ) eq 'popup_menu' ) {
$params{size} = 1;
$params{multiple} = 0;
}
# Make the field HTML and return it.
my $tagmaker = $self->{$KEY_TAG_MAKER};
return( join( '',
$tagmaker->make_html_tag( 'select', \%params, undef, 'start' ),
@{$tagmaker->make_html_tag_group( 'option', { value => $ra_values,
lib/HTML/FormTemplate.pm view on Meta::CPAN
}
# Set up default attributes common to all select tags.
my %params = (
%{$defin->fetch_value( $FKEY_TAG_ATTR )},
name => $defin->fetch_value( $FKEY_NAME ),
);
$params{size} ||= scalar( @{$ra_values} );
# Set up attributes that are unique to popup menus. They are
# different in that only one item can be displayed at a time, and
# correspondingly the user can only choose one item at a time.
if( $defin->fetch_value( $FKEY_TYPE ) eq 'popup_menu_group' ) {
$params{size} = 1;
$params{multiple} = 0;
}
# Make sure we have a list of valid default values, and hash of said also.
# The valid list is an intersection of current defaults and field values.
my @defaults = $defin->fetch( $FKEY_DEFAULTS );
my $rh_defaults = $defaults[0];
unless( ref( $rh_defaults ) eq 'HASH' ) {
lib/HTML/FormTemplate.pm view on Meta::CPAN
This string argument is the name of the field we will make. This is needed for
matching up user input with the fields it came from on a form submission, so we
can do validation, error correction, and reporting. This property defaults to
default_field_name() if not provided. Users do not see this name, but the web
browsers care about it.
=head2 values
This list argument is used with selection-type fields to set the list of options
that the user can select from, and can be used with checkbox, radio, popup menu,
scrolling list, and groups of each. This property defaults to 'on' if not set
for most field types, and to NAME for single checkboxes and radio buttons.
=head2 defaults
This list/hash argument provides default user input for the field, which could
be from actual live or stored user input, or could be coded default values for
the field. Aliases include [values, labels, text, checked, selected, on]
depending on the field type.