Hi all,

I have a form with two Select fields with custom inflators, e.g. a "city" field and a "state" field that inflate to a My::City and My::State object. The values for the select fields are ids that are then passed to the database to inflate into the respective object. I want to have code that, post-process, will override any submitted state value to match that of the city (if a city has been provided), e.g.:

# request has city=id_for_seattle_washington, state=id_for_arizona
$form->process($request);

# $form->param_value('city') is a My::City object
# $form->param_value('state') is a My::State object

...

# This will print "Arizona"
print $form->param_value('state')->name;

if ($form->param_value('city')) {
  $form->add_valid('state', $form->param_value('city')->state);
}

# Now this will print "Washington"
print $form->param_value('state')->name;

The above code all works fine, until I go to render the form. The 'state' dropdown does not have anything selected, neither Washington nor Arizona. If I change the code so that we pass the id to add_valid(), e.g.:

...
if ($form->param_value('city')) {
  $form->add_valid('state', $form->param_value('city')->state_id);
}
...

The form renders fine but we choke on this line:

print $form->param_value('state')->name;

because param_value now returns a plain scalar holding the ID rather than an inflated object. I guess this is because inflators are not run after calls to add_valid.

I got around this by adding code to look at the return of param_value and inflate on my own if it's not a ref to a My::State, but this is somewhat kludgy and involves a chunk of duplicate code. Is there a more elegant way of doing this?

I should note that I also have deflators for both elements that do what you would expect, but they don't seem to help in this situation.

Thanks,
Steve

_______________________________________________
HTML-FormFu mailing list
[email protected]
http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu

Reply via email to