summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kanat-Alexander <mkanat@bugzilla.org>2010-02-11 02:39:05 +0100
committerMax Kanat-Alexander <mkanat@bugzilla.org>2010-02-11 02:39:05 +0100
commit6b4e9edae6b5accf757097a5e7af97c2fba8f0ff (patch)
tree60f2102816a06d0cb6043c38ff63abd55b1990be
parentaca53c540c69496390b172a55a46b817d2828d0f (diff)
downloadbugzilla-6b4e9edae6b5accf757097a5e7af97c2fba8f0ff.tar.gz
bugzilla-6b4e9edae6b5accf757097a5e7af97c2fba8f0ff.tar.xz
Bug 545551: Hook: object_update_columns
r=mkanat, a=mkanat (module owner)
-rw-r--r--Bugzilla/Hook.pm29
-rw-r--r--Bugzilla/Object.pm10
-rw-r--r--extensions/Example/Extension.pm9
3 files changed, 46 insertions, 2 deletions
diff --git a/Bugzilla/Hook.pm b/Bugzilla/Hook.pm
index 2f4d2a7ff..1f92f332d 100644
--- a/Bugzilla/Hook.pm
+++ b/Bugzilla/Hook.pm
@@ -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
diff --git a/Bugzilla/Object.pm b/Bugzilla/Object.pm
index e7763157a..dac8962ff 100644
--- a/Bugzilla/Object.pm
+++ b/Bugzilla/Object.pm
@@ -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
diff --git a/extensions/Example/Extension.pm b/extensions/Example/Extension.pm
index 0e4e0f722..e06bd9f2b 100644
--- a/extensions/Example/Extension.pm
+++ b/extensions/Example/Extension.pm
@@ -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)};