Bugzilla:Extension Notes: Difference between revisions

From MozillaWiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 53: Line 53:


As well as using the <tt>config_add_panels</tt> hook, you will need a template to define the UI strings for the panel. See the templates in <tt>template/en/default/admin/params</tt> for examples, and put your own template in <tt>template/en/default/admin/params</tt> in your extension's directory.
As well as using the <tt>config_add_panels</tt> hook, you will need a template to define the UI strings for the panel. See the templates in <tt>template/en/default/admin/params</tt> for examples, and put your own template in <tt>template/en/default/admin/params</tt> in your extension's directory.
==Adding User Preferences==
To add a new user preference:
* Call <tt>add_setting('setting_name', ['some_option', 'another_option'], 'some_option')</tt> in the <tt>install_before_final_checks</tt> hook. (The last parameter is the name of the option which should be the default.)
* Add descriptions for the identifiers for your setting and choices (setting_name, some_option etc.) to the hash defined in <tt>global/setting-descs.none.tmpl</tt>. Do this in a hook: <tt>hook/global/setting-descs-settings.none.tmpl</tt>. Your code can see the hash variable; just set more members in it.
* To change behaviour based on the setting, reference it in templates using <tt>[% user.settings.setting_name.value %]</tt>. Reference it in code using <tt>$user->settings->{'setting_name'}->{'value'}</tt>. The value will be one of the option tag names (e.g. some_option).

Revision as of 15:19, 3 January 2011

Checking Syntax

It's not immediately obvious how to check the syntax of your extension's modules. Running checksetup.pl might do some of it, but the errors aren't necessarily massively informative.

perl -Mlib=lib -MBugzilla -e 'BEGIN { Bugzilla->extensions; } use Bugzilla::Extension::ExtensionName::Class;' 

(run from BUGZILLA_HOME) will do the trick.

Adding New Fields To Bugs

To add new fields to a bug, you need to do the following:

  • Add an install_update_db hook to add the fields by calling Bugzilla::Field->create (only if the field doesn't already exist). Here's what it might look like for a single field:
my $field = new Bugzilla::Field({ name => $name });
return if $field;

$field = Bugzilla::Field->create({
    name        => $name,
    description => $description,
    type        => $type,        # From list in Constants.pm
    enter_bug   => 0,
    buglist     => 0,
    custom      => 1,
});
  • Push the name of the field onto the relevant arrays in the bug_columns and bug_fields hooks.
  • If you want direct accessors, or other functions on the object, you need to add a BEGIN block to your Extension.pm:
BEGIN { 
   *Bugzilla::Bug::is_foopy = \&_bug_is_foopy; 
}

...

sub _bug_is_foopy {
    return $_[0]->{'is_foopy'};
}
  • You don't have to change Bugzilla/DB/Schema.pm.

Adding New Fields To Other Things

If you are adding the new fields to an object other than a bug, you need to go a bit lower-level.

  • In install_update_db, use bz_add_column instead
  • Push on the columns in object_columns and object_update_columns instead of bug_columns.
  • Add validators for the values in object_validators

The process for adding accessor functions is the same.

Adding Configuration Panels

As well as using the config_add_panels hook, you will need a template to define the UI strings for the panel. See the templates in template/en/default/admin/params for examples, and put your own template in template/en/default/admin/params in your extension's directory.

Adding User Preferences

To add a new user preference:

  • Call add_setting('setting_name', ['some_option', 'another_option'], 'some_option') in the install_before_final_checks hook. (The last parameter is the name of the option which should be the default.)
  • Add descriptions for the identifiers for your setting and choices (setting_name, some_option etc.) to the hash defined in global/setting-descs.none.tmpl. Do this in a hook: hook/global/setting-descs-settings.none.tmpl. Your code can see the hash variable; just set more members in it.
  • To change behaviour based on the setting, reference it in templates using [% user.settings.setting_name.value %]. Reference it in code using $user->settings->{'setting_name'}->{'value'}. The value will be one of the option tag names (e.g. some_option).