The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

DBIx::Class::HTMLWidget - Like FromForm but with DBIx::Class and HTML::Widget

SYNOPSIS

You'll need a working DBIx::Class setup and some knowledge of HTML::Widget and Catalyst. If you have no idea what I'm talking about, check the (sparse) docs of those modules.

 package My::Model::DBIC::Pet;
 use base 'DBIx::Class';
 __PACKAGE__->load_components(qw/HTMLWidget Core/);

 
 package My::Controller::Pet;    # Catalyst-style
 
 # define the widget in a sub (DRY)
 sub widget_pet {
   my ($self,$c)=@_;
   my $w=$c->widget('pet')->method('get');
   $w->element('Textfield','name')->label('Name');
   $w->element('Textfield','age')->label('Age');
   ...
   return $w;
 }
   
 # this renders an edit form with values filled in from the DB 
 sub edit : Local {
   my ($self,$c,$id)=@_;

   # get the object
   my $item=$c->model('DBIC::Pet')->find($id);
   $c->stash->{item}=$item;

   # get the widget
   my $w=$self->widget_pet($c);
   $w->action($c->uri_for('do_edit/'.$id));
  
   # fill widget with data from DB
   $item->fill_widget($w);
}

sub do_edit : Local {
  my ($self,$c,$id)=@_;
  
  # get the object from DB
  my $item=$c->model('DBIC::Pet')->find($id);
  $c->stash->{item}=$item;
  
  # get the widget
  my $w=$self->widget_pet($c);
  $w->action($c->uri_for('do_edit/'.$id));
  
  # process the form parameters
  my $result = $w->process($c->req);
  $c->stash->{'result'}=$result;
  
  # if there are no errors save the form values to the object
  unless ($result->has_errors) {
      $item->populate_from_widget($result);
      $c->res->redirect('/users/pet/'.$id);
  }

}

DESCRIPTION

Something like Class::DBI::FromForm / Class::DBI::FromCGI but using HTML::Widget for form creation and validation and DBIx::Class as a ORM.

Methods

fill_widget

$dbic_object->fill_widget($widget);

Fill the values of a widgets elements with the values of the DBIC object.

populate_from_widget

my $obj=$schema->resultset('pet)->new->populate_from_widget($result);
my $item->populate_from_widget($result);

Create or update a DBIx::Class row from a HTML::Widget::Result object

CAEVATS / POSSIBLE PROBLEMS

PostgreSQL

ERROR: null value in column "private" violates not-null constraint

This is a result of we trying to set a value to undef that should not be. This is typicaly a problem when you have a colum such ass "private boolean not null". We have a special-case for this, and if you set data_type => boolean, is_nullable => 0 in your ResultSource definition, we update the value to 0 before attempting to insert or update

AUTHORS

Thomas Klausner, <domm@cpan.org>, http://domm.zsi.at

Marcus Ramberg, <mramberg@cpan.org>

Andreas Marienborg, <omega@palle.net>

CONTRIBUTORS

Simon Elliott, <cpan@browsing.co.uk>

Ashley Berlin

Guillermo Sansovic

LICENSE

This code is Copyright (c) 2003-2006 Thomas Klausner. All rights reserved.

You may use and distribute this module according to the same terms that Perl is distributed under.