[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