From dc9e48d1ed380ccc0202920399b3c03f0a4a56e1 Mon Sep 17 00:00:00 2001 From: Jonathan Druart Date: Tue, 3 Jan 2017 13:35:46 +0100 Subject: [PATCH] Bug 17835: Add an additional LEFT JOIN condition using DBIx::Class The previous query was wrong. If an item type did not contain the translation in the interface's language, the ->search_with_localization did not return it at all. What we need is definitely to add a second condition on the join. For reference: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class/Relationship/Base.pm#condition https://blog.afoolishmanifesto.com/posts/dbix-class-parameterized-relationships/ That sounds hacky but seems to be the DBIx::Class path to follow. Bug 17835: follow-up Signed-off-by: Josef Moravec --- Koha/ItemTypes.pm | 12 ++++++++---- Koha/Schema/Result/Itemtype.pm | 17 +++++++++++++---- .../prog/en/modules/reports/reserves_stats.tt | 4 ++-- suggestion/suggestion.pl | 1 + t/db_dependent/Koha/ItemTypes.t | 14 +++++++++++++- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/Koha/ItemTypes.pm b/Koha/ItemTypes.pm index daa808b..a3786cb 100644 --- a/Koha/ItemTypes.pm +++ b/Koha/ItemTypes.pm @@ -46,11 +46,15 @@ sub search_with_localization { my ( $self, $params, $attributes ) = @_; my $language = C4::Languages::getlanguage(); - $params->{'-or'} = { 'localization.lang' => [ $language, undef ] }; - $attributes->{order_by} = 'localization.translation' unless exists $attributes->{order_by}; + $Koha::Schema::Result::Itemtype::LANGUAGE = $language; + $attributes->{order_by} = 'translated_description' unless exists $attributes->{order_by}; $attributes->{join} = 'localization'; - $attributes->{'+select'} = [ { coalesce => [qw( localization.translation me.description )] } ]; - $attributes->{'+as'} = ['translated_description']; + $attributes->{'+select'} = [ + { + coalesce => [qw( localization.translation me.description )], + -as => 'translated_description' + } + ]; $self->SUPER::search( $params, $attributes ); } diff --git a/Koha/Schema/Result/Itemtype.pm b/Koha/Schema/Result/Itemtype.pm index 5af2466..959f8a3 100644 --- a/Koha/Schema/Result/Itemtype.pm +++ b/Koha/Schema/Result/Itemtype.pm @@ -199,11 +199,20 @@ __PACKAGE__->has_many( # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1GiikODklVISOurHX37qjA # Use the ItemtypeLocalization view to create the join on localization +our $LANGUAGE; __PACKAGE__->has_many( - "localization", - "Koha::Schema::Result::ItemtypeLocalization", - { "foreign.code" => "self.itemtype" }, - { cascade_copy => 0, cascade_delete => 0 }, + "localization" => "Koha::Schema::Result::ItemtypeLocalization", + sub { + my $args = shift; + + die "no lang specified!" unless $LANGUAGE; + + return ({ + "$args->{self_alias}.itemtype" => { -ident => "$args->{foreign_alias}.code" }, + "$args->{foreign_alias}.lang" => $LANGUAGE, + }); + + } ); 1; diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reserves_stats.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reserves_stats.tt index ec9fda9..9b6c77d 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reserves_stats.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/reports/reserves_stats.tt @@ -223,8 +223,8 @@ diff --git a/suggestion/suggestion.pl b/suggestion/suggestion.pl index d993cca..fb97762 100755 --- a/suggestion/suggestion.pl +++ b/suggestion/suggestion.pl @@ -24,6 +24,7 @@ use CGI qw ( -utf8 ); use C4::Auth; # get_template_and_user use C4::Output; use C4::Suggestions; +use C4::Koha; use C4::Budgets; use C4::Search; use C4::Members; diff --git a/t/db_dependent/Koha/ItemTypes.t b/t/db_dependent/Koha/ItemTypes.t index da05fd4..8f3dad2 100755 --- a/t/db_dependent/Koha/ItemTypes.t +++ b/t/db_dependent/Koha/ItemTypes.t @@ -57,6 +57,18 @@ Koha::ItemType->new( } )->store; +Koha::ItemType->new( + { + itemtype => 'type3', + description => 'description', + rentalcharge => '0.00', + imageurl => 'imageurl', + summary => 'summary', + checkinmsg => 'checkinmsg', + checkinmsgtype => 'checkinmsgtype', + } +)->store; + Koha::Localization->new( { entity => 'itemtypes', @@ -103,7 +115,7 @@ is( $type->checkinmsg, 'checkinmsg', 'checkinmsg' ); is( $type->checkinmsgtype, 'checkinmsgtype', 'checkinmsgtype' ); my $itemtypes = Koha::ItemTypes->search_with_localization; -is( $itemtypes->count, 2, 'There are 2 item types' ); +is( $itemtypes->count, 3, 'There are 3 item types' ); my $first_itemtype = $itemtypes->next; is( $first_itemtype->translated_description, -- 2.1.4