HTML::FormFu::Inflator::CompoundDateTime - CompoundDateTime inflator


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

Index


Code Index:

NAME

Top

HTML::FormFu::Inflator::CompoundDateTime - CompoundDateTime inflator

SYNOPSIS

Top

    ---
    element:
      - type: Multi
        name: date

        elements:
          - name: day
          - name: month
          - name: year

        inflator:
          - type: CompoundDateTime

    # get the submitted value as a DateTime object

    my $date = $form->param_value('date');

DESCRIPTION

Top

For use with a HTML::FormFu::Element::Multi group of fields.

Changes the input from several fields into a single DateTime value.

By default, expects the field names to be any of the following:

year
month
day
hour
minute
second
nanosecond
time_zone

METHODS

Top

field_order

Arguments: \@order

If your field names doesn't follow the convention listed above, you must provide an arrayref containing the above names, in the order they correspond with your own fields.

    ---
    element:
      - type: Multi
        name: date

        elements:
          - name: m
          - name: d
          - name: y

        inflator:
          - type: CompoundDateTime
            field_order:
              - month
              - day
              - year

strptime

Arguments: \%args

Arguments: $string

Optional. Define the format that should be used if the DateTime object is stringified.

Accepts a hashref of arguments to be passed to new in DateTime::Format::Strptime. Alternatively, accepts a single string argument, suitable for passing to DateTime::Format::Strptime->new( pattern => $string ).

    ---
    inflator:
      - type: CompoundDateTime
        strptime:
          pattern: '%d-%b-%Y'
          locale: de

    ---
    inflator:
      - type: CompoundDateTime
        strptime: '%d-%m-%Y'

AUTHOR

Top

Carl Franks

LICENSE

Top

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


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

package HTML::FormFu::Inflator::CompoundDateTime;

use Moose;
extends 'HTML::FormFu::Inflator';

use HTML::FormFu::Constants qw( $EMPTY_STR );
use DateTime;
use DateTime::Format::Strptime;
use List::MoreUtils qw( none );
use Scalar::Util qw( reftype );
use Carp qw( croak );

has strptime    => ( is => 'rw', traits => ['Chained'] );
has field_order => ( is => 'rw', traits => ['Chained'] );

my @known_fields = qw( year month day hour minute second nanosecond time_zone );

sub inflator {
    my ( $self, $value ) = @_;

    return if !defined $value || $value eq $EMPTY_STR;

    my ( $multi, @fields ) = @{ $self->parent->get_fields };
    my %input;

    if ( defined( my $order = $self->field_order ) ) {
        for my $order (@$order) {
            croak "unknown DateTime field_order name"
                if none { $order eq $_ } @known_fields;

            my $field = shift @fields;
            my $name  = $field->name;

            $input{$order} = $value->{$name};
        }
    }
    else {
        for my $name ( keys %$value ) {
            croak "unknown DateTime field name"
                if none { $name eq $_ } @known_fields;
        }

        %input = %$value;
    }

    my $dt;

    eval { $dt = DateTime->new(%input) };

    return $value if $@;

    if ( defined $self->strptime ) {
        my $strptime = $self->strptime;
        my %args;

        if ( ( reftype( $strptime ) || '' ) eq 'HASH' ) {
            %args = %$strptime;
        }
        else {
            %args = ( pattern => $strptime );
        }

        my $formatter = DateTime::Format::Strptime->new(%args);

        $dt->set_formatter($formatter);
    }

    return $dt;
}

__PACKAGE__->meta->make_immutable;

1;

__END__