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"/
+);
+