Bug 17835: Add an additional LEFT JOIN condition using DBIx::Class
authorJonathan Druart <jonathan.druart@bugs.koha-community.org>
Tue, 3 Jan 2017 12:35:46 +0000 (13:35 +0100)
committerKyle M Hall <kyle@bywatersolutions.com>
Fri, 14 Apr 2017 14:43:52 +0000 (10:43 -0400)
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>
Koha/ItemTypes.pm
Koha/Schema/Result/Itemtype.pm
koha-tmpl/intranet-tmpl/prog/en/modules/reports/reserves_stats.tt
suggestion/suggestion.pl
t/db_dependent/Koha/ItemTypes.t

index daa808b..a3786cb 100644 (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 );
 }
 
index 5af2466..959f8a3 100644 (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;
index ec9fda9..9b6c77d 100644 (file)
             <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> 
index d993cca..fb97762 100755 (executable)
@@ -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;
index da05fd4..8f3dad2 100755 (executable)
@@ -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,