[html-formfu] Re: (ping Andreas + zby) Re: DBIC: setting accessor
for a Select element triggers options_from_model()
Carl Franks
fireartist at gmail.com
Thu Jun 5 16:17:35 BST 2008
2008/4/3 Carl Franks <fireartist at gmail.com>:
> On 28/02/2008, Zbigniew Lukasiak <zzbbyy at gmail.com> wrote:
>> On Wed, Feb 27, 2008 at 11:01 PM, Carl Franks <fireartist at gmail.com> wrote:
>> > On 22/02/2008, Andreas Marienborg <omega at palle.net> wrote:
>> > However - there's still DBIC-specific code in Element/_Group.pm to
>> > handle options_from_model()
>> > - this is bad, and needs dealt with.
>> >
>> > I can see 2 ways to deal with this:
>> >
>> > 1) Create a new system to provide hooks that model classes can attach
>> > to, so the user doesn't need to do anything.
>> >
>> > 2) Use the hooks provided by the current plugin system, and require
>> > the user to specifically add it to the Select field.
>> > e.g.
>> > ---
>> > type: Select
>> > name: foo
>> > plugins: [ 'DBIC::LoadOptions' ]
>> > model_config:
>> > DBIC:
>> > model: Foo
>> >
>> > I'm inclined to prefer solution 2, because I foresee the following
>> > problems with solution 1:
>> > - because we currently don't require the user to load the models in
>> > the form config, there's no guarantee that the model will be available
>> > during process(), so the hooks won't get run anyway.
>> > - adding yet-more hooks will make the formfu internals more complex
>> >
>> > Any thoughts?
>>
>>
>> Here is my proposal:
>>
>> sub post_process {
>> my $self = shift;
>>
>> $self->next::method(@_);
>>
>> my $args = $self->model_config;
>>
>> # only call options_from_model if there's no options already
>> # and {options_from_model} isn't 0
>>
>> my $option_count = scalar @{ $self->options };
>>
>> my $option_flag = exists $args->{options_from_model}
>> ? $args->{options_from_model}
>> : 1;
>>
>> if ( $option_count == 0 && $option_flag != 0 ) {
>> $self->options(
>> [ $self->form->model( $args->{model_name}
>> )->options_from_model( $self, $args ) ] );
>> }
>> }
>
> Okay, I can dig that - lets do it!
> Do you want to make the necessary changes?
> (I'm gonna be off-line for the next week, so won't be able to do it
> until after then).
Hmm, thinking about it further, if this happens during post_process(),
we won't be able to use the AutoSet constraint, as that requires the
options are available earlier on during process().
I do consider this a big deal, as I find the AutoSet constraint very helpful.
This keeps causing problems, and I'm really thinking we're going to
have to make it less magic.
I still like my idea of implementing this as a plugin:
type: Select
name: foo
plugins: [ 'OptionsFromModel' ]
model_config:
model: Foo
(better plugin-name suggestions welcome)
I suppose we could keep the current post_process behaviour for people
[ andreas ;) ] that want it, and it just won't run if the plugin has
already populated the options?
Carl
More information about the HTML-FormFu
mailing list