| HTML-Menu-Select documentation | Contained in the HTML-Menu-Select distribution. |
HTML::Menu::Select - Create HTML for select menus to simplify your templates.
use HTML::Menu::Select qw( menu options );
my $html = menu(
name => 'myMenu',
values => [ 'yes', 'no' ],
);
$tmpl->param( select_menu => $html );
This modules creates HTML for form select items.
Traditionally, if you wanted to dynamically generate a list of options
in a select menu, you would either have to use CGI's HTML
generation routines, or use a complicated template such as this:
<select name="day"> <TMPL_LOOP day> <option value="<TMPL_VAR value>" <TMPL_VAR selected>> <TMPL_VAR label> </option> </TMPL_LOOP> </select>
This module allows you to quickly prototype a page, allowing the CGI to completely generate the HTML, while allowing you at a later stage to easily change how much HTML it generates.
To install this module, run the following commands:
perl Makefile.PL make make test make install
Alternatively, to install with Module::Build, you can use the following commands:
perl Build.PL ./Build ./Build test ./Build install
Use options() to generate the HTML for only the option tags,
allowing you to keep the outer select tag in the template, so that,
for example, a designer can easily make changes to the CSS or
JavaScript handlers.
You would have something like the following in your template:
<select name="day">
<TMPL_VAR menu_options>
</select>
options() accepts the same parameters as "menu()", but the name
parameter is ignored.
If any of the following modules are already loaded into memory, their own escapeHTML (or equivalent) method will be used
Otherwise the following characters will be escaped
& < > "
This allows compile time checking, rather than runtime.
popup_menu( name => $name );
# OR
popup_menu( {name => $name} );
Arguments to the "menu()", "options()" and "popup_menu()" functions are similar to CGI.pm's, excepting the following differences.
popup_menu( name => $name ); # NOT # popup_menu( -name => $name );
popup_menu( name => $name, labels => \@labels ); # NOT # popup_menu( $name, \@labels );
An argument to CGI.pm's popup_menu such as -onChange = 'check()'> will
output the HTML onchange="check()".
This module will retain the case, outputting onChange="check()".
optgroup function is not yet supportedPlease log bugs, feature requests and patch submissions at http://sourceforge.net/projects/html-menu.
Support mailing list: html-menu-users@lists.sourceforge.net
HTML::Menu::DateTime, HTML::Template, Template, Template::Magic, DateTime::Locale.
Carl Franks <cpan@fireartist.com>
Ron Savage
Copyright 2005, Carl Franks. All rights reserved.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
Licenses are in the files "Artistic" and "Copying" in this distribution.
| HTML-Menu-Select documentation | Contained in the HTML-Menu-Select distribution. |
package HTML::Menu::Select; use 5.004; use strict; use Carp 'carp'; our $VERSION = '1.01'; require Exporter; our @ISA = qw( Exporter ); our @EXPORT_OK = qw( options menu popup_menu ); our %EXPORT_TAGS = ( all => \@EXPORT_OK ); our @KNOWN_KEYS = qw( name value values default defaults labels attributes size multiple override ); sub popup_menu { &menu }; sub menu { my %arg = (ref $_[0]) ? %{$_[0]} : @_; my $html = ''; $arg{name} = '' if not exists $arg{name}; $html = sprintf '<select name="%s"', _escapeHTML( $arg{name} ); for my $key (keys %arg) { if (! grep {$key eq $_} @KNOWN_KEYS) { $html .= sprintf ' %s="%s"', $key, _escapeHTML( $arg{$key} ); } } $html .= ">\n"; $html .= options(%arg); $html .= "</select>\n"; return $html; } sub options { my %arg = (ref $_[0]) ? %{$_[0]} : @_; my $html = ''; # aliases for (qw/ value default /) { $arg{$_} = $arg{"${_}s"} if exists $arg{"${_}s"}; $arg{$_} = [$arg{$_}] if exists $arg{$_} && ! ref $arg{$_}; } # don't support CGI.pm's 'override' argument if (exists $arg{override}) { carp "CGI.pm's 'override' argument is not supported by HTML::Menu::Select"; } for my $option (@{ $arg{value} }) { $html .= '<option '; for my $default (@{ $arg{default} }) { if ($option eq $default) { $html .= 'selected="selected" '; } } for my $att (keys %{ $arg{attributes} }) { if ($att eq $option) { for (keys %{ $arg{attributes}{$att} }) { $html .= sprintf '%s="%s" ', $_, _escapeHTML( $arg{attributes}{$att}{$_} ); } } } $html .= sprintf 'value="%s">', _escapeHTML( $option ); if (exists $arg{labels} && exists $arg{labels}{$option}) { $html .= _escapeHTML( $arg{labels}{$option} ); } else { $html .= _escapeHTML( $option ); } $html .= '</option>'; $html .= "\n"; } return $html; } sub _escapeHTML { my ($escape) = (@_); return unless defined $escape; if (exists $::INC{'CGI.pm'}) { return CGI::escapeHTML( $escape ); } elsif (exists $::INC{'CGI/Simple/Util.pm'}) { return CGI::Simple::Util::escapeHTML( $escape ); } elsif (exists $::INC{'HTML/Entities.pm'}) { return HTML::Entities::encode_entities( $escape ); } elsif (exists $::INC{'Apache/Util.pm'}) { return Apache::Util::escape_html( $escape ); } # looks like nothing's already loaded to do it for us $escape =~ s/&/&/gs; $escape =~ s/</</gs; $escape =~ s/>/>/gs; $escape =~ s/"/"/gs; return $escape; } 1; __END__