Bug 779747: The "Browse" link in the page header/footer doesn't sort products by classification
r=dkl a=LpSolit4.4
parent
5d4fb3f041
commit
dd43d6de01
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue