On Apr 3, 2008, at 4:47 PM, Carl Franks wrote:

On 28/02/2008, Zbigniew Lukasiak <[EMAIL PROTECTED]> wrote:
On Wed, Feb 27, 2008 at 11:01 PM, Carl Franks <[EMAIL PROTECTED]> wrote:
On 22/02/2008, Andreas Marienborg <[EMAIL PROTECTED]> wrote:

On Feb 22, 2008, at 12:08 PM, Carl Franks wrote:

On 21/02/2008, Steve Caldwell <[EMAIL PROTECTED]> 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?

okay, we need to revisit this :(

I've moved HTML/FormFu/Model/DBIC.pm out into a separate distribution. $form->model_class() has been renamed to default_model() and no longer
defaults to 'DBIC'.
(more on that to come in another mail!)

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).

Minimal change from current.  I haven't got any intuition about using
multiple models in one form - but if we allow for one default model -
then the last significant line could be:
[ $self->form->model()->options_from_model( $self, $args ) ] );

The model should know that it is a DBIC model and choose the right
part of $args passed to it.  Or even you could get rid of that level
in the hash - as it does not really make sense to have both DBIC and
LDAP options for one field:

- type: Select
   name: type2_id
   model_config:
     DBIC:
       resultset: Type2
     LDAP:
       some_ldap_option: value

Does that make sense?  I cannot imagine any situation when this would
be needed.  So I would say just do:

- type: Select
   name: type2_id
   model_config:
     model_name: DBIC
     resultset: Type2

Okay, I don't like it - but I'm inclined to agree that it'll be by far
the most common usage to only use 1 model n any app - so lets make it
easier.

I don't imagine a form updating 2 different models at once, but I can
imagine scenarios where a single element definition might have to be
aware of 2 models.

Andreas - you've been doing some LDAP model work - do you envisage any
problems with different models sharing the same level off of model_config?

 can't even see where one would use both models in the same app atm :)

Do we even need to mention the LDAP/DBIC stuff in the config?

When I do things now, I do $form->model('DBIC/LDAP')->update($item); - >default_values($item) etc

so basicly the model_config should be model agnostic?

- type: Select
name: blah
model:
   resultset: BlahSet

or keep model_config as the name perhaps, as to not change too much.

- andreas

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

Reply via email to