From efa1199a1131ced709bf4ec1f38386104b14e0fa Mon Sep 17 00:00:00 2001 From: Frédéric Buclin Date: Tue, 21 Aug 2012 00:51:06 +0200 Subject: Bug 779747: The "Browse" link in the page header/footer doesn't sort products by classification r=dkl a=LpSolit --- Bugzilla/Classification.pm | 52 +++++++++++++++++++++++++++++++++++++++++++++- describecomponents.cgi | 3 ++- enter_bug.cgi | 21 +------------------ 3 files changed, 54 insertions(+), 22 deletions(-) diff --git a/Bugzilla/Classification.pm b/Bugzilla/Classification.pm index 74719179a..2b35a8839 100644 --- a/Bugzilla/Classification.pm +++ b/Bugzilla/Classification.pm @@ -15,7 +15,8 @@ use Bugzilla::Util; use Bugzilla::Error; use Bugzilla::Product; -use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object); +use base qw(Bugzilla::Field::ChoiceInterface Bugzilla::Object Exporter); +@Bugzilla::Classification::EXPORT = qw(sort_products_by_classification); ############################### #### Initialization #### @@ -152,6 +153,38 @@ sub products { sub description { return $_[0]->{'description'}; } sub sortkey { return $_[0]->{'sortkey'}; } + +############################### +#### Helpers #### +############################### + +# This function is a helper to sort products to be listed +# in global/choose-product.html.tmpl. + +sub sort_products_by_classification { + my $products = shift; + my $list; + + if (Bugzilla->params->{'useclassification'}) { + my $class = {}; + # Get all classifications with at least one product. + foreach my $product (@$products) { + $class->{$product->classification_id}->{'object'} ||= + new Bugzilla::Classification($product->classification_id); + # Nice way to group products per classification, without querying + # the DB again. + push(@{$class->{$product->classification_id}->{'products'}}, $product); + } + $list = [sort {$a->{'object'}->sortkey <=> $b->{'object'}->sortkey + || lc($a->{'object'}->name) cmp lc($b->{'object'}->name)} + (values %$class)]; + } + else { + $list = [{object => undef, products => $products}]; + } + return $list; +} + 1; __END__ @@ -208,4 +241,21 @@ A Classification is a higher-level grouping of Products. =back +=head1 SUBROUTINES + +=over + +=item C + + Description: This is a helper which returns a list of products sorted + by classification in a form suitable to be passed to the + global/choose-product.html.tmpl template. + + Params: An arrayref of product objects. + + Returns: An arrayref of hashes suitable to be passed to + global/choose-product.html.tmpl. + +=back + =cut diff --git a/describecomponents.cgi b/describecomponents.cgi index 33976a385..3a70f29bb 100755 --- a/describecomponents.cgi +++ b/describecomponents.cgi @@ -13,6 +13,7 @@ use Bugzilla; use Bugzilla::Constants; use Bugzilla::Util; use Bugzilla::Error; +use Bugzilla::Classification; use Bugzilla::Product; my $user = Bugzilla->login(); @@ -40,7 +41,7 @@ unless ($product && $user->can_access_product($product->name)) { # product only, to not confuse the user with components of a # product he didn't request. elsif (scalar(@products) > 1 || $product_name) { - $vars->{'classifications'} = [{object => undef, products => \@products}]; + $vars->{'classifications'} = sort_products_by_classification(\@products); $vars->{'target'} = "describecomponents.cgi"; # If an invalid product name is given, or the user is not # allowed to access that product, a message is displayed diff --git a/enter_bug.cgi b/enter_bug.cgi index b571f8f44..7a8cebf43 100755 --- a/enter_bug.cgi +++ b/enter_bug.cgi @@ -25,11 +25,8 @@ use Bugzilla::Constants; use Bugzilla::Util; use Bugzilla::Error; use Bugzilla::Bug; -use Bugzilla::User; use Bugzilla::Hook; -use Bugzilla::Product; use Bugzilla::Classification; -use Bugzilla::Keyword; use Bugzilla::Token; use Bugzilla::Field; use Bugzilla::Status; @@ -67,23 +64,7 @@ if ($product_name eq '') { my @classifications; unless ($classification && $classification ne '__all') { - if (Bugzilla->params->{'useclassification'}) { - my $class; - # Get all classifications with at least one enterable product. - foreach my $product (@enterable_products) { - $class->{$product->classification_id}->{'object'} ||= - new Bugzilla::Classification($product->classification_id); - # Nice way to group products per classification, without querying - # the DB again. - push(@{$class->{$product->classification_id}->{'products'}}, $product); - } - @classifications = sort {$a->{'object'}->sortkey <=> $b->{'object'}->sortkey - || lc($a->{'object'}->name) cmp lc($b->{'object'}->name)} - (values %$class); - } - else { - @classifications = ({object => undef, products => \@enterable_products}); - } + @classifications = @{sort_products_by_classification(\@enterable_products)}; } unless ($classification) { -- cgit v1.2.3-24-g4f1b