Bug 29609: Centralized code to build the link to a biblio detail page
[srvgit] / cataloguing / value_builder / unimarc_field_4XX.pl
index acc0854..0437660 100755 (executable)
@@ -4,54 +4,47 @@
 #
 # This file is part of Koha.
 #
-# Koha is free software; you can redistribute it and/or modify it under the
-# terms of the GNU General Public License as published by the Free Software
-# Foundation; either version 2 of the License, or (at your option) any later
-# version.
+# Koha is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
 #
-# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
-# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
-# A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+# Koha is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
 #
-# You should have received a copy of the GNU General Public License along
-# with Koha; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+# You should have received a copy of the GNU General Public License
+# along with Koha; if not, see <http://www.gnu.org/licenses>.
 
 
 use strict;
 #use warnings; FIXME - Bug 2505
 
-use CGI;
-use C4::Output;
+use CGI qw ( -utf8 );
+use C4::Output qw( output_html_with_http_headers );
 use C4::Context;
-use C4::Search;
-use C4::Auth;
-use C4::Output;
+use C4::Search qw( new_record_from_zebra );
+use C4::Auth qw( get_template_and_user );
+use C4::Output qw( output_html_with_http_headers );
 
-use C4::Biblio;
-use C4::Koha;
-use MARC::Record;
-use C4::Branch;    # GetBranches
-use C4::ItemType;
+use C4::Biblio qw( GetMarcBiblio TransformMarcToKoha );
+
+use Koha::ItemTypes;
+
+use Koha::SearchEngine;
+use Koha::SearchEngine::Search;
 
 sub plugin_parameters {
-    my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
+    my ( $dbh, $record, $tagslib, $i ) = @_;
     return "";
 }
 
 sub plugin_javascript {
-    my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
+    my ( $dbh, $record, $tagslib, $field_number ) = @_;
     my $function_name = $field_number;
     my $res           = "
-    <script type='text/javascript'>
-        function Focus$function_name(subfield_managed) {
-            return 1;
-        }
-
-        function Blur$function_name(subfield_managed) {
-            return 1;
-        }
-
+    <script>
         function Clic$function_name(i) {
             defaultvalue=document.getElementById(\"$field_number\").value;
             window.open(\"/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=unimarc_field_4XX.pl&index=\" + i + \"&result=\"+defaultvalue,\"unimarc_field_4\"+i+\"\",'width=900,height=700,toolbar=false,scrollbars=yes');
@@ -74,14 +67,13 @@ sub plugin_javascript {
 sub plugin {
     my ($input)   = @_;
     my $dbh       = C4::Context->dbh;
-    my $query     = new CGI;
+    my $query     = CGI->new;
     my $op        = $query->param('op');
     my $type      = $query->param('type');
     my $startfrom = $query->param('startfrom');
     $startfrom = 0 if ( !defined $startfrom );
     my ( $template, $loggedinuser, $cookie );
     my $resultsperpage;
-    my $searchdesc;
 
     if ( $op eq "fillinput" ) {
         my $biblionumber = $query->param('biblionumber');
@@ -92,17 +84,15 @@ sub plugin {
         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
             {
                 template_name =>
-                  "cataloguing/value_builder/unimarc_field_4XX.tmpl",
+                  "cataloguing/value_builder/unimarc_field_4XX.tt",
                 query           => $query,
                 type            => "intranet",
-                authnotrequired => 0,
                 flagsrequired   => { editcatalogue => '*' },
-                debug           => 1,
             }
         );
 
         #get marc record
-        $marcrecord = GetMarcBiblio($biblionumber);
+        $marcrecord = GetMarcBiblio({ biblionumber => $biblionumber });
 
         my $subfield_value_9 = $biblionumber;
         my $subfield_value_0;
@@ -116,16 +106,19 @@ sub plugin {
             $subfield_value_a .= " " . $marcrecord->subfield( '700', "d" )
               if $marcrecord->subfield( '700', 'd' );
             $subfield_value_a .=
-              " (" . $marcrecord->subfield( '700', 'c' ) . " - "
+              " (" . $marcrecord->subfield( '700', 'c' )
               if $marcrecord->subfield( '700',     'c' );
+            $subfield_value_a .=  " ; "
+              if $marcrecord->subfield( '700',     'c' )
+                and $marcrecord->subfield( '700',     'f' );
             $subfield_value_a .= " ("
               if ( $marcrecord->subfield( '700', 'f' )
                 and not( $marcrecord->subfield( '700', 'c' ) ) );
             $subfield_value_a .= $marcrecord->subfield( '700', 'f' )
               if ( $marcrecord->subfield( '700', 'f' ) );
             $subfield_value_a .= ")"
-              if ( $marcrecord->subfield( '701', 'f' )
-                or $marcrecord->subfield( '701', 'c' ) );
+              if ( $marcrecord->subfield( '700', 'f' )
+                or $marcrecord->subfield( '700', 'c' ) );
         }
         elsif ( $marcrecord->field('702') ) {
             $subfield_value_a = $marcrecord->subfield( '702', 'a' );
@@ -134,8 +127,11 @@ sub plugin {
             $subfield_value_a .= " " . $marcrecord->subfield( '702', 'd' )
               if $marcrecord->subfield( '702', 'd' );
             $subfield_value_a .=
-              " (" . $marcrecord->subfield( '702', 'c' ) . "; "
+              " (" . $marcrecord->subfield( '702', 'c' )
               if $marcrecord->subfield( '702',     'c' );
+            $subfield_value_a .=  " ; "
+              if $marcrecord->subfield( '702',     'c' )
+                and $marcrecord->subfield( '702',     'f' );
             $subfield_value_a .= " ("
               if $marcrecord->subfield( '702', 'f' )
               and not $marcrecord->subfield( '702', 'c' );
@@ -193,7 +189,7 @@ sub plugin {
               " (" . $marcrecord->subfield( '712', 'f' ) . " - "
               if $marcrecord->subfield( '712',     'f' );
             $subfield_value_a .= " ("
-              if $marcrecord->field( '712', "e" )
+              if $marcrecord->subfield( '712', "e" )
               and not $marcrecord->subfield( '712', 'f' );
             $subfield_value_a .= $marcrecord->subfield( '712', 'e' )
               if $marcrecord->subfield( '712', 'e' );
@@ -248,6 +244,18 @@ sub plugin {
             $subfield_value_i = $marcrecord->field('500')->subfield("i");
         }
 
+        my $subfield_value_l;
+        $subfield_value_l = $marcrecord->field('200')->subfield("d")
+            if ( $marcrecord->field('200') );
+
+        my $subfield_value_n;
+        $subfield_value_n = $marcrecord->field('210')->subfield("c")
+            if ( $marcrecord->field('210') );
+
+        my $subfield_value_o;
+        $subfield_value_o = $marcrecord->field('200')->subfield("e")
+            if ( $marcrecord->field('200') );
+
         my $subfield_value_p;
        $subfield_value_p = $marcrecord->field('215')->subfield("a")
           if ( $marcrecord->field('215') );
@@ -299,24 +307,9 @@ sub plugin {
         if   ( $marcrecord->field('010') ) {
             $subfield_value_y = $marcrecord->field('010')->subfield("a");
         }
-        # escape the 's
-        $subfield_value_9 =~ s/'/\\'/g;
-        $subfield_value_0 =~ s/'/\\'/g;
-        $subfield_value_a =~ s/'/\\'/g;
-        $subfield_value_c =~ s/'/\\'/g;
-        $subfield_value_d =~ s/'/\\'/g;
-        $subfield_value_e =~ s/'/\\'/g;
-        $subfield_value_h =~ s/'/\\'/g;
-        $subfield_value_i =~ s/'/\\'/g;
-        $subfield_value_p =~ s/'/\\'/g;
-        $subfield_value_t =~ s/'/\\'/g;
-        $subfield_value_u =~ s/'/\\'/g;
-        $subfield_value_v =~ s/'/\\'/g;
-        $subfield_value_x =~ s/'/\\'/g;
-        $subfield_value_y =~ s/'/\\'/g;
         $template->param(
             fillinput        => 1,
-            index            => $query->param('index') . "",
+            index            => scalar $query->param('index') . "",
             biblionumber     => $biblionumber ? $biblionumber : "",
             subfield_value_9 => "$subfield_value_9",
             subfield_value_0 => "$subfield_value_0",
@@ -326,6 +319,9 @@ sub plugin {
             subfield_value_e => "$subfield_value_e",
             subfield_value_h => "$subfield_value_h",
             subfield_value_i => "$subfield_value_i",
+            subfield_value_l => "$subfield_value_l",
+            subfield_value_n => "$subfield_value_n",
+            subfield_value_o => "$subfield_value_o",
             subfield_value_p => "$subfield_value_p",
             subfield_value_t => "$subfield_value_t",
             subfield_value_u => "$subfield_value_u",
@@ -341,8 +337,10 @@ sub plugin {
         my $startfrom      = $query->param('startfrom');
         my $resultsperpage = $query->param('resultsperpage') || 20;
         my $orderby;
-        $search = 'kw,wrdl='.$search.' and mc-itemtype='.$itype if $itype;
-        my ( $errors, $results, $total_hits ) = SimpleSearch($search, $startfrom * $resultsperpage, $resultsperpage );
+        my $op = 'AND';
+        $search = 'kw:'.$search." $op mc-itemtype:".$itype if $itype;
+        my $searcher = Koha::SearchEngine::Search->new({index => $Koha::SearchEngine::BIBLIOS_INDEX});
+        my ( $errors, $results, $total_hits ) = $searcher->simple_search_compat($search, $startfrom * $resultsperpage, $resultsperpage );
         if (defined $errors ) {
             $results = [];
         }
@@ -353,11 +351,9 @@ sub plugin {
         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
             {
                 template_name =>
-                  "cataloguing/value_builder/unimarc_field_4XX.tmpl",
+                  "cataloguing/value_builder/unimarc_field_4XX.tt",
                 query           => $query,
                 type            => 'intranet',
-                authnotrequired => 0,
-                debug           => 1,
             }
         );
 
@@ -372,12 +368,20 @@ sub plugin {
         my @field_data = ($search);
          for (
              my $i = 0 ;
-             $i < $resultsperpage ;
+             $i < $total && $i < $resultsperpage ;
              $i++
            )
          {
-            my $record = MARC::Record::new_from_usmarc( $results->[$i] );
-            my $rechash = TransformMarcToKoha( $dbh, $record );
+            my $record = C4::Search::new_record_from_zebra( 'biblioserver', $results->[$i] );
+            next unless $record;
+            my $rechash = TransformMarcToKoha( $record );
+            if ( my $f = $record->field('200') ) {
+                $rechash->{fulltitle} =
+                    join(', ', map { $_->[1] } grep { $_->[0] =~ /[aehi]/ } $f->subfields() );
+            }
+            else {
+                $rechash->{fulltitle} = $rechash->{title};
+            }
             my $pos;
             my $countitems;
             if ( $rechash->{itemnumber} ) {
@@ -435,8 +439,6 @@ sub plugin {
         }else{
             $to = $from + $resultsperpage ;
         }
-        my $defaultview =
-          'BiblioDefaultView' . C4::Context->preference('BiblioDefaultView');
 #         my $link="/cgi-bin/koha/cataloguing/value_builder/unimarc4XX.pl?op=do_search&q=$search_desc&resultsperpage=$resultsperpage&startfrom=$startfrom&search=$search";
 #           foreach my $sort (@sort_by){
 #             $link.="&sort_by=".$sort."&";
@@ -451,7 +453,7 @@ sub plugin {
 #           );
         $template->param(
             result         => \@arrayresults,
-            index          => $query->param('index') . "",
+            index          => scalar $query->param('index') . "",
             startfrom      => $startfrom,
             displaynext    => $displaynext,
             displayprev    => $displayprev,
@@ -465,7 +467,6 @@ sub plugin {
             to             => $to,
             numbers        => \@numbers,
             search         => $search,
-            $defaultview   => 1,
             Search         => 0
         );
 
@@ -474,92 +475,19 @@ sub plugin {
         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
             {
                 template_name =>
-                  "cataloguing/value_builder/unimarc_field_4XX.tmpl",
+                  "cataloguing/value_builder/unimarc_field_4XX.tt",
                 query           => $query,
                 type            => "intranet",
-                authnotrequired => 0,
             }
         );
 
-        my $sth =
-          $dbh->prepare(
-            "Select itemtype,description from itemtypes order by description");
-        $sth->execute;
-        my @itemtype;
-        my %itemtypes;
-        push @itemtype, "";
-        $itemtypes{''} = "";
-        while ( my ( $value, $lib ) = $sth->fetchrow_array ) {
-            push @itemtype, $value;
-            $itemtypes{$value} = $lib;
-        }
-
-        my $CGIitemtype = CGI::scrolling_list(
-            -name     => 'value',
-            -values   => \@itemtype,
-            -labels   => \%itemtypes,
-            -size     => 1,
-            -multiple => 0
-        );
-        $sth->finish;
-
-        my @branchloop;
-        my @select_branch;
-        my %select_branches;
-        my $branches = GetBranches;
-        push @select_branch, "";
-        $select_branches{''} = "";
-        foreach my $thisbranch ( keys %$branches ) {
-            push @select_branch, $branches->{$thisbranch}->{'branchcode'};
-            $select_branches{ $branches->{$thisbranch}->{'branchcode'} } =
-              $branches->{$thisbranch}->{'branchname'};
-        }
-        my $CGIbranch = CGI::scrolling_list(
-            -name     => 'value',
-            -values   => \@select_branch,
-            -labels   => \%select_branches,
-            -size     => 1,
-            -multiple => 0
-        );
-        $sth->finish;
-
-        my $req =
-          $dbh->prepare(
-"select distinctrow left(publishercode,45) from biblioitems order by publishercode"
-          );
-        $req->execute;
-        my @select;
-        push @select, "";
-        while ( my ($value) = $req->fetchrow ) {
-            push @select, $value;
-        }
-        my $CGIpublisher = CGI::scrolling_list(
-            -name     => 'value',
-            -id       => 'publisher',
-            -values   => \@select,
-            -size     => 1,
-            -multiple => 0
-        );
-
-#         my $sth=$dbh->prepare("select description,itemtype from itemtypes order by description");
-#         $sth->execute;
-#         while (my ($description,$itemtype) = $sth->fetchrow) {
-#             $classlist.="<option value=\"$itemtype\">$description</option>\n";
-#         }
-#         $sth->finish;
-
-        my @itemtypes = C4::ItemType->all;
+        my @itemtypes = Koha::ItemTypes->search->as_list;
 
         $template->param(    #classlist => $classlist,
-            CGIitemtype  => $CGIitemtype,
-            CGIbranch    => $CGIbranch,
-            CGIPublisher => $CGIpublisher,
             itypeloop    => \@itemtypes,
-            index        => $query->param('index'),
+            index        => scalar $query->param('index'),
             Search       => 1,
         );
     }
     output_html_with_http_headers $query, $cookie, $template->output;
 }
-
-1;