X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=lib%2FMaypole%2FModel%2FCDBI%2FDFV.pm;h=a16fa30e3adea337dba6239ee6ec8b8df98a424f;hb=99967c293b1b617a0cac8126f923f6acfa2e4598;hp=fcf80fbf96eadd1577c59f1472a07645bf939250;hpb=dcc33148f1b562834e16f658e34270f3f581833c;p=maypole.git diff --git a/lib/Maypole/Model/CDBI/DFV.pm b/lib/Maypole/Model/CDBI/DFV.pm index fcf80fb..a16fa30 100644 --- a/lib/Maypole/Model/CDBI/DFV.pm +++ b/lib/Maypole/Model/CDBI/DFV.pm @@ -36,11 +36,13 @@ of CGI::Untaint. For teh win!! =cut use Class::C3; -use Maypole::Config; use Data::FormValidator; +use Data::Dumper; + +use Maypole::Config; use Maypole::Model::CDBI::AsForm; -use base qw(Maypole::Model::Base); +use base qw(Maypole::Model::CDBI::Base); Maypole::Config->mk_accessors(qw(table_to_class _COLUMN_INFO)); @@ -61,7 +63,9 @@ Maypole::Config->mk_accessors(qw(table_to_class _COLUMN_INFO)); sub setup_database { my ( $self, $config, $namespace, $classes ) = @_; $config->{classes} = $classes; - foreach my $class (@$classes) { $namespace->load_model_subclass($class); } + foreach my $class (@$classes) { + $namespace->load_model_subclass($class); + } $namespace->model_classes_loaded(1); $config->{table_to_class} = { map { $_->table => $_ } @$classes }; $config->{tables} = [ keys %{ $config->{table_to_class} } ]; @@ -92,6 +96,21 @@ sub adopt { } } +=head2 check_params + + Checks parameters against the DFV profile for the class, returns the results + of DFV's check. + + my $dfv_results = __PACKAGE__->check_params($r->params); + +=cut + +sub check_params { + my ($class,$params) = @_; + return Data::FormValidator->check($params, $class->dfv_profile); +} + + =head1 Action Methods Action methods are methods that are accessed through web (or other public) interface. @@ -121,7 +140,7 @@ sub do_edit : Exported { return; } - my $required_cols = $class->required_columns; + my $errors; if ($obj) { ($obj,$errors) = $class->_do_update($r,$obj); @@ -165,6 +184,7 @@ sub _do_update { } my $this_class_params = { map { $_ => $r->{params}{$_} } $class->columns }; + delete $this_class_params->{route_id}; # update or make other related (must_have, might_have, has_many etc ) unless ($errors) { @@ -172,7 +192,8 @@ sub _do_update { # get related object if it exists my $rel_meta = $class->related_meta('r',$accssr); if (!$rel_meta) { - $class->_croak("No relationship for $accssr in " . ref($class)); + $r->warn("[_do_update] No relationship for $accssr in " . ref($class)); + next; } my $rel_type = $rel_meta->{name}; @@ -191,28 +212,30 @@ sub _do_update { $obj->set( %$this_class_params ); $obj->update; } - - return ($obj,$errors); + return ($obj,$errors); } sub _do_create { my ($class,$r) = @_; my $errors; my $this_class_params = { map { $_ => $r->{params}{$_} } $class->columns }; - my $obj = eval { My::DBI->create( $this_class_params ) }; + my $obj; - my $dfv_results = ($obj) ? undef : $class->dfv_results->msgs ; - - # handle dfv errors - if ( $dfv_results->has_missing ) { # missing fields - foreach my $field ( $dfv_results->missing ) { - $errors->{$field} = "$field is required"; + my $dfv_results = Data::FormValidator->check($r->{params}, $class->dfv_profile); + if ($dfv_results->success) { + $obj = $class->create($this_class_params); + } else { + # handle dfv errors + if ( $dfv_results->has_missing ) { # missing fields + foreach my $field ( $dfv_results->missing ) { + $errors->{$field} = "$field is required"; + } } - } - if ( $dfv_results->has_invalid ) { # Print the name of invalid fields - foreach my $field ( $dfv_results->invalid ) { - $errors->{$field} = "$field is invalid: " . $dfv_results->invalid( $field ); + if ( $dfv_results->has_invalid ) { # Print the name of invalid fields + foreach my $field ( $dfv_results->invalid ) { + $errors->{$field} = "$field is invalid: " . $dfv_results->invalid( $field ); + } } } @@ -235,7 +258,8 @@ sub _create_related { my $created = []; my $rel_meta = $self->related_meta('r',$accssr); if (!$rel_meta) { - $self->_croak("No relationship for $accssr in " . ref($self)); + $self->_carp("[_create_related] No relationship for $accssr in " . ref($self)); + return; } my $rel_type = $rel_meta->{name}; @@ -292,7 +316,7 @@ sub _column_info { # update with required columns from DFV Profile my $profile = $class->dfv_profile; - $class->required_columns(@{$profile->{required}}); + $class->required_columns($profile->{required}); return $class->COLUMN_INFO; }