[html-formfu] HTML::FormFu::Model::DBIC only deleting or saving the first has_many relationship in a Repeatable block

Zbigniew Lukasiak zzbbyy at gmail.com
Thu Feb 28 11:47:29 GMT 2008


Hi Byron,

I have just added a test to check if a second delete will work to the
svn - and it works.  You can checkout the code and check if the tests
pass for you (its at:
https://html-formfu.googlecode.com/svn/trunk/HTML-FormFu-Model-DBIC -
the test in question is in
t/update/has_many_repeatable_delete_true.yml, you need also to
checkout https://html-formfu.googlecode.com/svn/trunk/HTML-FormFu).

But in fact I think I have found your problem - you have not added the
count field which is mandatory for Repeatable blocks.  At some time
I'll check if we can get rid of this requirement - but for now you
need to add:

  - type: Hidden
    name: count

Cheers,
Zbigniew Lukasiak
http://perlalchemy.blogspot.com/

On Thu, Feb 28, 2008 at 10:18 AM, Byron Young <Byron.Young at riverbed.com> wrote:
> Hi all,
>
>  I'm trying to create a form for my DBIC class that has the following
>  has_many relationship:
>
>  __PACKAGE__->has_many(
>   "module_parameters",
>   "NBT::IceBox::Schema::ModuleParameters",
>   { "foreign.module" => "self.id" },
>  );
>
>
>  The HTML::FormFu::Model::DBIC doc says to create a Repeatable block,
>  which I've done.  It works great for displaying the relationships -
>  everything is fille d out correctly and I see the right number of items.
>
>  I'm running into trouble, however, when I try to use the new_empty_row
>  and delete_if_true settings.  It seems they only work for the first item
>  in the has_many list.
>
>  So, for example, if I have 4 module_parameters on my form and I check
>  'delete' for all of them and then submit, only the first one is deleted.
>  To be more specific, if I select 'delete' for the last 3
>  module_parameters, nothing is deleted.
>
>  Or, for new_empty_row, if I have no current module_parameters and I
>  enter something into the empty row's 'name' box, i will get a new
>  module_parameter as expected.  But, if there are 1 or more
>  module_parameters already there, anything entered into the empty row is
>  ignored, and I can't get any new relationships added beyond the first.
>
>  Is this a bug or am I doing it wrong?  I couldn't find anything on CPAN,
>  the google code site, the mailing list, or in the code itself that
>  explains it.
>
>
>  Here is my Repeatable block:
>
>   - type: Repeatable
>     nested_name: module_parameters
>     attributes:
>       class: block
>     db:
>       new_empty_row: name
>
>     elements:
>       - type: Hidden
>         name: id
>
>       - type: Text
>         name: name
>         label: Name
>         attributes:
>           title: Parameter name
>
>       - type: Checkbox
>         name: is_required
>         label: Required
>         value: 1
>         attributes:
>           title: Is this parameter required?
>
>       - type: Checkbox
>         name: is_enum
>         label: Enum
>         value: 1
>         attributes:
>           title: Is this an enumerated type?
>
>       - type: Checkbox
>         name: delete
>         label: Delete this parameter?
>         value: 1
>         attributes:
>           title: Check to delete this parameter
>         db:
>           delete_if_true: 1
>
>
>  And, for completion, my save method (pretty much the standard FormConfig
>  method.  fetch() just grabs the object from the database or creates a
>  new one and puts it in the stash):
>
>  sub save : PathPart Chained('fetch') Args(0) FormConfig
>  {
>     my ($self, $c) = @_;
>
>     $c->stash->{title} = "Save " . $self->display_name;
>
>     my $f     = $c->stash->{form};
>     my $o     = $c->stash->{object};
>
>     # return if there was a problem with any param values
>     if (!$f->submitted_and_valid()) {
>         $c->log->debug("***CRUD.pm - found errors in form");
>         $c->log->debug($f->form_error_message);
>
>         $c->stash->{template} ||= $self->template;
>         return 0;
>     }
>
>     # re-set object's values from the now-valid form
>     $f->save_to_model($o);
>
>     $c->flash->{status_msg} = "Save successful";
>
>     $c->response->redirect($c->uri_for('', $o->id, 'view'));
>  }
>
>  Thanks,
>
>  Byron
>
>  _______________________________________________
>  HTML-FormFu mailing list
>  HTML-FormFu at lists.rawmode.org
>  http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
>



-- 
Zbigniew Lukasiak
http://brudnopis.blogspot.com/



More information about the HTML-FormFu mailing list