]> git.ipfire.org Git - thirdparty/bugzilla.git/commitdiff
Bug 545551: Hook: object_update_columns
authorMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 11 Feb 2010 01:39:05 +0000 (17:39 -0800)
committerMax Kanat-Alexander <mkanat@bugzilla.org>
Thu, 11 Feb 2010 01:39:05 +0000 (17:39 -0800)
r=mkanat, a=mkanat (module owner)

Bugzilla/Hook.pm
Bugzilla/Object.pm
extensions/Example/Extension.pm

index 2f4d2a7ff39b05240afb6e848500e7f4ec288041..1f92f332de3d4eb4608ab43309142c7f3983a391 100644 (file)
@@ -715,6 +715,35 @@ L<Bugzilla::Object/update> returns.
 
 =back
 
+=head2 object_update_columns
+
+If you've added fields to bugs via L</object_columns>, then this
+hook allows you to say which of those columns should be updated in the
+database when L<Bugzilla::Object/update> is called on the object.
+
+If you don't use this hook, then your custom columns won't be modified in
+the database by Bugzilla.
+
+Params:
+
+=over
+
+=item C<object>
+
+The object that is about to be updated. You should check this
+like C<< if ($object->isa('Some::Class')) >> in your code, to modify
+the "update columns" only for certain classes.
+
+=item C<columns>
+
+An arrayref. Add the string names of columns to this array to allow
+that column to be updated when C<update()> is called on the object.
+
+This arrayref does not contain the standard column names--you cannot stop
+standard columns from being updated by using this hook.
+
+=back
+
 =head2 object_validators
 
 Allows you to add new items to L<Bugzilla::Object/VALIDATORS> for
index e7763157aa97d3983626e690d0bdb029e20c6a4a..dac8962ff3f3fb4718dfe91fd9162d79cfb6b5a7 100644 (file)
@@ -322,11 +322,17 @@ sub update {
     $dbh->bz_start_transaction();
 
     my $old_self = $self->new($self->id);
-    
+   
+    my @all_columns = $self->UPDATE_COLUMNS;
+    my @hook_columns;
+    Bugzilla::Hook::process('object_update_columns',
+                            { object => $self, columns => \@hook_columns });
+    push(@all_columns, @hook_columns);
+
     my %numeric = map { $_ => 1 } $self->NUMERIC_COLUMNS;
     my %date    = map { $_ => 1 } $self->DATE_COLUMNS;
     my (@update_columns, @values, %changes);
-    foreach my $column ($self->UPDATE_COLUMNS) {
+    foreach my $column (@all_columns) {
         my ($old, $new) = ($old_self->{$column}, $self->{$column});
         # This has to be written this way in order to allow us to set a field
         # from undef or to undef, and avoid warnings about comparing an undef
index 0e4e0f722c20152d8d824debf30b8e88154bab58..e06bd9f2bb5713c77fab4514a142492017c443a8 100644 (file)
@@ -386,6 +386,15 @@ sub object_end_of_update {
     }
 }
 
+sub object_update_columns {
+    my ($self, $args) = @_;
+    my ($object, $columns) = @$args{qw(object columns)};
+
+    if ($object->isa('Bugzilla::ExampleObject')) {
+        push(@$columns, 'example');
+    }
+}
+
 sub object_validators {
     my ($self, $args) = @_;
     my ($class, $validators) = @$args{qw(class validators)};