[html-formfu] Repeatable block will not save records

Tim Rayner tfrayner at gmail.com
Tue Jan 20 14:05:46 GMT 2009


2009/1/19 David Schmidt <davewood at gmx.at>:
> I have been looking for this solution for days now. Thank you so much.
>
> Related to this problem.
> If a constraint of one of the repeatable elements fails, the form is
> re-displayed but the error message is not displayed.

Hi,

I've run into this problem as well. After poking around in the code
this morning, I've tracked the problem down to the call to
$block->repeat in H::F::Model::DBIC. This call apparently discards the
errors in a Repeatable block on any call to
$form->model()->default_values( $my_obj ). I've attempted to fix the
problem, and I've found that adding the following code to
H::F::Model::DBIC works, after a fashion (tested with Integer and
DependOn constraints):

            # store our errors temporarily while the block repeats are built.
            my %error_cache
                = map { $_->nested_name => $_->get_errors }
                     @{ $block->get_fields() };

            my $blocks = $block->repeat($count); # <----- the original
line of code.

            # reinstate the errors.
            foreach my $new_block ( @$blocks ) {
                foreach my $new_field ( @{ $new_block->get_fields } ) {
                    foreach my $error ( @{ $error_cache{
$new_field->nested_name } || [] } ) {

                        # add the error to the field
                        $new_field->add_error( $error );

                        # reparent the error and its constraint.
                        $error->parent( $new_field );
                        $error->processor->parent( $new_field );
                    }
                }
            }


This feels pretty nasty to me (I'm worried I've missed some
reparenting, and there are probably edge cases I don't know about),
but hopefully it may point the way to others better acquainted with
HTML::FormFu internals.

Cheers,

Tim



More information about the HTML-FormFu mailing list