[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