Index: lib/HTML/FormFu.pm =================================================================== --- lib/HTML/FormFu.pm (revision 1341) +++ lib/HTML/FormFu.pm (working copy) @@ -177,17 +177,40 @@ } sub default_values { - my ( $self, $default_ref ) = @_; + my ( $self, $data ) = @_; + my $elements = $self->get_elements; + foreach my $element ( @{$elements}) { + my $name = $element->name; + $name =~ s/_\d+$//; + if($element->isa('HTML::FormFu::Element::Repeatable')) { + my $k = scalar @{$data->{$name}}; + $element->repeat($k); + my $childs = $element->get_elements; + for(my $i = 0; $i < $k; $i++) { + default_values($childs->[$i], $data->{$name}->[$i]); + } + } elsif($element->isa('HTML::FormFu::Element::Multi')) { + ref $data->{$name} eq "HASH" + ? default_values($element, $data->{$name}) + : $element->default( $data->{$name}); + } elsif($element->isa('HTML::FormFu::Element::Block')) { + default_values($element, $name ? $data->{$name} : $data); + } else { + next if !defined $data->{$name}; + $element->default( $data->{$name} ); + } + + + } - for my $field ( @{ $self->get_fields } ) { - my $name = $field->nested_name; - next if !defined $name; - next if !exists $default_ref->{$name}; + return $self; - $field->default( $default_ref->{$name} ); - } +} - return $self; +sub _default_values { + my ($self, $elements, $data) = @_; + + } sub model { Index: t/form/default_values.t =================================================================== --- t/form/default_values.t (revision 1341) +++ t/form/default_values.t (working copy) @@ -1,24 +1,117 @@ use strict; use warnings; -use Test::More tests => 3; +use Test::More tests => 16; use HTML::FormFu; -my $form = HTML::FormFu->new({ tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } }); +my $form = HTML::FormFu->new( + { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } ); $form->element('Text')->name('foo'); $form->element('Checkbox')->name('bar')->value('y'); -$form->default_values( { - foo => 'x', - bar => 'y', - } ); +$form->auto_fieldset(1); +$form->populate( + { + elements => [ + { + type => "Repeatable", + name => "many", + elements => [ + { name => "id" }, + { + type => "Block", + name => "nested", + elements => [ { type => "Text", name => "foo" } ] + } + ] + }, + { + type => "Select", + name => "single-select", + options => [ [qw(1 foo)], [qw(2 bar)] ] + }, + { + type => "Select", + name => "multi-select", + options => [ [qw(1 foo)], [qw(2 bar)] ] + }, + { + type => "Block", + name => "nested", + elements => [ { type => "Text", name => "foo" } ] + }, + { + type => "Multi", + name => "address", + elements => [ { name => "street" }, { name => "number" } ] + }, + { + type => "Multi", + name => "address-split", + elements => [ { name => "street" }, { name => "number" } ], + deflators => [ { type => "CompoundSplit" } ] + }, { type => "SimpleTable", rows => [[{name => "table1"}]]} + ] + } +); + +$form->default_values( + { + foo => 'x', + bar => 'y', + many => [ + { id => 1, nested => { foo => "bar" } }, + { id => 2, nested => { foo => "baz" } } + ], + 'single-select' => 1, + 'multi-select' => [ 1, 2 ], + nested => { foo => "bar" }, + address => { street => "Lombardstreet", number => 22 }, + 'address-split' => "Lombardstreet 22", + table1 => "test" + } +); + $form->process; like( $form->get_field('foo'), qr/value="x"/ ); like( $form->get_field('bar'), qr/value="y"/ ); like( $form->get_field('bar'), qr/checked="checked"/ ); + +like( $form->get_field('single-select'), qr/value="1" selected="selected"/ ); +like( $form->get_field('single-select'), qr/value="2">/ ); + +like( $form->get_field('multi-select'), qr/value="1" selected="selected"/ ); +like( $form->get_field('multi-select'), qr/value="2" selected="selected"/ ); + +like( $form->get_field('address'), qr/name="address.street" type="text" value="Lombardstreet"/ ); +like( $form->get_field('address'), qr/name="address.number" type="text" value="22"/ ); + +like( $form->get_field('address-split'), qr/name="address-split.street" type="text" value="Lombardstreet"/ ); +like( $form->get_field('address-split'), qr/name="address-split.number" type="text" value="22"/ ); + +like( $form->get_field('table1'), qr/name="table1" type="text" value="test"/); + + +like( + $form->get_all_element( { name => 'many' } ), + qr/name="id_1" type="text" value="1"/ +); +like( + $form->get_all_element( { name => 'many' } ), + qr/name="id_2" type="text" value="2"/ +); +like( + $form->get_all_element( { name => 'many' } ), + qr/name="foo_1" type="text" value="bar"/ +); +like( + $form->get_all_element( { name => 'many' } ), + qr/name="foo_2" type="text" value="baz"/ +); +