]> git.decadent.org.uk Git - maypole.git/blobdiff - lib/Maypole/Model/CDBI/DFV.pm
applied patch from nicg : Modified DFV.pm to allow for multiple column primary keys
[maypole.git] / lib / Maypole / Model / CDBI / DFV.pm
index 61ab5a62a3f8c09f9c5e021b4752e970b011082f..ca3609c193578760322f983fc1eb0840426332ca 100644 (file)
@@ -96,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.
@@ -125,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);
@@ -137,10 +152,6 @@ sub do_edit : Exported {
   if (ref $errors) {
     # pass errors to template
     $r->template_args->{errors} = $errors;
-    foreach my $error (keys %$errors) {
-      $r->template_args->{errors}{ucfirst($error)} = $errors->{$error}
-    }
-
     # Set it up as it was:
     $r->template_args->{cgi_params} = $r->params;
     $r->template("edit");
@@ -168,7 +179,22 @@ sub _do_update {
     }
   }
 
-  my $this_class_params = { map { $_ => $r->{params}{$_} }  $class->columns  };
+
+  my $this_class_params = {};
+
+
+  # NG changes start here.
+  # Code below fails to handle multi col PKs
+  my @pks = $class->columns('Primary');
+
+  foreach my $param ( $class->columns ) {
+    # next if ($param eq $class->columns('Primary'));
+    next if grep {/^${param}$/} @pks;
+
+    my $value = $r->params->{$param};
+    next unless (defined $value);
+    $this_class_params->{$param} = ( $value eq '' ) ?  undef : $value;
+  }
 
   # update or make other related (must_have, might_have, has_many  etc )
   unless ($errors) {
@@ -176,7 +202,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};
@@ -197,35 +224,36 @@ sub _do_update {
   }
 
   return ($obj,$errors);
-
 }
 
 sub _do_create {
   my ($class,$r) = @_;
   my $errors;
-  my $this_class_params = { map { $_ => $r->{params}{$_} }  $class->columns  };
-  my $dfv_results;
-  my $obj;
 
-  if ($class->isa('Class::DBI::DFV')) {
-    $obj = eval { My::DBI->create( $this_class_params ) };
-    $dfv_results = ($obj) ? undef :  $class->dfv_results ;
-  } else {
-    $dfv_results = Data::FormValidator->check($r->{params}, $class->dfv_profile);
-    if ($dfv_results->success) {
-      $obj = $class->create($this_class_params);
-    }
+  my $this_class_params = {};
+  foreach my $param ( $class->columns ) {
+    next if ($param eq $class->columns('Primary'));
+    my $value = $r->params->{$param};
+    next unless (defined $value);
+    $this_class_params->{$param} = ( $value eq '' ) ?  undef : $value;
   }
 
-  # handle dfv errors
-  if ( $dfv_results->has_missing ) {   # missing fields
-    foreach my $field ( $dfv_results->missing ) {
-      $errors->{$field} = "$field is required";
+  my $obj;
+
+  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 );
+      }
     }
   }
 
@@ -248,7 +276,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};
@@ -305,7 +334,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;
 }