[html-formfu] More complex DBIC/FormFu interaction

Nigel Metheringham nigel.metheringham at dev.intechnology.co.uk
Tue Aug 31 12:19:49 GMT 2010


I am attempting to put together a form that handles an intersection
between 2 different database objects.

I'll attempt to explain this in words - hopefully its clear. If not
I can get out the object definitions, but they have additional
clutter around which may make things muddier :-)

This is for a theatre backstage management system. I'm using [] to
show row objects in the description below - so [event] is the row
class/object for an event.

We have an [event] (ie a show in the theatre). An [event] has many
[booking]s (ie a hire session)

We also have a number of [staff]

I want a form to allow a particular [staff] member to volunteer for
[bookings] within a specified [event]

There is a linking table for this - [crew_volunteer] - which has a
belongs to relation to [booking] and [staff], ([staff] has many
[crew_volunteer] and many-to-many [booking] - and the same in
reverse - ie a typical linking table).

So at the point where I am generating the form I have 2 objects -
[event] and [staff]

Now if I have a YAML form config like this...
    elements:
      - type: Checkboxgroup
        name: bookings
        model_config:
          label_column: text_info
          resultset: Booking
          attributes:
            order_by: start
            prefetch: booking_type
          condition:
            event: 382

and use a typical Catalyst::Controller::HTML::FormFu like this:-

    # check and process form
    if ( $form->submitted_and_valid && ( lc( $form->method ) eq 'post' ) ) {
        $c->log->debug('Dealing with form to update user');
        $form->model->update($staff);
    }
    elsif ( $form->has_errors ) {
        $c->log->debug( 'Errors in form: ' . Dumper( $form->get_errors ) );
    }
    elsif ( !$form->submitted ) {
        $c->log->debug('Setting form default values');
        $form->model->default_values($staff);
    }

That works fine, except I have hard coded the [event] I am working
with (the condition section within the model_config) - I want it to
work with the [event] that is passed to the controller. So I tried
finagling that within the first part of the code within the
controller:-

    # splice event info into the form as a restriction
    my $element = $form->get_element( { name => 'bookings' } );
    my $modelcf = $element->model_config();
    $modelcf->{condition} = { event => $event->id };
    $element->model_config($modelcf);
    $form->process;    # need to redo this explicitly due to change above

However the FormFu Model code is not picking up the changed condition
(including if I delete the YAML condition config entirely).

Now I could entirely build the element within the perl controller
code - I have used that elsewhere for where its a non-database type
form - but I'm starting to embed presentation and config into the
controller.

So how can I add a dynamic restriction to a database many-to-many
select form? Is there a much cleaner mechanism I should be using?
Can I just override the caching that appears be taking part within
this element?

    Nigel.
--
[ Nigel Metheringham             Nigel.Metheringham at InTechnology.com ]
[ - Comments in this message are my own and not ITO opinion/policy - ]







More information about the HTML-FormFu mailing list