BUGFIX (unimarc specific) escaping ' in template variables in 4XX plugin
[koha.git] / cataloguing / value_builder / unimarc_field_4XX.pl
1 #!/usr/bin/perl
2
3 # Copyright 2000-2002 Katipo Communications
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
10 # version.
11 #
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License along with
17 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
18 # Suite 330, Boston, MA  02111-1307 USA
19
20 # $Id$
21
22 use strict;
23 require Exporter;
24 use CGI;
25 use C4::Output;
26 use C4::Context;
27 use C4::Search;
28 use C4::Auth;
29 use C4::Output;
30
31 use C4::Biblio;
32 use C4::Koha;
33 use MARC::Record;
34 use C4::Branch;    # GetBranches
35
36 sub plugin_parameters {
37     my ( $dbh, $record, $tagslib, $i, $tabloop ) = @_;
38     return "";
39 }
40
41 sub plugin_javascript {
42     my ( $dbh, $record, $tagslib, $field_number, $tabloop ) = @_;
43     my $function_name = $field_number;
44     my $res           = "
45     <script type='text/javascript'>
46         function Focus$function_name(subfield_managed) {
47             return 1;
48         }
49
50         function Blur$function_name(subfield_managed) {
51             return 1;
52         }
53
54         function Clic$function_name(i) {
55             defaultvalue=document.getElementById(\"$field_number\").value;
56             window.open(\"/cgi-bin/koha/cataloguing/plugin_launcher.pl?plugin_name=unimarc_field_4XX.pl&index=$field_number&result=\"+defaultvalue,\"unimarc field 4\"+i+\"\",'width=900,height=700,toolbar=false,scrollbars=yes');
57
58         }
59     </script>
60     ";
61
62     return ( $function_name, $res );
63 }
64
65 # sub plugin
66 #
67 # input arg : 
68 # -- op could be equals to
69 # * fillinput : 
70 # * do_search : 
71
72
73 sub plugin {
74     my ($input)   = @_;
75     my $dbh       = C4::Context->dbh;
76     my $query     = new CGI;
77     my $op        = $query->param('op');
78     my $type      = $query->param('type');
79     my $startfrom = $query->param('startfrom');
80     $startfrom = 0 if ( !defined $startfrom );
81     my ( $template, $loggedinuser, $cookie );
82     my $resultsperpage;
83     my $searchdesc;
84
85     if ( $op eq "fillinput" ) {
86         my $biblionumber = $query->param('biblionumber');
87         my $index  = $query->param('index');
88         my $marcrecord;
89
90         # open template
91         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
92             {
93                 template_name =>
94                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
95                 query           => $query,
96                 type            => "intranet",
97                 authnotrequired => 0,
98                 flagsrequired   => { editcatalogue => 1 },
99                 debug           => 1,
100             }
101         );
102
103         #get marc record
104         $marcrecord = GetMarcBiblio($biblionumber);
105
106         my $subfield_value_9 = $biblionumber;
107         my $subfield_value_0;
108         $subfield_value_0 = $marcrecord->field('001')->data
109           if $marcrecord->field('001');
110         my $subfield_value_a;
111         if ( $marcrecord->field('700') ) {
112             $subfield_value_a = $marcrecord->field('700')->subfield("a");
113             $subfield_value_a .= ", " . $marcrecord->subfield( '700', "b" )
114               if $marcrecord->subfield( '700', 'b' );
115             $subfield_value_a .= " " . $marcrecord->subfield( '700', "d" )
116               if $marcrecord->subfield( '700', 'd' );
117             $subfield_value_a .=
118               " (" . $marcrecord->subfield( '700', 'c' ) . " - "
119               if $marcrecord->subfield( '700',     'c' );
120             $subfield_value_a .= " ("
121               if ( $marcrecord->subfield( '700', 'f' )
122                 and not( $marcrecord->subfield( '700', 'c' ) ) );
123             $subfield_value_a .= $marcrecord->subfield( '700', 'f' )
124               if ( $marcrecord->subfield( '700', 'f' ) );
125             $subfield_value_a .= ")"
126               if ( $marcrecord->subfield( '701', 'f' )
127                 or $marcrecord->subfield( '701', 'c' ) );
128         }
129         elsif ( $marcrecord->field('702') ) {
130             $subfield_value_a = $marcrecord->subfield( '702', 'a' );
131             $subfield_value_a .= ", " . $marcrecord->subfield( '702', 'b' )
132               if $marcrecord->subfield( '702', 'b' );
133             $subfield_value_a .= " " . $marcrecord->subfield( '702', 'd' )
134               if $marcrecord->subfield( '702', 'd' );
135             $subfield_value_a .=
136               " (" . $marcrecord->subfield( '702', 'c' ) . "; "
137               if $marcrecord->subfield( '702',     'c' );
138             $subfield_value_a .= " ("
139               if $marcrecord->subfield( '702', 'f' )
140               and not $marcrecord->subfield( '702', 'c' );
141             $subfield_value_a .= $marcrecord->subfield( '702', 'f' )
142               if $marcrecord->subfield( '702', 'f' );
143             $subfield_value_a .= ")"
144               if $marcrecord->subfield( '702', 'f' )
145               or $marcrecord->subfield( '702', 'c' );
146         }
147         elsif ( $marcrecord->field('710') ) {
148             $subfield_value_a = $marcrecord->subfield( '710', 'd' ) . " "
149               if $marcrecord->subfield( '710', 'd' );
150             $subfield_value_a .= $marcrecord->subfield( '710', 'a' )
151               if $marcrecord->subfield( '710', 'a' );
152             $subfield_value_a .= ", " . $marcrecord->subfield( '710', 'b' )
153               if $marcrecord->subfield('710');
154             $subfield_value_a .=
155               " (" . $marcrecord->subfield( '710', 'f' ) . " - "
156               if $marcrecord->subfield( '710',     'f' );
157             $subfield_value_a .= " ("
158               if $marcrecord->subfield( '710', 'e' )
159               and not $marcrecord->subfield( '710', 'f' );
160             $subfield_value_a .= $marcrecord->subfield( '710', 'e' )
161               if $marcrecord->subfield( '710', 'e' );
162             $subfield_value_a .= ")"
163               if $marcrecord->subfield( '710', 'e' )
164               or $marcrecord->subfield( '710', 'f' );
165         }
166         elsif ( $marcrecord->field('701') ) {
167             $subfield_value_a = $marcrecord->subfield( '701', 'a' );
168             $subfield_value_a .= ", " . $marcrecord->subfield( '701', 'b' )
169               if $marcrecord->subfield( '701', 'b' );
170             $subfield_value_a .= " " . $marcrecord->subfield( '701', 'd', )
171               if $marcrecord->subfield( '701', 'd' );
172             $subfield_value_a .=
173               " (" . $marcrecord->subfield( '701', 'c' ) . " - "
174               if $marcrecord->subfield( '701',     'c' );
175             $subfield_value_a .= " ("
176               if $marcrecord->subfield( '701', 'f' )
177               and not( $marcrecord->subfield( '701', 'c' ) );
178             $subfield_value_a .= $marcrecord->subfield( '701', 'f' )
179               if $marcrecord->subfield( '701', 'f' );
180             $subfield_value_a .= ")"
181               if $marcrecord->subfield( '701', 'f' )
182               or $marcrecord->subfield( '701', 'c' );
183         }
184         elsif ( $marcrecord->field('712') ) {
185             $subfield_value_a = $marcrecord->subfield( '712', 'd' ) . " "
186               if $marcrecord->subfield( '712', 'd' );
187             $subfield_value_a .= $marcrecord->subfield( '712', 'a' )
188               if $marcrecord->subfield( '712', 'a' );
189             $subfield_value_a .= ", " . $marcrecord->subfield( '712', 'b' )
190               if $marcrecord->subfield( '712', 'b' );
191             $subfield_value_a .=
192               " (" . $marcrecord->subfield( '712', 'f' ) . " - "
193               if $marcrecord->subfield( '712',     'f' );
194             $subfield_value_a .= " ("
195               if $marcrecord->field( '712', "e" )
196               and not $marcrecord->subfield( '712', 'f' );
197             $subfield_value_a .= $marcrecord->subfield( '712', 'e' )
198               if $marcrecord->subfield( '712', 'e' );
199             $subfield_value_a .= ")"
200               if $marcrecord->subfield( '712', 'e' )
201               or $marcrecord->subfield( '712', 'f' );
202         }
203         elsif ( $marcrecord->field('200') ) {
204             $subfield_value_a = $marcrecord->subfield( '200', 'f' );
205         }
206         my $subfield_value_c = $marcrecord->field('210')->subfield("a")
207           if ( $marcrecord->field('210') );
208         my $subfield_value_d = $marcrecord->field('210')->subfield("d")
209           if ( $marcrecord->field('210') );
210
211         my $subfield_value_e = $marcrecord->field('205')->subfield("a")
212           if ( $marcrecord->field('205') );
213
214         my $subfield_value_h;
215         if (   ( $marcrecord->field('200') )
216             && ( $marcrecord->field('200')->subfield("h") ) )
217         {
218             $subfield_value_h = $marcrecord->field('200')->subfield("h");
219         }
220         elsif (( $marcrecord->field('225') )
221             && ( $marcrecord->field('225')->subfield("h") ) )
222         {
223             $subfield_value_h = $marcrecord->field('225')->subfield("h");
224         }
225         elsif (( $marcrecord->field('500') )
226             && ( $marcrecord->field('500')->subfield("h") ) )
227         {
228             $subfield_value_h = $marcrecord->field('500')->subfield("h");
229         }
230
231         my $subfield_value_i;
232         if (   ( $marcrecord->field('200') )
233             && ( $marcrecord->field('200')->subfield("i") ) )
234         {
235             $subfield_value_i = $marcrecord->field('200')->subfield("i");
236         }
237         elsif (( $marcrecord->field('225') )
238             && ( $marcrecord->field('225')->subfield("i") ) )
239         {
240             $subfield_value_i = $marcrecord->field('225')->subfield("i");
241         }
242         elsif (( $marcrecord->field('500') )
243             && ( $marcrecord->field('500')->subfield("i") ) )
244         {
245             $subfield_value_i = $marcrecord->field('500')->subfield("i");
246         }
247
248         my $subfield_value_p = $marcrecord->field('215')->subfield("a")
249           if ( $marcrecord->field('215') );
250
251         my $subfield_value_t;
252         if (   ( $marcrecord->field('200') )
253             && ( $marcrecord->field('200')->subfield("a") ) )
254         {
255             $subfield_value_t = $marcrecord->field('200')->subfield("a");
256         }
257         elsif (( $marcrecord->field('225') )
258             && ( $marcrecord->field('225')->subfield("a") ) )
259         {
260             $subfield_value_t = $marcrecord->field('225')->subfield("a");
261         }
262         elsif (( $marcrecord->field('500') )
263             && ( $marcrecord->field('500')->subfield("a") ) )
264         {
265             $subfield_value_t = $marcrecord->field('500')->subfield("a");
266         }
267
268         my $subfield_value_u = $marcrecord->field('856')->subfield("u")
269           if ( $marcrecord->field('856') );
270
271         my $subfield_value_v;
272         if (   ( $marcrecord->field('225') )
273             && ( $marcrecord->field('225')->subfield("v") ) )
274         {
275             $subfield_value_v = $marcrecord->field('225')->subfield("v");
276         }
277         elsif (( $marcrecord->field('200') )
278             && ( $marcrecord->field('200')->subfield("h") ) )
279         {
280             $subfield_value_v = $marcrecord->field('200')->subfield("h");
281         }
282         my $subfield_value_x = $marcrecord->field('011')->subfield("a")
283           if (
284             $marcrecord->field('011')
285             and not( ( $marcrecord->field('011')->subfield("y") )
286                 or ( $marcrecord->field('011')->subfield("z") ) )
287           );
288         my $subfield_value_y = $marcrecord->field('013')->subfield("a")
289           if ( $marcrecord->field('013') );
290         if   ( $marcrecord->field('010') ) {
291             $subfield_value_y = $marcrecord->field('010')->subfield("a");
292         }
293         # escape the 's
294         $subfield_value_9 =~ s/'/\\'/g;
295         $subfield_value_0 =~ s/'/\\'/g;
296         $subfield_value_a =~ s/'/\\'/g;
297         $subfield_value_c =~ s/'/\\'/g;
298         $subfield_value_d =~ s/'/\\'/g;
299         $subfield_value_e =~ s/'/\\'/g;
300         $subfield_value_h =~ s/'/\\'/g;
301         $subfield_value_i =~ s/'/\\'/g;
302         $subfield_value_p =~ s/'/\\'/g;
303         $subfield_value_t =~ s/'/\\'/g;
304         $subfield_value_u =~ s/'/\\'/g;
305         $subfield_value_v =~ s/'/\\'/g;
306         $subfield_value_x =~ s/'/\\'/g;
307         $subfield_value_y =~ s/'/\\'/g;
308         $template->param(
309             fillinput        => 1,
310             index            => $query->param('index') . "",
311             biblionumber     => $biblionumber ? $biblionumber : "",
312             subfield_value_9 => "$subfield_value_9",
313             subfield_value_0 => "$subfield_value_0",
314             subfield_value_a => "$subfield_value_a",
315             subfield_value_c => "$subfield_value_c",
316             subfield_value_d => "$subfield_value_d",
317             subfield_value_e => "$subfield_value_e",
318             subfield_value_h => "$subfield_value_h",
319             subfield_value_i => "$subfield_value_i",
320             subfield_value_p => "$subfield_value_p",
321             subfield_value_t => "$subfield_value_t",
322             subfield_value_u => "$subfield_value_u",
323             subfield_value_v => "$subfield_value_v",
324             subfield_value_x => "$subfield_value_x",
325             subfield_value_y => "$subfield_value_y",
326         );
327 ###############################################################
328     }
329     elsif ( $op eq "do_search" ) {
330         my $search         = $query->param('search');
331         my $startfrom      = $query->param('startfrom');
332         my $resultsperpage = $query->param('resultsperpage');
333         my $orderby;
334         my ( $errors, $results ) = SimpleSearch($search);
335         my $total = scalar(@$results);
336         $resultsperpage = 20 unless $resultsperpage;
337
338         #        warn " biblio count : ".$total;
339
340         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
341             {
342                 template_name =>
343                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
344                 query           => $query,
345                 type            => 'intranet',
346                 authnotrequired => 1,
347                 debug           => 1,
348             }
349         );
350
351         # multi page display gestion
352         my $displaynext = 0;
353         my $displayprev = $startfrom;
354         if ( ( $total - ( ( $startfrom + 1 ) * ($resultsperpage) ) ) > 0 ) {
355             $displaynext = 1;
356         }
357         my @arrayresults;
358         my @field_data = ($search);
359         for (
360             my $i = $startfrom ;
361             $i <= (
362                   ( $startfrom + $resultsperpage ) < scalar(@$results)
363                 ? ( $startfrom + $resultsperpage )
364                 : scalar(@$results)
365             ) ;
366             $i++
367           )
368         {
369             my $record = MARC::Record::new_from_usmarc( $results->[$i] );
370             my $rechash = TransformMarcToKoha( $dbh, $record );
371             my $pos;
372             my $countitems = 1 if ( $rechash->{itemnumber} );
373             while ( index( $rechash->{itemnumber}, '|', $pos ) > 0 ) {
374                 $countitems += 1;
375                 $pos = index( $rechash->{itemnumber}, '|', $pos ) + 1;
376             }
377             $rechash->{totitem} = $countitems;
378             my @holdingbranches = split /\|/, $rechash->{holdingbranch};
379             my @itemcallnumbers = split /\|/, $rechash->{itemcallnumber};
380             my $CN;
381             for ( my $i = 0 ; $i < @holdingbranches ; $i++ ) {
382                 $CN .=
383                   $holdingbranches[$i] . " ( " . $itemcallnumbers[$i] . " ) |";
384             }
385             $CN =~ s/ \|$//;
386             $rechash->{CN} = $CN;
387             push @arrayresults, $rechash;
388         }
389
390    #         for(my $i = 0 ; $i <= $#marclist ; $i++)
391    #         {
392    #             push @field_data, { term => "marclist", val=>$marclist[$i] };
393    #             push @field_data, { term => "and_or", val=>$and_or[$i] };
394    #             push @field_data, { term => "excluding", val=>$excluding[$i] };
395    #             push @field_data, { term => "operator", val=>$operator[$i] };
396    #             push @field_data, { term => "value", val=>$value[$i] };
397    #         }
398
399         my @numbers = ();
400
401         if ( $total > $resultsperpage ) {
402             for ( my $i = 1 ; $i < $total / $resultsperpage + 1 ; $i++ ) {
403                 if ( $i < 16 ) {
404                     my $highlight = 0;
405                     ( $startfrom == ( $i - 1 ) ) && ( $highlight = 1 );
406                     push @numbers,
407                       {
408                         number     => $i,
409                         highlight  => $highlight,
410                         searchdata => \@field_data,
411                         startfrom  => ( $i - 1 )
412                       };
413                 }
414             }
415         }
416
417         my $from = $startfrom * $resultsperpage + 1;
418         my $to;
419
420         if ( $total < ( ( $startfrom + 1 ) * $resultsperpage ) ) {
421             $to = $total;
422         }
423         else {
424             $to = ( ( $startfrom + 1 ) * $resultsperpage );
425         }
426         my $defaultview =
427           'BiblioDefaultView' . C4::Context->preference('BiblioDefaultView');
428         $template->param(
429             result         => \@arrayresults,
430             index          => $query->param('index') . "",
431             startfrom      => $startfrom,
432             displaynext    => $displaynext,
433             displayprev    => $displayprev,
434             resultsperpage => $resultsperpage,
435             orderby        => $orderby,
436             startfromnext  => $startfrom + 1,
437             startfromprev  => $startfrom - 1,
438             searchdata     => \@field_data,
439             total          => $total,
440             from           => $from,
441             to             => $to,
442             numbers        => \@numbers,
443             search         => $search,
444             $defaultview   => 1,
445             Search         => 0
446         );
447
448     }
449     else {
450         ( $template, $loggedinuser, $cookie ) = get_template_and_user(
451             {
452                 template_name =>
453                   "cataloguing/value_builder/unimarc_field_4XX.tmpl",
454                 query           => $query,
455                 type            => "intranet",
456                 authnotrequired => 1,
457             }
458         );
459
460         my $sth =
461           $dbh->prepare(
462             "Select itemtype,description from itemtypes order by description");
463         $sth->execute;
464         my @itemtype;
465         my %itemtypes;
466         push @itemtype, "";
467         $itemtypes{''} = "";
468         while ( my ( $value, $lib ) = $sth->fetchrow_array ) {
469             push @itemtype, $value;
470             $itemtypes{$value} = $lib;
471         }
472
473         my $CGIitemtype = CGI::scrolling_list(
474             -name     => 'value',
475             -values   => \@itemtype,
476             -labels   => \%itemtypes,
477             -size     => 1,
478             -multiple => 0
479         );
480         $sth->finish;
481
482         my @branchloop;
483         my @select_branch;
484         my %select_branches;
485         my $branches = GetBranches;
486         push @select_branch, "";
487         $select_branches{''} = "";
488         foreach my $thisbranch ( keys %$branches ) {
489             push @select_branch, $branches->{$thisbranch}->{'branchcode'};
490             $select_branches{ $branches->{$thisbranch}->{'branchcode'} } =
491               $branches->{$thisbranch}->{'branchname'};
492         }
493         my $CGIbranch = CGI::scrolling_list(
494             -name     => 'value',
495             -values   => \@select_branch,
496             -labels   => \%select_branches,
497             -size     => 1,
498             -multiple => 0
499         );
500         $sth->finish;
501
502         my $req =
503           $dbh->prepare(
504 "select distinctrow left(publishercode,45) from biblioitems order by publishercode"
505           );
506         $req->execute;
507         my @select;
508         push @select, "";
509         while ( my ($value) = $req->fetchrow ) {
510             push @select, $value;
511         }
512         my $CGIpublisher = CGI::scrolling_list(
513             -name     => 'value',
514             -id       => 'publisher',
515             -values   => \@select,
516             -size     => 1,
517             -multiple => 0
518         );
519
520 #         my $sth=$dbh->prepare("select description,itemtype from itemtypes order by description");
521 #         $sth->execute;
522 #         while (my ($description,$itemtype) = $sth->fetchrow) {
523 #             $classlist.="<option value=\"$itemtype\">$description</option>\n";
524 #         }
525 #         $sth->finish;
526
527         $template->param(    #classlist => $classlist,
528             CGIitemtype  => $CGIitemtype,
529             CGIbranch    => $CGIbranch,
530             CGIPublisher => $CGIpublisher,
531             index        => $query->param('index'),
532             Search       => 1,
533         );
534     }
535     output_html_with_http_headers $query, $cookie, $template->output;
536 }
537
538 1;