X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=lib%2FMaypole%2FModel%2FCDBI%2FFromCGI.pm;h=217570acfc2d51b18bd53cc682070cd3ebddd839;hb=1ec67be9e8b738cbd2a523523af3bd7e61f98480;hp=c5ad4582ea3992dd89fa38560d7e9433fd7dcc15;hpb=833895f46fdd117b0416acff264041af2ce6f46a;p=maypole.git diff --git a/lib/Maypole/Model/CDBI/FromCGI.pm b/lib/Maypole/Model/CDBI/FromCGI.pm index c5ad458..217570a 100644 --- a/lib/Maypole/Model/CDBI/FromCGI.pm +++ b/lib/Maypole/Model/CDBI/FromCGI.pm @@ -1,5 +1,6 @@ package Maypole::Model::CDBI::FromCGI; use strict; +use warnings; =head1 NAME @@ -17,7 +18,7 @@ Maypole::Model:CDBI::FromCGI - Validate form input and populate Model objects $obj = $obj->add_to_from_cgi($r); $obj = $obj->add_to_from_cgi($r, { params => {...} } ); - + # This does not work like in CDBI::FromCGI and probably never will : # $class->update_from_cgi($h, @columns); @@ -29,7 +30,6 @@ on Class::DBI::FromCGI. =cut -use warnings; # The base base model class for apps # provides good search and create functions @@ -101,8 +101,6 @@ Returns errors that ocurred during an operation. sub cgi_update_errors { %{ shift->{_cgi_update_error} || {} } } - - =head2 create_from_cgi Based on the same method in Class::DBI::FromCGI. @@ -233,7 +231,6 @@ sub add_to_from_cgi { unless ref $self; my ($errors, $validated, @created); - my $params = $opts->{params} || $r->params; $opts->{params} = $self->classify_form_inputs($params); ($validated, $errors) = $self->validate_all($r, $opts); @@ -280,12 +277,9 @@ sub validate_all { my $updating = $opts->{updating}; # Base case - validate this classes data - $opts->{all} ||= eval{ $r->config->{$self->table}{all_cols} } || - [$self->columns('All')]; - $opts->{required} ||= eval{ $r->config->{$self->table}{required_cols} } || - []; - my $ignore = $opts->{ignore} || eval{ $r->config->{$self->table}{ignore_cols} } - || []; + $opts->{all} ||= eval{ $r->config->{$self->table}{all_cols} } || [$self->columns('All')]; + $opts->{required} ||= eval { $r->config->{$self->table}{required_cols} || $self->required_columns } || []; + my $ignore = $opts->{ignore} || eval{ $r->config->{$self->table}{ignore_cols} } || []; push @$ignore, $self->primary_column->name if $updating; # Ignore hashes of foreign inputs. This takes care of required has_a's @@ -379,9 +373,7 @@ sub validate_inputs { # Required field error if ($required{$field} and !ref($value) and $err =~ /^No input for/) { - #($value eq '' or !defined $value)) $errors->{$field} = "You must supply '$field'" - #unless ($updating and$self->field; } elsif ($err) { # 1: No inupt entered @@ -424,35 +416,17 @@ sub _do_create_all { foreach (keys %$validated) { $related{$_}= delete $validated->{$_} if ref $validated->{$_} eq 'HASH'; } - # Make has_own/a rel type objects and put id in parent's data hash -# foreach $accssr (keys %related) { -# my $rel_meta = $self->related_meta('r', $accssr); -# $self->_croak("No relationship found for $accssr to $class.") -# unless $rel_meta; -# my $rel_type = $rel_meta->{name}; -# if ($rel_type =~ /(^has_own$|^has_a$)/) { -# my $fclass= $rel_meta->{foreign_class}; -# my ($rel_obj, $errs) = $fclass->_do_create_all($related{$accssr}); -# # put id in parent's data hash -# if (not keys %$errs) { -# $validated->{$accssr} = $rel_obj->id; -# } else { -# $errors->{$accssr} = $errs; -# } -# delete $related{$accssr}; # done with this -# } -# } # Make main object -- base case #warn "\n*** validated data is " . Dumper($validated). "***\n"; my $me_obj = eval { $self->create($validated) }; if ($@) { - warn "Just failed making a " . $self. " FATAL Error is $@" - if (eval{$self->model_debug}); + warn "Just failed making a " . $self. " FATAL Error is $@" + if (eval{$self->model_debug}); $errors->{FATAL} = $@; return (undef, $errors); } - + if (eval{$self->model_debug}) { if ($me_obj) { warn "Just made a $self : $me_obj ( " . $me_obj->id . ")"; @@ -466,7 +440,7 @@ sub _do_create_all { my ($rel_obj, $errs) = $me_obj->_create_related($accssr, $related{$accssr}); $errors->{$accssr} = $errs if $errs; - + } #warn "Errors are " . Dumper($errors); @@ -530,43 +504,44 @@ sub _do_update_all { # If no errors, then undef in that slot. sub _create_related { - # self is object or class, accssr is accssr to relationship, params are - # data for relobject, and created is the array ref to store objs we - # create (optional). - my ( $self, $accssr, $params, $created ) = @_; - $self->_croak ("Can't make related object without a parent $self object") - unless ref $self; - $created ||= []; - my $rel_meta = $self->related_meta('r',$accssr); + # self is object or class, accssr is accssr to relationship, params are + # data for relobject, and created is the array ref to store objs we + # create (optional). + my ( $self, $accssr, $params, $created ) = @_; + $self->_croak ("Can't make related object without a parent $self object") + unless ref $self; + $created ||= []; + my $rel_meta = $self->related_meta('r',$accssr); if (!$rel_meta) { - $self->_croak("No relationship for $accssr in " . ref($self)); - } - my $rel_type = $rel_meta->{name}; - my $fclass = $rel_meta->{foreign_class}; - #warn " Dumper of meta is " . Dumper($rel_meta); - + $self->_carp("[_create_related] No relationship for $accssr in " . ref($self)); + return; + } + my $rel_type = $rel_meta->{name}; + my $fclass = $rel_meta->{foreign_class}; + #warn " Dumper of meta is " . Dumper($rel_meta); - my ($rel, $errs); - # Set up params for might_have, has_many, etc - if ($rel_type ne 'has_own' and $rel_type ne 'has_a') { + my ($rel, $errs); - # Foreign Key meta data not very standardized in CDBI - my $fkey= $rel_meta->{args}{foreign_key} || $rel_meta->{foreign_column}; - unless ($fkey) { die " Could not determine foreign key for $fclass"; } - my %data = (%$params, $fkey => $self->id); - %data = ( %data, %{$rel_meta->{args}->{constraint} || {}} ); - #warn "Data is " . Dumper(\%data); - ($rel, $errs) = $fclass->_do_create_all(\%data, $created); - } - else { - ($rel, $errs) = $fclass->_do_create_all($params, $created); - unless ($errs) { - $self->$accssr($rel->id); - $self->update; - } + # Set up params for might_have, has_many, etc + if ($rel_type ne 'has_own' and $rel_type ne 'has_a') { + + # Foreign Key meta data not very standardized in CDBI + my $fkey= $rel_meta->{args}{foreign_key} || $rel_meta->{foreign_column}; + unless ($fkey) { die " Could not determine foreign key for $fclass"; } + my %data = (%$params, $fkey => $self->id); + %data = ( %data, %{$rel_meta->{args}->{constraint} || {}} ); + #warn "Data is " . Dumper(\%data); + ($rel, $errs) = $fclass->_do_create_all(\%data, $created); + } + else { + ($rel, $errs) = $fclass->_do_create_all($params, $created); + unless ($errs) { + $self->$accssr($rel->id); + $self->update; } - return ($rel, $errs); + } + return ($rel, $errs); }