HTML-FormFu
view release on metacpan or search on metacpan
lib/HTML/FormFu/Model/HashRef.pm view on Meta::CPAN
sub default_values {
my ( $self, $data ) = @_;
map { $_->default(undef) }
( grep { $_->is_field } @{ $self->form->get_all_elements } );
$self->_default_values( $self->form, $data );
return $self;
}
sub _default_values {
my ( $self, $form, $data ) = @_;
my $elements = $form->get_elements;
foreach my $element ( @{$elements} ) {
my $name = $element->name || "";
my $nested_name = $element->nested_name || "";
$name =~ s/_\d+$// if ($name);
if ( $element->is_repeatable ) {
my $value = $data->{$name} || $data->{$nested_name};
unless ($value) {
$element->repeat(0);
map { $element->remove_element($_) }
@{ $element->get_elements };
next;
}
my $k = scalar @{$value};
$element->repeat($k);
my $childs = $element->get_elements;
for ( my $i = 0; $i < $k; $i++ ) {
$self->_default_values( $childs->[$i], $value->[$i] );
}
}
elsif ( $element->is_block && $element->is_field )
{ # is a Multi element
ref $data->{$name} eq "HASH"
? $self->_default_values( $element, $data->{$name} )
: $element->default( $data->{$name} );
}
elsif ( $element->is_block ) {
$self->_default_values( $element,
$nested_name
? $data->{$nested_name}
: $data );
}
else {
if ( $self->inflators && @{ $element->get_inflators } > 0 ) {
my @inflators = @{ $element->get_inflators };
map { $element->default( $_->process( $data->{$name} ) ) }
@inflators;
}
else {
$element->default( $data->{$name} );
}
}
}
return $self;
}
sub update { shift->create(@_) }
sub create {
my $self = shift;
if ( $self->form->submitted ) {
my $input = _escape_hash( $self->form->input );
my $hf = Hash::Flatten->new(
{ ArrayDelimiter => '_', HashDelimiter => '.' } );
$input = _unescape_hash( $hf->unflatten( $self->form->input ) );
$self->default_values(
$self->_unfold_repeatable( $self->form, $input ) );
}
$self->form->render_data;
my $obj = $self->_as_object_get( $self->form );
if ( $self->flatten ) {
my $hf = Hash::Flatten->new(
{ ArrayDelimiter => '_', HashDelimiter => '.' } );
$obj = $self->_unfold_repeatable( $self->form, $hf->flatten($obj) );
}
return $obj;
}
sub _as_object_get {
my $self = shift;
my $form = shift;
my $e = $form->get_all_elements;
my $names = {};
foreach my $element ( @{$e} ) {
my $name = $element->nested_name;
next unless $name;
next if ( $element->type eq "Multi" );
my $es_name = _escape_name($name);
if ( $self->options
&& $element->can('_options')
&& @{ $element->_options } > 0 )
{
my @options = @{ $element->_options };
my @values
= ref $element->default eq "ARRAY"
? @{ $element->default }
: $element->default;
$names->{$es_name} = [];
foreach my $value (@values) {
my @option
= grep { defined $value && $_->{value} eq $value } @options;
unless (@option) {
@options = map { @{ $_->{group} || [] } } @options;
@option = grep { $_->{value} eq $value } @options;
}
my $obj
= [ map { { value => $_->{value}, label => $_->{label} } }
@option ];
push( @{ $names->{$es_name} }, $obj->[0] ) if $name;
}
$names->{$es_name} = $names->{$es_name}->[0] if scalar @values == 1;
$names->{$es_name} ||= { value => undef, label => undef };
}
elsif ( $element->is_field && $self->deflators ) {
my $deflators = $element->get_deflators;
$names->{$es_name} = $element->default
( run in 4.155 seconds using v1.01-cache-2.11-cpan-cdf2f3d4e48 )