[html-formfu] HTML::FormFu::Element::DateTime
Вячеслав Тихановский
viacheslav.t at gmail.com
Thu Jan 17 14:55:05 GMT 2008
Hello.
I wanted to write DateTime element based upon Date, and ran into some problems.
Everything is ok with getting the field values from the form, and save_to_model
also works fine. But when i use get_element('name')->value('12-12-2007 10:10')
or defaults_from_model everything gets filled except the time param.
Could you please show me where i got an error. Here is my class:
package HTML::FormFu::Element::DateTime;
use strict;
use base 'HTML::FormFu::Element::Date';
__PACKAGE__->mk_attrs( qw/ time / );
sub new {
my $self = shift->next::method(@_);
$self->time( {
type => '_DateText',
prefix => [],
});
$self->strftime("%d-%m-%Y %H:%M");
return $self;
}
sub _add_elements {
my $self = shift;
$self->next::method(@_);
_add_time($self);
return;
}
sub _date_defaults {
my $self = shift;
my $default = $self->default;
if ( defined $default ) {
if ( blessed($default) && $default->isa('DateTime') ) {
$self->day->{default} = $default->day;
$self->month->{default} = $default->month;
$self->year->{default} = $default->year;
$self->time->{default} = $default->hour . ':' . $default->minute;
} else {
my $builder = DateTime::Format::Builder->new;
$builder->parser( { strptime => $self->strftime } );
my $dt = $builder->parse_datetime($default);
$self->day->{default} = $dt->day;
$self->month->{default} = $dt->month;
$self->year->{default} = $dt->year;
$self->time->{default} = $dt->hour . ':' . $dt->minute;
}
}
return;
}
sub _add_time {
my ($self) = @_;
my $time = $self->time;
my $time_name = _build_time_name($self);
$self->element( {
type => $time->{type},
name => $time_name,
defined $time->{default}
? ( default => $time->{default} )
: (),
} );
return;
}
sub _build_time_name {
my ($self) = @_;
my $time_name
= defined $self->time->{name}
? $self->time->{name}
: sprintf "%s_time", $self->name;
return $time_name;
}
sub process_input {
my ( $self, $input ) = @_;
my $day_name = $self->_build_day_name;
my $month_name = $self->_build_month_name;
my $year_name = $self->_build_year_name;
my $time_name = $self->_build_time_name;
$day_name = $self->get_element( { name => $day_name } )->nested_name;
$month_name = $self->get_element( { name => $month_name } )->nested_name;
$year_name = $self->get_element( { name => $year_name } )->nested_name;
$time_name = $self->get_element( { name => $time_name } )->nested_name;
my $day = $self->get_nested_hash_value( $input, $day_name );
my $month = $self->get_nested_hash_value( $input, $month_name );
my $year = $self->get_nested_hash_value( $input, $year_name );
my $time = $self->get_nested_hash_value( $input, $time_name );
my ( $hour, $minute ) = split( ':', $time );
if ( defined $day
&& length $day
&& defined $month
&& length $month
&& defined $year
&& length $year
&& defined $hour
&& length $hour
&& defined $minute
&& length $minute )
{
my $dt;
eval {
$dt = DateTime->new(
day => $day,
month => $month,
year => $year,
hour => $hour,
minute => $minute
);
};
my $value;
if ($@) {
$value = $self->strftime;
} else {
$value = $dt->strftime( $self->strftime );
}
$self->set_nested_hash_value( $input, $self->nested_name, $value );
}
}
1;
__END__
=head1 NAME
HTML::FormFu::Element::DateTime - 3 select menu multi-field plus time input
field
HTML::FormFu::Element::_DateText is the same as
HTML::FormFu::Element::_DateSelect instead it is inherited from the Text
element.
Thanks for any help.
--
vti -- Viacheslav Tikhanovskii
More information about the HTML-FormFu
mailing list