Hi,

I've written a module which I propose naming 
HTML::Template::Dropdown::Date.

Please see the POD below for description and usage.

The module doesn't actually require HTML::Template and could be used 
for other things, though this is the use it was created for and will 
be maintained and developed for.

I asked a while ago for comments but unfortunately didn't hear 
anything back. 
This time I'm asking if there's any objections to using the namespace 
(suggestions for alternative names welcome), as I want to upload to 
CPAN as it's used in a larger app that I'll be releasing soon.

Many thanks,
Carl Franks


=head1 NAME

HTML::Template::Dropdown::Date

=head1 SYNOPSIS

  use HTML::Template::Dropdown::Date;
  
  my $menu = HTML::Template::Dropdown::Date->new (
    date       => '2004-02-26',
    noSelect   => 1,
    emptyFirst => '');
  
  $menu->startYear(2000);
  $menu->endYear(2010);
  
  $menu->lessYears(1);
  $menu->plusYears(5);
  
  $menu->secondMenu;
  $menu->minuteMenu;
  $menu->hourMenu;
  $menu->dayMenu;
  $menu->monthMenu;
  $menu->yearMenu;

=head1 DESCRIPTION

Creates data structures suitable for populating HTML::Template 
templates with 
dropdown date and time menus.

Allows any number of dropdown menus to be displayed on a page, each 
independantly configurable.

=head1 MOTIVATION

To keep the creation of HTML completely seperate from the program, to 
easily 
allow css styles, javascript, etc. to be added to individual menus.

To make the creation of menus as simple as possible, with extra 
options if 
needed. Menus can be created as easily as:

  #!/usr/bin/perl
  use strict;
  use warnings;
  use CGI ':standard';
  use HTML::Template;
  use HTML::Template::Dropdown::Date;
  
  my $tmpl = HTML::Template->new (filename => $filename);
  
  my $menu = HTML::Template::Dropdown::Date->new;
  
  $tmpl->param (day   => $menu->dayMenu(),
                month => $menu->monthMenu(),
                year  => $menu->yearMenu(),
                );
  
  print header();
  print $tmpl->output();

=head1 METHODS

=head2 new()

  my $menu1 = HTML::Template::Dropdown::Date->new 
                (date       => $date,
                 startYear  => $start,
                 endYear    => $end,
                 noSelect   => 1,
                 emptyFirst => 1);
  
  my $menu2 = HTML::Template::Dropdown::Date->new 
                (lessYears => $less,
                 plusYears => $plus);

C<new()> accepts the following arguments (in the form of a hash or 
list):

=over4

=item date

Can be in any of the formats 'YYYY-MM-DD hh:mm:ss', 'YYYYMMDDhhmmss', 
'YYYYMMDDhhmm', 'YYYYMMDDhh', 'YYYYMMDD', 'YYYYMM', 'YYYY', 'YYYY-MM--
DD', 
'hh:mm:ss'.

The date passed to C<new()> is used to decide which item should be 
selected 
in all of the *Menu methods.

=item startYear, endYear, lessYears, plusYears

The equivalent of calling the method of the same name.

=item noSelect

If true, ensures no item in any menu will be selected.

=item emptyFirst

If 'defined', will create an extra list item at the start of each 
menu. The 
form value will be the empty string (''), the value passed to 
C<emptyFirst('value')> will be the visible label for the first item 
(the 
empty string is allowed).

=back

=head2 startYear()

  $date->startYear(2004);

Sets the absolute year that the dropdown menu will start from.

=head2 endYear()

  $date->endYear(2009);

Sets the absolute year that the dropdown menu will end on.

=head2 lessYears()

  $date->lessYears(2);

Sets the year that the dropdown menu will start from, relative to the 
selected 
year.

=head2 plusYears()

  $date->plusYears(7);

Sets the year that the dropdown menu will end on, relative to the 
selected 
year.

=head2 secondMenu() minuteMenu() hourMenu() dayMenu() monthMenu() 
yearMenu()

  $tmpl->param (secMenu   => $date->secondMenu(),
                minMenu   => $date->minuteMenu(0),
                hourMenu  => $date->hourMenu('-1'),
                dayMenu   => $date->dayMenu('+1'),
                monthMenu => $date->monthMenu(12),
                yearMenu  => $date->yearMenu(),
                );

Accepts a value that will override the date (if any) in the C<new()> 
method. 
Accepts relative values such as '+1' or '-1'.

Returns an array-reference suitable for passing directly to $tmpl-
>param().

=head1 EXAMPLES

=head2 Templates

The 'examples' folder in this distribution contains the files 
second.html, 
minute.html, hour.html, day.html, month.html and year.html. Simply 
copy these 
files into the folder containing the rest of your templates.

=head2 Displaying date dropdown menus

Contents of template file "date.html":

  <html>
  <body>
    <form method="POST" action="">
      <TMPL_INCLUDE day.html>
      <TMPL_INCLUDE month.html>
      <TMPL_INCLUDE year.html>
      <input type="submit" name="Submit" value="Submit">
    </form>
  </body>
  </html>

Contents of program file:

  #!/usr/bin/perl
  use strict;
  use warnings;
  use CGI ':standard';
  use HTML::Template::Dropdown::Date;
  use HTML::Template;
  
  my $tmpl = HTML::Template->new (filename => 'date.html');
  
  my $menu = HTML::Template::Dropdown::Date->new 
              (date      => '2004-04-01',
               lessYears => 2,
               plusYears => 0);
  
  $tmpl->param (day   => $menu->dayMenu(),
                month => $menu->monthMenu(),
                year  => $menu->yearMenu(),
                );
  
  print header(),
  print $tmpl->output();

=head2 Multiple Menus in a Single Page

To create, for example, 2 'month' menus in a single page you could 
copy the 
month.html file to end_month.html and then change the line 
C<<select name="month">> in end_month.html to C<<select 
name="end_month">>.

Then include both files in your main template:

  <html>
  <body>
    <form method="POST" action="">
      <TMPL_INCLUDE month.html>
      <TMPL_INCLUDE end_month.html>
      <input type="submit" name="Submit" value="Submit">
    </form>
  </body>
  </html>

When this form is submitted, it will send 2 different values, 'month' 
and 
'end_month'.

=head1 DEFAULT VALUES

If a date is not passed to the C<new()> or *Menu() methods, then 
C<localtime(time)> is called.

If neither 'startYear' or 'lessYears' is set, the default used is 
C<lessYears(5)>.

If neither 'endYear' or 'plusYears' is set, the default used is 
C<plusYears(5)>.

=head1 EXPORT

None.

=head1 TIPS

Years before 1000 AD passed to the C<new()> method in 
the 'YYYYMMDDhhmmss' 
format should be passed as strings, as the leading zeros are 
necessary. (e.g. 
'09990101000000').

Years before 1000 AD may be passed to the C<yearMenu()> method as 
literal 
numbers.

Years before 1 AD are not allowed at all.

DO NOT set both 'startYear' and 'lessYears' at the same time, it just 
doesn't 
make sense.

DO NOT set both with 'endYear' and 'plusYears' at the same time, it 
just 
doesn't make sense.

To start or end the range on the same year as selected, set lessYears 
or 
plusYears to zero, DO NOT set startYear or endYear to zero.

When settting either 'startYear' or 'endYear', ensure that the 
selected year 
will fall within the range of years.

When passing relative values to methods, ensure they are sent as 
strings. 
C<+1> numerically means C<1> which is not the same as the string 
C<'+1'>.

If a date is set in C<new()> and either 'lessYears' or 'plusYears' set 
and 
then a value passed to the c<yearMenu()> method. The start / end year 
of the 
menu will be relative to the value passed to C<yearMenu()>, not the 
date set 
in C<new()>.

'Relative' parameter values sent to *Menu methods, which result in 
out-of-range selections are silently ignored and no item in the output 
menu 
will be selected.

=head1 SEE ALSO

HTML::Template

=head1 AUTHOR

Carl Franks

=head1 COPYRIGHT AND LICENSE

Copyright 2004, 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 (L<perlgpl>, L<perlartistic>).

=cut



-------------------------------------------------------
This SF.Net email is sponsored by: YOU BE THE JUDGE. Be one of 170
Project Admins to receive an Apple iPod Mini FREE for your judgement on
who ports your project to Linux PPC the best. Sponsored by IBM.
Deadline: Sept. 24. Go here: http://sf.net/ppc_contest.php
_______________________________________________
Html-template-users mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/html-template-users

Reply via email to