package HTML::FormFu::Deflator::CompoundSplit;
use strict;
use base 'HTML::FormFu::Deflator';
__PACKAGE__->mk_accessors(qw/ split join field_order /);
sub deflator {
my ( $self, $value ) = @_;
return unless defined $value && $value ne "";
my ( $multi, @fields ) = @{ $self->parent->get_fields };
my $split = $self->split;
$split = qr/ +/, if !defined $split;
my $join = $self->join;
$join = ' ' if !defined $join;
my @parts = CORE::split $split, $value;
if ( my $order = $self->field_order ) {
my @new_order;
FIELD: for my $i (@$order) {
for my $field (@fields) {
if ( $field->name eq $i ) {
push @new_order, $field;
next FIELD;
}
}
}
@fields = @new_order;
}
my %value;
for my $i ( 0 .. $#fields ) {
# if there are more parts than fields, join the extra ones
# to make the final field's value
if ( $i == $#fields ) {
my $default = CORE::join $join, @parts[ $i .. $#parts ];
$fields[$i]->default($default);
$value{ $fields[$i]->name } = $default;
}
else {
$fields[$i]->default( $parts[$i] );
$value{ $fields[$i]->name } = $parts[$i];
}
}
return \%value;
}
1;
__END__
=head1 NAME
HTML::FormFu::Deflator::CompoundSplit - CompoundSplit deflator
=head1 SYNOPSIS
---
element:
- type: Multi
name: address
elements:
- name: number
- name: street
deflator:
- type: CompoundSplit
# set the default
$form->get_field('address')->default( $address );
=head1 DESCRIPTION
Deflator to allow you to set several field's values at once.
For use with a L group of fields.
A L value passed to the
L field will be split according to the
L setting, and it's resulting parts passed to it's child elements.
=head1 METHODS
=head2 split
Arguments: $regex
Default Value: C
Regex used to split the default value. Defaults to a regex matching 1 or more
space characters.
=head2 join
Arguments: $string
Default Value: C<' '>
If spliting the value results in more parts than there are fields, any extra
parts are joined again to form the value for the last field. The value of
L is used to join these values.
Defaults to a single space.
For example, if the Multi element contains fields C and C,
and is given the value C<10 Downing Street>; when split this results in 3
parts: C<10>, C and C. In this case, the 1st part, C<10> is
assigned to the first field, and the 2nd and 3rd parts are re-joined with a
space to give the single value C, which is assigned to the
2nd field.
=head2 field_order
Arguments: \@order
If the parts from the split value should be assigned to the fields in a
different order, you must provide an arrayref containing the names, in the
order they should be assigned to.
---
element:
- type: Multi
name: address
elements:
- name: street
- name: number
deflator:
- type: CompoundSplit
field_order:
- number
- street
=head1 AUTHOR
Carl Franks
=head1 LICENSE
This library is free software, you can redistribute it and/or modify it under
the same terms as Perl itself.
=cut