[html-formfu] DBIC: setting accessor for a Select element
triggers options_from_model()
Carl Franks
fireartist at gmail.com
Fri Feb 22 14:25:37 GMT 2008
On 22/02/2008, Andreas Marienborg <omega at palle.net> wrote:
>
> On Feb 22, 2008, at 12:08 PM, Carl Franks wrote:
>
> > On 21/02/2008, Steve Caldwell <info-formfu at caldwellhb.com> wrote:
> >> I'm building a form that has a Select element that I'm mapping to a
> >> non-column accessor on my DBIC object, as described in "non-column
> >> accessors" in the HTML::FormFu::Model::DBIC POD, like this:
> >>
> >> ---
> >> action: /foo
> >> elements:
> >> - type: Select
> >> name: bar
> >> label: Your Bar
> >> db:
> >> accessor: bar
> >> options:
> >> - [ 01, January ]
> >> - [ 02, February ]
> >>
> >> When I then try and populate it from my DBIC object:
> >>
> >> $form->defaults_from_model( $myobj );
> >>
> >> HTML::FormFu::Model::DBIC::options_from_model gets called (thanks to
> >> line 44 in HTML::FormFu::Element::_Group), which then overwrites the
> >> options I've set from my select list with a bunch of stuff from the
> >> database. This is obviously not what I want here.
> >>
> >> Anyone else come across this problem? The work-around isn't that
> >> much
> >> work (manually populate from and save to my object instead of using
> >> defaults_from_model() and save_to_model()), but it would be cooler
> >> if it
> >> all worked correctly.
> >
> > I agree that this is broken.
> > I think Select automatically calling options_from_model() is a case of
> > *too much magic*
> >
> > (sidenote) - I know you've only just subscribed to the list, so a
> > quick explanation, so that you understand my following proposal:
> > FormFu in svn has been changed so that you set Model/DBIC options
> > with:
> > $field->{model_config}{DBIC}
> > instead of:
> > $field->{db}
> >
> > This will be in the next cpan release. However, setting {db} will
> > still work, and Do The Right Thing, it'll just print a warning that
> > it's deprecated and will be removed at some point in the future.
> >
> > The reason for this, is the model was implemented as a bit of a
> > rush-job and we need to get it working properly to support multiple
> > models - much like how Catalyst handles models.
> > (/sidenote)
> >
> > I suggest we require that a new option be set to run
> > options_from_model(), such as:
> >
> > ---
> > element:
> > type: Select
> > name: foo
> > model_config:
> > DBIC:
> > options_from_model: 1
> >
> > (or, in the old, deprecated, style):
> >
> > ---
> > element:
> > type: Select
> > name: foo
> > db:
> > options_from_model: 1
> >
> > Any opinions on this?
>
>
> Could the default be to run it if:
>
> - no options_from_model: 0 (false) exists
> AND
> - no options already set on the select?
Hmm, yes - I suppose that any options should have already been added
before $form->process() is called - so if there's no select options
yet, we can take that as a hint that a little magic might be
appropriate.
I think I could go for that.
However, it means that _Group needs a new accessor to return the
current option list.
Some tests delve into {_options}, but that's unacceptable for core
code outside of _Group.pm
Carl
More information about the HTML-FormFu
mailing list