[html-formfu] Model::DBIC and nested blocks not updating

Charlie Garrison garrison at zeta.org.au
Tue Sep 8 17:31:40 GMT 2009


Good morning,

I'm having a problem with nested blocks not updating repeatable 
(has_many) records. I think it's a bug but could be a problem 
with my app. My form config looks like this:

elements:
     - type: Text
       name: username
     - type: Text
       name: password

     - type: Block
       nested_name: customer
       elements:
         - type: Text
           name: name_company
         - type: Hidden
           name: id

         - type: Hidden
           name: addr_count

         - type: Repeatable
           nested_name: addresses
           counter_name: addr_count
           model_config:
             empty_rows: 1
             new_rows_max: 1
           elements:
             - type: Hidden
               name: id
             - type: Text
               name: addr_street
               model_config:
                 delete_if_empty: 1

The actual error is DBIC::Validation failure when updating the 
Address record. The validation is failing since all fields are 
empty. Fields are empty because _save_columns is getting 
elements from 'customer' block rather than 'addresses' 
(determined through lots of warn statements, below). If I remove 
the DBIC::Validation checks then all records 
(user/customer/address) are created as expected but the address 
record has blank fields.

My schema setup looks like this:

package Schema::Result::User;
...
__PACKAGE__->might_have(  customer  => 
'Schema::Result::Customer', 'user_id');


package Schema::Result::Customer;
...
__PACKAGE__->has_many(    addresses => 
'Schema::Result::Address', 'customer_id');


package Schema::Result::Address;
...


Watching lots of warn statements I added to Model::DBIC I see 
things like:

doing update for: MyApp::Model::DBIC::User
doing save_columns for: MyApp::Model::DBIC::User
save_columns for: username
save_columns for: password

doing update for: MyApp::Model::DBIC::Customer
doing save_columns for: MyApp::Model::DBIC::Customer
save_columns for: name_company
save_columns for: id
save_columns for: addr_count

doing save_has_many for: MyApp::Model::DBIC::Customer
save_has_many - block for: customer.addresses_1.id
save_has_many - insert for: customer.addresses_1.id
insert_has_many - new_related for: addresses
save_has_many - update for: customer.addresses_1.id

doing update for: MyApp::Model::DBIC::Address
doing save_columns for: MyApp::Model::DBIC::Address
save_columns for: name_company
save_columns for: id
save_columns for: addr_count


And it's the last bit where _save_columns is getting a 
field/element list from the customer block rather than the 
address block.

I've had a look at the code for Model::DBIC but I can't really 
follow all the nested logic to work out how to fix it, or 
determine whether it's a problem with my app/config.

Any help or suggestions would be appreciated.

Thanks,
Charlie

-- 
     Charlie Garrison                   <charlie at garrison.com.au>
     Garrison Computer Services      <http://www.garrison.com.au>
     PO Box 141
     Windsor NSW 2756  Australia             Ph:  +61 2 4579-0612

()  ascii ribbon campaign - against html e-mail
/\  www.asciiribbon.org   - against proprietary attachments

http://www.ietf.org/rfc/rfc1855.txt



More information about the HTML-FormFu mailing list