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 <josef.moravec@gmail.com>

Signed-off-by: Lari Taskula <lari.taskula@jns.fi>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
This commit is contained in:
Jonathan Druart 2017-01-03 13:35:46 +01:00 committed by Kyle M Hall
parent 72dd80fae9
commit cb0e33f046
5 changed files with 37 additions and 11 deletions

View File

@ -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 );
}

View File

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

View File

@ -223,8 +223,8 @@
<td><input type="radio" name="Column" value="items.itype" /></td>
<td><select name="filter_items.itype" id="itype">
<option value=""> </option>
[% FOREACH itypeloo IN itemtypeloop %]
[% IF ( itypeloo.selected ) %]<option value="[% itypeloo.code %]" selected="selected">[% itypeloo.description %]</option>[% ELSE %]<option value="[% itypeloo.code %]">[% itypeloo.description %]</option>[% END %]
[% FOREACH itemtype IN itemtypes %]
<option value="[% itemtype.itemtype %]">[% itemtype.translated_description %]</option>
[% END %]
</select>
</td>

View File

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

View File

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