Skip to content

Commit

Permalink
filters
Browse files Browse the repository at this point in the history
  • Loading branch information
Zbigniew Lukasiak committed Apr 16, 2009
1 parent b043512 commit 329a31a
Show file tree
Hide file tree
Showing 2 changed files with 123 additions and 0 deletions.
72 changes: 72 additions & 0 deletions lib/HTML/FormHandler/Field.pm
Original file line number Diff line number Diff line change
Expand Up @@ -626,6 +626,21 @@ has 'constraints' => (
}
);

has 'filters' => (
metaclass => 'Collection::Array',
isa => 'ArrayRef',
is => 'rw',
auto_deref => 1,
default => sub {[]},
provides => {
'push' => 'push_filter',
'count' => 'num_filters',
'empty' => 'has_filters',
'clear' => 'clear_filters',
}
);


=head1 METHODS
=head2 new [parameters]
Expand Down Expand Up @@ -744,6 +759,7 @@ sub validate_field
inner();

$field->_check_constraints;
$field->_apply_filters;

return unless $field->validate;
return unless $field->test_ranges;
Expand Down Expand Up @@ -861,6 +877,62 @@ sub _check_constraints {
}
}
}

sub _make_filter {
my ( $self, $filter ) = @_;
my $name;
my $new_filter;
if( ref $filter eq 'ARRAY' ){
$name = $filter->[0];
if( $name eq 'range' ){
}
else{
$new_filter = {
action => $filter->[0],
message => $filter->[1],
}
}
}
if( ref $filter eq 'CODE' ){
$new_filter = {
action => $filter,
}
}
elsif( ref $filter eq 'HASH' ){
$name = $filter ->{named};
if( ! defined $name ){
$new_filter = $filter;
}
}
elsif( ! ref $filter ){
$name = $filter;
}
if( defined($name) && $name eq 'required' ){
}
return $new_filter;
}

sub _apply_filters {
my $self = shift;
my $input = $self->input;
for my $filter ( @{ $self->filters || [] } ){
$filter = $self->_make_filter( $filter );
eval{ $self->input( $filter->{action}->($input) ) };
if( $@ ){
my @message;
if( ref $filter->{message} ){
@message = @{$filter->{message}};
}
elsif( defined $filter->{message} ){
@message = ( $filter->{message} );
}
else{
@message = ( $@ );
}
$self->add_error( @message );
}
}
}

=head2 validate
Expand Down
51 changes: 51 additions & 0 deletions t/filters.t
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
use Test::More;
use lib 't/lib';

use DateTime;

BEGIN
{
plan tests => 4;
}

{
package My::Form;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler';

has_field 'sprintf_filter' => (
type => 'Text',
filters => [ sub{ sprintf '<%.1g>', $_[0] } ]
);
has_field 'date_time_error' => (
type => 'Text',
filters => [ sub{ DateTime->new( $_[0] ) } ],
);
has_field 'date_time' => (
type => 'Compound',
filters => [ sub{ DateTime->new( $_[0] ) } ],
);
has_field 'date_time.year' => ( type => 'Text', );
has_field 'date_time.month' => ( type => 'Text', );
has_field 'date_time.day' => ( type => 'Text', );

}


my $form = My::Form->new();
ok( $form, 'get form' );

my $params = $form->validate(
{
sprintf_filter => '100',
date_time_error => 'aaa',
'date_time.year' => 2009,
'date_time.month' => 4,
'date_time.day' => 16,
}
);

is( $form->field('sprintf_filter')->value, '<1e+02>', 'sprintf filter' );
ok( $form->field('date_time_error')->has_errors, 'DateTime error catched' );
is( ref $form->field('date_time')->value, DateTime, 'DateTime object created' );

0 comments on commit 329a31a

Please sign in to comment.