Skip to content

Commit 66df25d

Browse files
committed
merged Model-DBIC branch back into trunk
1 parent 35afcaa commit 66df25d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+3836
-72
lines changed

MANIFEST.SKIP

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
^client-side-constraint
88
^t\b.*\.disabled
99
^t\b.*CatalystApp
10+
^t\/test\.db$
1011

1112
^\.perltidyrc$
1213

Makefile.PL

+2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ test_requires 'Test::NoWarnings';
4141

4242
tests 't/*.t t/*/*.t';
4343

44+
no_index directory => 'examples';
45+
4446
install_script('bin/html_formfu_deploy.pl');
4547
install_share();
4648

benchmarks/login.pl

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
print "No submit\n";
3333

3434
cmpthese(
35-
500,
35+
100,
3636
{
3737
'HTML::FormFu' => sub {
3838
$output = "$formfu";
@@ -58,7 +58,7 @@
5858
print "\nConstruction + submission\n";
5959

6060
cmpthese(
61-
500,
61+
100,
6262
{
6363
'HTML::FormFu' => sub {
6464
my $formfu = HTML::FormFu->new

lib/HTML/FormFu.pm

+30-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ __PACKAGE__->mk_accessors(
4646
localize_class submitted query input _auto_fieldset
4747
_elements _processed_params _valid_names
4848
_output_processors tt_module
49-
nested_name nested_subscript /
49+
nested_name nested_subscript model_class _model /
5050
);
5151

5252
__PACKAGE__->mk_output_accessors(qw/ form_error_message /);
@@ -104,6 +104,7 @@ sub new {
104104
localize_class => 'HTML::FormFu::I18N',
105105
auto_error_class => 'error_%s_%t',
106106
auto_error_message => 'form_%s_%t',
107+
model_class => 'DBIC',
107108
);
108109

109110
$self->populate( \%defaults );
@@ -147,6 +148,34 @@ sub default_values {
147148
return $self;
148149
}
149150

151+
sub model {
152+
my ($self) = @_;
153+
154+
if ( defined ( my $model = $self->_model ) ) {
155+
return $model;
156+
}
157+
158+
my $class = "HTML::FormFu::Model::" . $self->model_class;
159+
160+
require_class($class);
161+
162+
$self->_model( $class );
163+
164+
return $class;
165+
}
166+
167+
sub values_from_model {
168+
my $self = shift;
169+
170+
return $self->model->values_from_model( $self, @_ );
171+
}
172+
173+
sub save_to_model {
174+
my $self = shift;
175+
176+
return $self->model->save_to_model( $self, @_ );
177+
}
178+
150179
sub process {
151180
my $self = shift;
152181

lib/HTML/FormFu/Element.pm

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ __PACKAGE__->mk_attr_accessors(qw/ id /);
2929

3030
__PACKAGE__->mk_accessors(
3131
qw/
32-
name type filename is_field
32+
name type filename is_field is_repeatable db
3333
/
3434
);
3535

@@ -50,6 +50,7 @@ sub new {
5050

5151
$self->attributes( {} );
5252
$self->stash( {} );
53+
$self->db( {} );
5354

5455
if ( exists $attrs{parent} ) {
5556
$self->parent( delete $attrs{parent} );

lib/HTML/FormFu/Element/Block.pm

+12
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,18 @@ sub new {
4444
return $self;
4545
}
4646

47+
sub values_from_model {
48+
my $self = shift;
49+
50+
return $self->form->model->values_from_model(@_);
51+
}
52+
53+
sub save_to_model {
54+
my $self = shift;
55+
56+
return $self->form->model->save_to_model(@_);
57+
}
58+
4759
sub process {
4860
my ($self) = @_;
4961

lib/HTML/FormFu/Element/Radiogroup.pm

+1-3
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ sub _prepare_attrs {
7676

7777
if ( $submitted
7878
&& defined $value
79-
&& (ref $value eq 'ARRAY'
80-
? grep { $_ eq $option->{value} } @$value
81-
: $value eq $option->{value} ) )
79+
&& $value eq $option->{value} )
8280
{
8381
$option->{attributes}{checked} = 'checked';
8482
}

lib/HTML/FormFu/Element/Repeatable.pm

+30-5
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ sub new {
1313
my $self = shift->next::method(@_);
1414

1515
$self->filename('repeatable');
16+
$self->is_repeatable(1);
1617

1718
return $self;
1819
}
@@ -47,8 +48,6 @@ sub repeat {
4748
my @clones = map { $_->clone } @$children;
4849
my $block = $self->element('Block');
4950

50-
map { $_->parent($block) } @clones;
51-
5251
$block->_elements(\@clones);
5352
$block->attributes( $self->attributes );
5453
$block->tag( $self->tag );
@@ -58,21 +57,47 @@ sub repeat {
5857
if ( $self->increment_field_names ) {
5958
for my $field ( @{ $block->get_all_elements } ) {
6059
next unless $field->is_field;
61-
my $name = $field->name;
62-
if ( defined $name && $name =~ /0/ ) {
63-
$name =~ s/0/$rep/;
60+
61+
if ( defined( my $name = $field->name ) ) {
62+
$field->original_name($name);
63+
64+
$name .= "_$rep";
6465
$field->name($name);
6566
}
6667
}
6768
}
6869

70+
_reparent_children( $block );
71+
72+
for my $field (@{ $block->get_fields }) {
73+
map { $_->parent($field) }
74+
@{ $field->_deflators },
75+
@{ $field->_filters },
76+
@{ $field->_constraints },
77+
@{ $field->_inflators },
78+
@{ $field->_validators },
79+
@{ $field->_transformers };
80+
}
81+
6982
push @return, $block;
7083

7184
}
7285

7386
return \@return;
7487
}
7588

89+
sub _reparent_children {
90+
my $self = shift;
91+
92+
return if $self->is_field;
93+
94+
for my $child (@{ $self->get_elements }) {
95+
$child->parent( $self );
96+
97+
_reparent_children( $child );
98+
}
99+
}
100+
76101
sub process {
77102
my ($self) = @_;
78103

lib/HTML/FormFu/Element/Select.pm

+37
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,47 @@ sub new {
1313

1414
$self->filename('input');
1515
$self->field_filename('select_tag');
16+
$self->multi_value(1);
1617

1718
return $self;
1819
}
1920

21+
sub process {
22+
my ($self) = @_;
23+
24+
my $context = $self->form->stash->{context};
25+
my $args = $self->db;
26+
27+
if ( $args && $args->{schema} && $context ) {
28+
my $model = $context->model( $args->{schema} );
29+
return if !defined $model;
30+
31+
my $rs = $model->result_source;
32+
my $id = $args->{id_column};
33+
my $label = $args->{label_column};
34+
35+
if ( !defined $id ) {
36+
($id) = $rs->primary_columns;
37+
}
38+
39+
if ( !defined $label ) {
40+
# use first text column
41+
($label) = grep {
42+
$rs->column_info($_)->{data_type} =~ /text/i
43+
} $rs->columns;
44+
}
45+
return if !defined $label;
46+
47+
my $result = $model->search( {}, { -columns => [$id, $label] } );
48+
49+
my @defaults = map {
50+
[ $_->$id, $_->$label ]
51+
} $result->all;
52+
53+
$self->options( \@defaults );
54+
}
55+
}
56+
2057
sub _prepare_attrs {
2158
my ( $self, $submitted, $value, $default, $option ) = @_;
2259

lib/HTML/FormFu/Element/_DateSelect.pm

+15
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ sub nested_names {
2929
return ( $self->name );
3030
}
3131

32+
sub nested_base {
33+
my $self = shift;
34+
35+
croak 'cannot set nested_base' if @_;
36+
37+
# ignore immediate parent
38+
my $parent = $self->parent;
39+
40+
while ( defined $parent->parent ) {
41+
$parent = $parent->parent;
42+
43+
return $parent->nested_name if defined $parent->nested_name;
44+
}
45+
}
46+
3247
1;
3348

3449
__END__

lib/HTML/FormFu/Element/_Field.pm

+15-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ __PACKAGE__->mk_accessors(
3232
_constraints _filters _inflators _deflators _validators _transformers
3333
_errors container_tag
3434
field_filename label_filename label_tag retain_default force_default
35-
javascript non_param reverse_multi /
35+
javascript non_param reverse_multi multi_value original_name /
3636
);
3737

3838
__PACKAGE__->mk_output_accessors(qw/ comment label value /);
@@ -145,6 +145,20 @@ sub nested_names {
145145
return ( $self->name );
146146
}
147147

148+
sub nested_base {
149+
my $self = shift;
150+
151+
croak 'cannot set nested_base' if @_;
152+
153+
my $parent = $self;
154+
155+
while ( defined $parent->parent ) {
156+
$parent = $parent->parent;
157+
158+
return $parent->nested_name if defined $parent->nested_name;
159+
}
160+
}
161+
148162
sub deflator {
149163
my ( $self, $arg ) = @_;
150164
my @return;

0 commit comments

Comments
 (0)