The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Class::CGI::DateTime - Fetch DateTime objects directly from your forms.

VERSION

Version 0.02

SYNOPSIS

  use Class::CGI
    handlers => {
        date       => 'Class::CGI::DateTime',
        order_date => 'Class::CGI::DateTime',
    };
  my $cgi        = Class::CGI->new;
  my $date       = $cgi->param('date');
  my $order_date = $cgi->param('order_date');

  if ( my %errors = $cgi->errors ) { ... }

DESCRIPTION

A common problem with Web programming is handling dates correctly. This Class::CGI handler attempts to do that for you in a standard way by allowing you to have separate day, month and year dropdowns but request a "date" parameter and get the correct object back, safely validated and untainted.

Multiple dates may be used in a single form and you can even specify hours, minutes, timezones, and so on.

Basic Usage

If you have a form with <select> boxes named day, month and year, you can fetch these into a DateTime object with this:

  use Class::CGI
    handlers => {
        date => 'Class::CGI::DateTime',
    };
  my $cgi        = Class::CGI->new;
  my $date       = $cgi->param('date');

The value of each parameter should correspond to allowed values for that parameter to the DateTime constructor.

Multiple dates in a form

If you need more than one date object embedded in a form, additional date objects may be specified by prefixing the form parameter names with a unique identifier followed by a dot ("."). For example, to fetch a date and an order date, you can do the following:

  use Class::CGI
    handlers => {
        date       => 'Class::CGI::DateTime',
        order_date => 'Class::CGI::DateTime',
    };
  my $cgi        = Class::CGI->new;
  my $date       = $cgi->param('date');
  my $order_date = $cgi->param('order_date');

The date parameter will be created from the day, month and year parameters in the Class::CGI object. The order_date.date parameter will be created from the order_date.day, order_date.month and order_date.year parameters.

Different parameters

 $cgi->args( date => { params => [qw/ day hour minute /] } );

You cannot change the parameter names (e.g., no changing "day" to "jour" or something like that), but you can specify additional parameters which the DateTime constructor expects. Each parameter's value must correspond to the allowed values for the DateTime object. You do this by setting the requested parameters in Class::CGI's args() method. The key is the date parameter you wish to specify the arguments for and the value should be a hashref with a key of "params" and a value being an array reference specifying the names of the parameters desired.

For example, if your HTML form has day, month, year and timezone, you might do this:

  use Class::CGI
    handlers => {
        date => 'Class::CGI::DateTime',
    };
  my $cgi        = Class::CGI->new;
  $cgi->args( 
     date => { params => [qw/ day month year time_zone /] }
  );
  my $date       = $cgi->param('date');

The allowed parameter names, as specified from the DateTime documentation, are:

  • year

  • month

  • day

  • hour

  • minute

  • second

  • nanosecond

  • time_zone

Error handling

As usual, any errors reported by Class::CGI::DateTime will be in the Class::CGI errors() method. However, the validation errors reported by the DateTime object are generally aimed at programmers, not users of your software. Thus, you'll want to provide more user friendly error messages. For example:

  if ( my %error_for = $cgi->errors ) {
      if ( exists $error_for{order_date} ) {
          $error_for{order_date} = "You must enter a valid order date";
      }
  }

If a date is required, it's easy to handle this:

  use Class::CGI
    handlers => {
        date       => 'Class::CGI::DateTime',
        order_date => 'Class::CGI::DateTime',
    };
  my $cgi        = Class::CGI->new;
  $cgi->required( qw/date order_date/ );
  my $date       = $cgi->param('date');
  my $order_date = $cgi->param('order_date');

Class::CGI::DateTime will not create a date object if any of the required components (day, month, year and so on) are missing. Further, a descriptive error message will be set.

Also note that at the present time, Class::CGI::DateTime only ensures that we can create a valid DateTime object. Application-specific validation (such as ensuring the date is in the future) belongs in your application and should be handled there.

AUTHOR

Curtis "Ovid" Poe, <ovid@cpan.org>

BUGS

Please report any bugs or feature requests to bug-class-cgi-datetime@rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Class-CGI-DateTime. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SEE ALSO

  • DateTime - A date and time object

ACKNOWLEDGEMENTS

Adam Kennedy (Alias): for suggesting a better interface.

COPYRIGHT & LICENSE

Copyright 2006 Curtis "Ovid" Poe, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.