[html-formfu] HTML::FormFu::Element::DBIC::Select for review

Daisuke Maki daisuke at endeworks.jp
Sun Sep 9 09:40:37 GMT 2007


One of the things I'd like to see is the ability to specify both the 
condition from which to select the elements to be in the select field, 
as well as the ability to sort the elements by an arbitrary criteria.


What do you think about being able to specify %where and %attr that 
search() will use?

--d

Mario Minati wrote:
> Hello @all,
> 
> I would like to share my HTML::FormFu::Element::DBIC::Select class, as the 
> community around FormFu is growing now, someone else might need it or use it 
> for inspiration.
> 
> It has no documentation and test, it's just working(tm).
> 
> I use it to create select boxes which gets it's data from the table, where 
> also the models have relations. 
> 
> It takes as parameters:
> model - the dbic model name
> search - the search function to use (search by default)
> name_field - the fieldname containing the displayed name (the name field of 
> the element by default)
> value_field - the fieldname containing the value ('id' by default)
> 
> Greets,
> Mario
> 
> PS:
> Maybe someone else can think about the shortcut I build in for performance 
> reasons. Do I might ran in a DB issue?
> 
> ==============================
> 
> package HTML::FormFu::Element::DBIC::Select;
> 
> use strict;
> use warnings;
> 
> use base 'HTML::FormFu::Element::Select';
> 
> use Carp;
> 
> 
> __PACKAGE__->mk_accessors( qw/
>     model
>     search
>     name_field
>     value_field
> / );
> 
> 
> sub process {
>     my $self = shift;
> 
>     $self->_add_options;
> 
>     my $process = $self->next::method( { @_ ? %{ $_[0] } : () } );
> 
>     return $process;
> }
> 
> 
> sub render {
>     my $self = shift;
> 
>     $self->_add_options;
> 
>     my $render = $self->next::method( { @_ ? %{ $_[0] } : () } );
> 
>     return $render;
> }
> 
> 
> sub _add_options {
>     my $self = shift;
> 
>     # shortcut
>     if (defined $self->{__data}) {
>         $self->options( $self->{__data} );
>         return;
>     }
> 
>     my $stash = $self->form->{stash};
> 
>     # check model name
>     $self->model
>         or die "Model not named - Need model name for DB check.";
> 
>     # check Catalyst context
>     $stash->{context}
>         or die "Catalyst context not available.";
> 
>     # check for valid model
>     my $model = $stash->{context}->model( $self->model )
>         or die "Model not defined - DB check failed for model '". 
> $self->model. "'.";
> 
>     # search function
>     my $search = $self->search() || 'search';
> 
>     # get data
>     my @data = $model->$search()->all();
> 
>     # get name and value fields
>     my $name_field = $self->name_field  || $self->name;
>     my $value_field = $self->value_field || 'id';
> 
>     # create array of options
>     my @options = map { [ $_->$value_field, $_->$name_field ] } @data;
> 
>     # safe for shortcut
>     $self->{__data} = \@options;
> 
>     # set array of options
>     $self->options( \@options );
> 
>     return;
> }
> 
> 
> 1;
> 
> __END__
> 
> _______________________________________________
> HTML-FormFu mailing list
> HTML-FormFu at lists.scsys.co.uk
> http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/html-formfu
> 




More information about the HTML-FormFu mailing list