X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Controller-DBIC-API.git;a=blobdiff_plain;f=lib%2FCatalyst%2FController%2FDBIC%2FAPI.pm;h=061dbb3d58971e1b456ebd08641e2844e209e93d;hp=fd27615318c2a27e5e9ea9da25ae3b43e40a0d5d;hb=3b12c2cd6893d11ca090fbd599782f0a27979922;hpb=bec622aa0d6da0cc5f110ad4625c5484a27d49a2 diff --git a/lib/Catalyst/Controller/DBIC/API.pm b/lib/Catalyst/Controller/DBIC/API.pm index fd27615..061dbb3 100644 --- a/lib/Catalyst/Controller/DBIC/API.pm +++ b/lib/Catalyst/Controller/DBIC/API.pm @@ -374,6 +374,7 @@ sub list =method_protected list_munge_parameters list_munge_parameters is a noop by default. All arguments will be passed through without any manipulation. In order to successfully manipulate the parameters before the search is performed, simply access $c->req->search_parameters|search_attributes (ArrayRef and HashRef respectively), which correspond directly to ->search($parameters, $attributes). Parameter keys will be in already-aliased form. +To store the munged parameters call $c->req->_set_search_parameters($newparams) and $c->req->_set_search_attributes($newattrs). =cut @@ -611,7 +612,7 @@ sub validate_object foreach my $related_col (@{$allowed_related_cols}) { - if (my $related_col_value = $related_params->{$related_col}) { + if (defined(my $related_col_value = $related_params->{$related_col})) { $values{$key}{$related_col} = $related_col_value; } } @@ -634,7 +635,7 @@ sub validate_object } # check for multiple values - if (ref($value) && !($value == JSON::Any::true || $value == JSON::Any::false)) + if (ref($value) && !(reftype($value) eq reftype(JSON::Any::true))) { require Data::Dumper; die "Multiple values for '${key}': ${\Data::Dumper::Dumper($value)}"; @@ -718,7 +719,7 @@ sub save_object =method_protected update_object_from_params -update_object_from_params iterates through the params to see if any of them are pertinent to relations. If so it calls L with the object, and the relation parameters. Then it calls ->upbdate on the object. +update_object_from_params iterates through the params to see if any of them are pertinent to relations. If so it calls L with the object, and the relation parameters. Then it calls ->update on the object. =cut @@ -729,13 +730,14 @@ sub update_object_from_params foreach my $key (keys %$params) { my $value = $params->{$key}; - if (ref($value) && !($value == JSON::Any::true || $value == JSON::Any::false)) + if (ref($value) && !(reftype($value) eq reftype(JSON::Any::true))) { $self->update_object_relation($c, $object, delete $params->{$key}, $key); } + $object->$key($value); } - $object->update($params); + $object->update(); } =method_protected update_object_relation @@ -748,7 +750,17 @@ sub update_object_relation { my ($self, $c, $object, $related_params, $relation) = @_; my $row = $object->find_related($relation, {} , {}); - $row->update($related_params); + + if ($row) { + foreach my $key (keys %$related_params) { + my $value = $related_params->{$key}; + $row->$key($value); + } + $row->update(); + } + else { + $object->create_related($relation, $related_params); + } } =method_protected insert_object_from_params @@ -760,8 +772,22 @@ insert_object_from_params sets the columns for the object, then calls ->insert sub insert_object_from_params { my ($self, $c, $object, $params) = @_; - $object->set_columns($params); + + my %rels; + while (my ($k, $v) = each %{ $params }) { + if (ref($v) && !(reftype($v) eq reftype(JSON::Any::true))) { + $rels{$k} = $v; + } + else { + $object->set_column($k => $v); + } + } + $object->insert; + + while (my ($k, $v) = each %rels) { + $object->create_related($k, $v); + } } =method_protected delete_objects @@ -843,7 +869,7 @@ sub each_object_inflate { my ($self, $c, $object) = @_; - return { $object->get_inflated_columns }; + return { $object->get_columns }; } # from Catalyst::Action::Serialize