Bug 7076: Lists render OPAC XSLT on staff side
[koha_gimpoz] / C4 / VirtualShelves / Page.pm
index 9d15847..8a17182 100644 (file)
@@ -31,9 +31,11 @@ use C4::Auth qw/get_session/;
 use C4::Members;
 use C4::Output;
 use C4::Dates qw/format_date/;
+use C4::Tags qw(get_tags);
 use Exporter;
 use Data::Dumper;
 use C4::Csv;
+use C4::XSLT;
 
 use vars qw($debug @EXPORT @ISA $VERSION);
 
@@ -54,19 +56,23 @@ sub shelfpage ($$$$$) {
     ( $pages{$type} ) or $type = 'opac';
     $query            or die "No query";
     $template         or die "No template";
-    $template->param( { loggedinuser => $loggedinuser } );
+    $template->param(  loggedinuser => $loggedinuser  );
+    my $edit;
+    my $shelves;
     my @paramsloop;
     my $totitems;
     my $shelfoff    = ( $query->param('shelfoff') ? $query->param('shelfoff') : 1 );
+    $template->{VARS}->{'shelfoff'} = $shelfoff;
     my $itemoff     = ( $query->param('itemoff')  ? $query->param('itemoff')  : 1 );
     my $displaymode = ( $query->param('display')  ? $query->param('display')  : 'publicshelves' );
     my ( $shelflimit, $shelfoffset, $shelveslimit, $shelvesoffset );
+    my $marcflavour = C4::Context->preference("marcflavour");
 
-    # FIXME: These limits should not be hardcoded...
-    $shelflimit    = 20;                        # Limits number of items returned for a given query
-    $shelfoffset   = ( $itemoff - 1 ) * 20;     # Sets the offset to begin retrieving items at
-    $shelveslimit  = 20;                        # Limits number of shelves returned for a given query (row_count)
-    $shelvesoffset = ( $shelfoff - 1 ) * 20;    # Sets the offset to begin retrieving shelves at (offset)
+    $shelflimit = ( $type eq 'opac' ? C4::Context->preference('OPACnumSearchResults') : C4::Context->preference('numSearchResults') );
+    $shelflimit = $shelflimit || 20;
+    $shelfoffset   = ( $itemoff - 1 ) * $shelflimit;     # Sets the offset to begin retrieving items at
+    $shelveslimit  = $shelflimit;                        # Limits number of shelves returned for a given query (row_count)
+    $shelvesoffset = ( $shelfoff - 1 ) * $shelflimit;    # Sets the offset to begin retrieving shelves at (offset)
                                                 # getting the Shelves list
     my $category = ( ( $displaymode eq 'privateshelves' ) ? 1 : 2 );
     my ( $shelflist, $totshelves ) = GetShelves( $category, $shelveslimit, $shelvesoffset, $loggedinuser );
@@ -83,7 +89,6 @@ sub shelfpage ($$$$$) {
 
     # the format of this is unindented for ease of diff comparison to the old script
     # Note: do not mistake the assignment statements below for comparisons!
-
     if ( $query->param('modifyshelfcontents') ) {
         my ( $shelfnumber, $barcode, $item, $biblio );
         if ( $shelfnumber = $query->param('viewshelf') ) {
@@ -160,6 +165,7 @@ sub shelfpage ($$$$$) {
                 my ( $shelfnumber2, $shelfname, $owner, $category, $sortfield ) = GetShelf($shelfnumber);
                 my $member = GetMember( 'borrowernumber' => $owner );
                 my $ownername = defined($member) ? $member->{firstname} . " " . $member->{surname} : '';
+                $edit = 1;
                 $template->param(
                     edit                => 1,
                     shelfnumber         => $shelfnumber2,
@@ -174,12 +180,22 @@ sub shelfpage ($$$$$) {
             last SWITCH;
         }
         if ( $shelfnumber = $query->param('viewshelf') ) {
-
+            # explicitly fetch this shelf
+            my ($shelfnumber2,$shelfname,$owner,$category,$sorton) = GetShelf($shelfnumber);
+
+            $template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') );
+            if (C4::Context->preference('TagsEnabled')) {
+                $template->param(TagsEnabled => 1);
+                    foreach (qw(TagsShowOnList TagsInputOnList)) {
+                    C4::Context->preference($_) and $template->param($_ => 1);
+                }
+            }
             #check that the user can view the shelf
             if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'view' ) ) {
                 my $items;
                 my $authorsort;
                 my $yearsort;
+                my $tag_quantity;
                 my $sortfield = ( $query->param('sortfield') ? $query->param('sortfield') : 'title' );
                 if ( $sortfield eq 'author' ) {
                     $authorsort = 'author';
@@ -189,7 +205,11 @@ sub shelfpage ($$$$$) {
                 }
                 ( $items, $totitems ) = GetShelfContents( $shelfnumber, $shelflimit, $shelfoffset );
                 for my $this_item (@$items) {
-                    my $record = GetMarcBiblio( $this_item->{'biblionumber'} );
+                    my $biblionumber = $this_item->{'biblionumber'};
+                    my $record = GetMarcBiblio($biblionumber);
+                    $this_item->{XSLTBloc} =
+                        XSLTParse4Display($biblionumber, $record, 'Results', 'opac')
+                            if C4::Context->preference("OPACXSLTResultsDisplay") && $type eq 'opac';
 
                     # the virtualshelfcontents table does not store these columns nor are they retrieved from the items
                     # and itemtypes tables, so I'm commenting them out for now to quiet the log -crn
@@ -199,24 +219,37 @@ sub shelfpage ($$$$$) {
                     $this_item->{'imageurl'}  = getitemtypeinfo( $this_item->{'itemtype'} )->{'imageurl'};
                     $this_item->{'coins'}     = GetCOinSBiblio( $this_item->{'biblionumber'} );
                     $this_item->{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($this_item->{'biblionumber'}));
-
+                    $this_item->{'normalized_upc'}  = GetNormalizedUPC(       $record,$marcflavour);
+                    $this_item->{'normalized_ean'}  = GetNormalizedEAN(       $record,$marcflavour);
+                    $this_item->{'normalized_oclc'} = GetNormalizedOCLCNumber($record,$marcflavour);
+                    $this_item->{'normalized_isbn'} = GetNormalizedISBN(undef,$record,$marcflavour);
                     # Getting items infos for location display
-                    my @items_infos = &GetItemsInfo( $this_item->{'biblionumber'}, $type );
+                    my @items_infos = &GetItemsLocationInfo( $this_item->{'biblionumber'});
+                    $this_item->{'itemsissued'} = CountItemsIssued( $this_item->{'biblionumber'} );
                     $this_item->{'ITEM_RESULTS'} = \@items_infos;
 
+                    if (C4::Context->preference('TagsEnabled') and $tag_quantity = C4::Context->preference('TagsShowOnList')) {
+                        $this_item->{'TagLoop'} = get_tags({
+                            biblionumber=>$this_item->{'biblionumber'}, approved=>1, 'sort'=>'-weight',
+                            limit=>$tag_quantity
+                            });
+                    }
+
                 }
                 push @paramsloop, { display => 'privateshelves' } if $category == 1;
                 $showadd = 1;
                 my $i = 0;
                 my $manageshelf = ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' );
                 $template->param(
-                    shelfname => $shelflist->{$shelfnumber}->{'shelfname'} || $privshelflist->{$shelfnumber}->{'shelfname'},
-                    shelfnumber => $shelfnumber,
-                    viewshelf   => $shelfnumber,
-                    authorsort  => $authorsort,
-                    yearsort    => $yearsort,
-                    manageshelf => $manageshelf,
-                    itemsloop   => $items,
+                    shelfname           => $shelfname,
+                    shelfnumber         => $shelfnumber,
+                    viewshelf           => $shelfnumber,
+                    authorsort          => $authorsort,
+                    yearsort            => $yearsort,
+                    manageshelf         => $manageshelf,
+                    "category$category" => 1,
+                    category            => $category,
+                    itemsloop           => $items,
                 );
             } else {
                 push @paramsloop, { nopermission => $shelfnumber };
@@ -256,7 +289,7 @@ sub shelfpage ($$$$$) {
                 if ( my $count = scalar @$contents ) {
                     unless ( scalar grep { /^CONFIRM-$number$/ } $query->param() ) {
                         if ( defined $shelflist->{$number} ) {
-                            push( @paramsloop, { need_confirm => $shelflist->{$number}->{shelfname}, count => $count } );
+                            push( @paramsloop, { need_confirm => $shelflist->{$number}->{shelfname}, count => $count, single => ($count eq 1 ? 1:0) } );
                             $shelflist->{$number}->{confirm} = $number;
                         } else {
                             push( @paramsloop, { need_confirm => $privshelflist->{$number}->{shelfname}, count => $count } );
@@ -284,7 +317,10 @@ sub shelfpage ($$$$$) {
                 $stay = 0;
             }
             $showadd = 1;
-            $stay and $template->param( shelves => 1 );
+            if ($stay){
+                $template->param( shelves => 1 );
+                $shelves = 1;
+            }
             last SWITCH;
         }
     }
@@ -331,11 +367,11 @@ sub shelfpage ($$$$$) {
         $qhash{$_} = $query->param($_) if $query->param($_);
     }
     ( scalar keys %qhash ) and $url .= '?' . join '&', map { "$_=$qhash{$_}" } keys %qhash;
-    if ( $query->param('viewshelf') ) {
-        $template->param( { pagination_bar => pagination_bar( $url, ( int( $totitems / $shelflimit ) ) + ( ( $totitems % $shelflimit ) > 0 ? 1 : 0 ), $itemoff, "itemoff" ) } );
+    if ( $shelfnumber ) {
+        $template->param(  pagination_bar => pagination_bar( $url, ( int( $totitems / $shelflimit ) ) + ( ( $totitems % $shelflimit ) > 0 ? 1 : 0 ), $itemoff, "itemoff" )  );
     } else {
         $template->param(
-            { pagination_bar => pagination_bar( $url, ( int( $totshelves / $shelveslimit ) ) + ( ( $totshelves % $shelveslimit ) > 0 ? 1 : 0 ), $shelfoff, "shelfoff" ) } );
+             pagination_bar => pagination_bar( $url, ( int( $totshelves / $shelveslimit ) ) + ( ( $totshelves % $shelveslimit ) > 0 ? 1 : 0 ), $shelfoff, "shelfoff" )  );
     }
     $template->param(
         shelveslooppriv                                                    => \@shelveslooppriv,
@@ -345,13 +381,13 @@ sub shelfpage ($$$$$) {
         "BiblioDefaultView" . C4::Context->preference("BiblioDefaultView") => 1,
         csv_profiles                                                       => GetCsvProfilesLoop()
     );
-    if (   $template->param('viewshelf')
-        or $template->param('shelves')
-        or $template->param('edit') ) {
+    if (   $shelfnumber
+        or $shelves
+        or $edit ) {
         $template->param( vseflag => 1 );
     }
-    if ($template->param('shelves') or    # note: this part looks duplicative, but is intentional
-        $template->param('edit')
+    if ($shelves or    # note: this part looks duplicative, but is intentional
+        $edit
       ) {
         $template->param( seflag => 1 );
     }
@@ -365,18 +401,18 @@ sub shelfpage ($$$$$) {
 
     if ( defined $barshelves ) {
         $template->param(
-            barshelves     => scalar( @{ $barshelves->[0] } ),
-            barshelvesloop => $barshelves->[0],
+            barshelves     => scalar( @{ $barshelves } ),
+            barshelvesloop => $barshelves,
         );
-        $template->param( bartotal => $total->{'bartotal'}, ) if ( $total->{'bartotal'} > scalar( @{ $barshelves->[0] } ) );
+        $template->param( bartotal => $total->{'bartotal'}, ) if ( $total->{'bartotal'} > scalar( @{ $barshelves } ) );
     }
 
     if ( defined $pubshelves ) {
         $template->param(
-            pubshelves     => scalar( @{ $pubshelves->[0] } ),
-            pubshelvesloop => $pubshelves->[0],
+            pubshelves     => scalar( @{ $pubshelves } ),
+            pubshelvesloop => $pubshelves,
         );
-        $template->param( pubtotal => $total->{'pubtotal'}, ) if ( $total->{'pubtotal'} > scalar( @{ $pubshelves->[0] } ) );
+        $template->param( pubtotal => $total->{'pubtotal'}, ) if ( $total->{'pubtotal'} > scalar( @{ $pubshelves } ) );
     }
 
     output_html_with_http_headers $query, $cookie, $template->output;
@@ -387,11 +423,11 @@ __END__
 
 =head1 NAME
 
-    VirtualShelves/Page.pm
+VirtualShelves/Page.pm
 
 =head1 DESCRIPTION
 
-    Module used for both OPAC and intranet pages.
+Module used for both OPAC and intranet pages.
 
 =head1 CGI PARAMETERS
 
@@ -399,32 +435,32 @@ __END__
 
 =item C<modifyshelfcontents>
 
-    If this script has to modify the shelf content.
+If this script has to modify the shelf content.
 
 =item C<shelfnumber>
 
-    To know on which shelf to work.
+To know on which shelf to work.
 
 =item C<addbarcode>
 
 =item C<op>
 
   Op can be:
-        * modif: show the template allowing modification of the shelves;
-        * modifsave: save changes from modif mode.
+ Op can be:
+    * modif: show the template allowing modification of the shelves;
+    * modifsave: save changes from modif mode.
 
 =item C<viewshelf>
 
-    Load template with 'viewshelves param' displaying the shelf's information.
+Load template with 'viewshelves param' displaying the shelf's information.
 
 =item C<shelves>
 
-    If the param shelves == 1, then add or delete a shelf.
+If the param shelves == 1, then add or delete a shelf.
 
 =item C<addshelf>
 
-    If the param shelves == 1, then addshelf is the name of the shelf to add.
+If the param shelves == 1, then addshelf is the name of the shelf to add.
 
 =back
 
-=cut
\ No newline at end of file
+=cut