HTML::Menu::Select - Create HTML for select menus to simplify your templates.


HTML-Menu-Select documentation Contained in the HTML-Menu-Select distribution.

Index


Code Index:

NAME

Top

HTML::Menu::Select - Create HTML for select menus to simplify your templates.

SYNOPSIS

Top

  use HTML::Menu::Select qw( menu options );

  my $html = menu(
    name   => 'myMenu',
    values => [ 'yes', 'no' ],
  );

  $tmpl->param( select_menu => $html );




DESCRIPTION

Top

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.

INSTALLATION

Top

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

METHODS

Top

options()

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.

HTML escaping

Top

If any of the following modules are already loaded into memory, their own escapeHTML (or equivalent) method will be used

CGI
CGI::Simple
HTML::Entities
Apache::Util

Otherwise the following characters will be escaped

  & < > "

CGI.pm COMPATABILITY

Top

Arguments may be passed as a hash-reference, rather than a hash.

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.

Named arguments should not have a leading dash
  popup_menu( name => $name );

  # NOT
  # popup_menu( -name => $name );

Positional arguments are not supported
  popup_menu( name => $name, labels => \@labels );

  # NOT
  # popup_menu( $name, \@labels );

Attribute names not lowercased

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()".

The optgroup function is not yet supported

SUPPORT / BUGS

Top

Please log bugs, feature requests and patch submissions at http://sourceforge.net/projects/html-menu.

Support mailing list: html-menu-users@lists.sourceforge.net

SEE ALSO

Top

HTML::Menu::DateTime, HTML::Template, Template, Template::Magic, DateTime::Locale.

AUTHOR

Top

Carl Franks <cpan@fireartist.com>

CREDITS

Top

  Ron Savage

COPYRIGHT AND LICENSE

Top


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/&/&amp;/gs;
  $escape =~ s/</&lt;/gs;
  $escape =~ s/>/&gt;/gs;
  $escape =~ s/"/&quot;/gs;
  
  return $escape;
}

1;

__END__