Bug 779747: The "Browse" link in the page header/footer doesn't sort products by classification

r=dkl a=LpSolit
4.4
Frédéric Buclin 2012-08-21 00:51:06 +02:00
parent 5d4fb3f041
commit dd43d6de01
3 changed files with 54 additions and 22 deletions

View File

@ -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<sort_products_by_classification>
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

View File

@ -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

View File

@ -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) {