package HTML::FormHandler::Field::DateTime;
# ABSTRACT: compound DateTime field
$HTML::FormHandler::Field::DateTime::VERSION = '0.40068';
use Moose;
extends 'HTML::FormHandler::Field::Compound';
use DateTime;
use Try::Tiny;
has '+widget' => ( default => 'Compound' );
has '+inflate_default_method' => ( default => sub { \&datetime_inflate } );
our $class_messages = {
'datetime_invalid' => 'Not a valid DateTime',
};
sub get_class_messages {
my $self = shift;
return {
%{ $self->next::method },
%$class_messages,
}
}
sub datetime_inflate {
my ( $self, $value ) = @_;
return $value unless ref $value eq 'DateTime';
my %hash;
foreach my $field ( $self->all_fields ) {
my $meth = $field->name;
$hash{$meth} = $value->$meth;
}
return \%hash;
}
sub validate {
my ($self) = @_;
my @dt_parms;
foreach my $child ( $self->all_fields ) {
next unless $child->value;
push @dt_parms, ( $child->accessor => $child->value );
}
# set the value
my $dt;
try {
$dt = DateTime->new(@dt_parms);
}
catch {
$self->add_error( $self->get_message('datetime_invalid') );
};
if( $dt ) {
$self->_set_value($dt);
}
else {
$self->_set_value( {@dt_parms} );
}
}
__PACKAGE__->meta->make_immutable;
use namespace::autoclean;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::FormHandler::Field::DateTime - compound DateTime field
=head1 VERSION
version 0.40068
=head1 DESCRIPTION
This is a compound field that requires you to define the subfields
for month/day/year/hour/minute. Widget type is 'compound'.
If you want to use drop-down select boxes for your DateTime, you
can select fields like:
has_field 'my_date' => ( type => 'DateTime' );
has_field 'my_date.month' => ( type => 'Month' );
has_field 'my_date.day' => ( type => 'MonthDay' );
has_field 'my_date.year' => ( type => 'Year' );
has_field 'my_date.hour' => ( type => 'Hour' );
has_field 'my_date.minute' => ( type => 'Minute' );
If you want simple input fields:
has_field 'my_date' => ( type => 'DateTime' );
has_field 'my_date.month' => ( type => 'Integer', range_start => 1,
range_end => 12 );
has_field 'my_date.day' => ( type => 'Integer', range_start => 1,
range_end => 31 );
Customizable error: 'datetime_invalid' (default = "Not a valid DateTime")
See the 'Date' field for a single input date field.
=head1 AUTHOR
FormHandler Contributors - see HTML::FormHandler
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2017 by Gerda Shank.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut