(bug #3726) fix ISBD url translation
[koha.git] / C4 / Biblio.pm
index bb86999..5e5825e 100755 (executable)
@@ -36,7 +36,7 @@ use C4::Charset;
 require C4::Heading;
 require C4::Serials;
 
-use vars qw($VERSION @ISA @EXPORT);
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
 
 BEGIN {
        $VERSION = 1.00;
@@ -46,13 +46,16 @@ BEGIN {
 
        # to add biblios
 # EXPORTED FUNCTIONS.
+    push @EXPORT_OK, qw(
+        &GetRecordValue
+    );
+
        push @EXPORT, qw( 
                &AddBiblio
        );
 
        # to get something
        push @EXPORT, qw(
-           &Get
                &GetBiblio
                &GetBiblioData
                &GetBiblioItemData
@@ -60,9 +63,10 @@ BEGIN {
                &GetBiblioItemByBiblioNumber
                &GetBiblioFromItemNumber
                
-               GetFieldMapping
-               SetFieldMapping
-               DeleteFieldMapping
+               &GetRecordValue
+               &GetFieldMapping
+               &SetFieldMapping
+               &DeleteFieldMapping
                
                &GetISBDView
 
@@ -471,11 +475,11 @@ sub LinkBibHeadingsToAuthorities {
     return $num_headings_changed;
 }
 
-=head2 Get
+=head2 GetRecordValue
 
 =over 4
 
-my $values = Get($field, $record, $frameworkcode);
+my $values = GetRecordValue($field, $record, $frameworkcode);
 
 =back
 
@@ -483,7 +487,7 @@ Get MARC fields from a keyword defined in fieldmapping table.
 
 =cut
 
-sub Get {
+sub GetRecordValue {
     my ($field, $record, $frameworkcode) = @_;
     my $dbh = C4::Context->dbh;
     
@@ -505,7 +509,7 @@ sub Get {
         }
     }
     
-    return @result;
+    return \@result;
 }
 
 =head2 SetFieldMapping
@@ -738,7 +742,7 @@ Return the ISBD view which can be included in opac and intranet
 =cut
 
 sub GetISBDView {
-    my $biblionumber    = shift;
+    my ($biblionumber, $template) = @_;
     my $record          = GetMarcBiblio($biblionumber);
     my $itemtype        = &GetFrameworkCode($biblionumber);
     my ($holdingbrtagf,$holdingbrtagsubf) = &GetMarcFromKohaField("items.holdingbranch",$itemtype);
@@ -782,7 +786,7 @@ sub GetISBDView {
                     my $tagsubf = $tag . $subfvalue;
                     $calculated =~
                           s/\{(.?.?.?.?)$tagsubf(.*?)\}/$1$subfieldvalue$2\{$1$tagsubf$2\}/g;
-                    $calculated =~s#/cgi-bin/koha/[^/]+/([^.]*.pl\?.*)$#opac-$1#g;
+                    $calculated =~s#/cgi-bin/koha/[^/]+/([^.]*.pl\?.*)$#opac-$1#g if ($template eq "opac");
                 
                     # field builded, store the result
                     if ( $calculated && !$hasputtextbefore )
@@ -823,7 +827,7 @@ sub GetISBDView {
     
                 $calculated =~
             s/\{(.?.?.?.?)$tagsubf(.*?)\}/$1$subfieldvalue$2\{$1$tagsubf$2\}/g;
-            $calculated =~s#/cgi-bin/koha/[^/]+/([^.]*.pl\?.*)$#opac-$1#g;
+            $calculated =~s#/cgi-bin/koha/[^/]+/([^.]*.pl\?.*)$#opac-$1#g if ($template eq "opac");
                 }
     
                 # field builded, store the result
@@ -1740,6 +1744,7 @@ sub TransformHtmlToXml {
     my $prevtag = -1;
     my $first   = 1;
     my $j       = -1;
+       @$indicator=map{sprintf("%2s",$_) unless ( length($_)<2)}@$indicator;
     for ( my $i = 0 ; $i < @$tags ; $i++ ) {
         if (C4::Context->preference('marcflavour') eq 'UNIMARC' and @$tags[$i] eq "100" and @$subfields[$i] eq "a") {
             # if we have a 100 field and it's values are not correct, skip them.
@@ -1766,10 +1771,10 @@ sub TransformHtmlToXml {
                 if (   ( @$tags[$i] && @$tags[$i] > 10 )
                     && ( @$values[$i] ne "" ) )
                 {
-                    my $ind1 = substr( @$indicator[$j], 0, 1 );
+                    my $ind1 = _default_ind_to_space(substr( @$indicator[$j], 0, 1 ));
                     my $ind2;
                     if ( @$indicator[$j] ) {
-                        $ind2 = substr( @$indicator[$j], 1, 1 );
+                        $ind2 = _default_ind_to_space(substr( @$indicator[$j], 1, 1 ));
                     }
                     else {
                         warn "Indicator in @$tags[$i] is empty";
@@ -1798,10 +1803,8 @@ sub TransformHtmlToXml {
                         $first = 1;
                     }
                     else {
-                        my $ind1 = substr( @$indicator[$j], 0, 1 );
-                        my $ind2 = substr( @$indicator[$j], 1, 1 );
-                        $ind1 = " " if !defined($ind2) or $ind2 eq "";
-                        $ind2 = " " if !defined($ind2) or $ind2 eq "";
+                        my $ind1 = _default_ind_to_space( substr( @$indicator[$j], 0, 1 ) );
+                        my $ind2 = _default_ind_to_space( substr( @$indicator[$j], 1, 1 ) );
                         $xml .= "<datafield tag=\"@$tags[$i]\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
                         $xml .= "<subfield code=\"@$subfields[$i]\">@$values[$i]</subfield>\n";
                         $first = 0;
@@ -1814,10 +1817,8 @@ sub TransformHtmlToXml {
             }
             else {
                 if ($first) {
-                    my $ind1 = substr( @$indicator[$j], 0, 1 );
-                    my $ind2 = substr( @$indicator[$j], 1, 1 );
-                    $ind1 = " " if !defined($ind2) or $ind2 eq "";
-                    $ind2 = " " if !defined($ind2) or $ind2 eq "";
+                    my $ind1 = _default_ind_to_space( substr( @$indicator[$j], 0, 1 ) );
+                    my $ind2 = _default_ind_to_space( substr( @$indicator[$j], 1, 1 ) );
                     $xml .= "<datafield tag=\"@$tags[$i]\" ind1=\"$ind1\" ind2=\"$ind2\">\n";
                     $first = 0;
                 }
@@ -1844,6 +1845,21 @@ sub TransformHtmlToXml {
     return $xml;
 }
 
+=head2 _default_ind_to_space
+
+Passed what should be an indicator returns a space
+if its undefined or zero length
+
+=cut
+
+sub _default_ind_to_space {
+    my $s = shift;
+    if (!defined $s || $s eq q{}) {
+        return ' ';
+    }
+    return $s;
+}
+
 =head2 TransformHtmlToMarc
 
     L<$record> = TransformHtmlToMarc(L<$params>,L<$cgi>)
@@ -1916,8 +1932,8 @@ sub TransformHtmlToMarc {
         elsif ($param =~ /^tag_(\d*)_indicator1_/){ # new field start when having 'input name="..._indicator1_..."
             my $tag  = $1;
             
-            my $ind1 = substr($cgi->param($param),0,1);
-            my $ind2 = substr($cgi->param($params->[$i+1]),0,1);
+            my $ind1 = _default_ind_to_space(substr($cgi->param($param),          0, 1));
+            my $ind2 = _default_ind_to_space(substr($cgi->param($params->[$i+1]), 0, 1));
             $newfield=0;
             my $j=$i+2;
             
@@ -1946,8 +1962,8 @@ sub TransformHtmlToMarc {
                         if ( $cgi->param($params->[$j+1]) ne '' ) { # creating only if there is a value (code => value)
                             $newfield = MARC::Field->new(
                                 $tag,
-                                ''.$ind1,
-                                ''.$ind2,
+                                $ind1,
+                                $ind2,
                                 $cgi->param($inner_param) => $cgi->param($params->[$j+1]),
                             );
                         }
@@ -2253,11 +2269,15 @@ sub PrepareItemrecordDisplay {
     my ( $bibnum, $itemnum, $defaultvalues ) = @_;
 
     my $dbh = C4::Context->dbh;
+       my $today_iso = C4::Dates->today('iso');
     my $frameworkcode = &GetFrameworkCode( $bibnum );
     my ( $itemtagfield, $itemtagsubfield ) =
       &GetMarcFromKohaField( "items.itemnumber", $frameworkcode );
     my $tagslib = &GetMarcStructure( 1, $frameworkcode );
     my $itemrecord = C4::Items::GetMarcItem( $bibnum, $itemnum) if ($itemnum);
+       # FIXME : I'd rather have GetMarcBiblio called out of this.
+       # Since it gets the whole Biblio record for each item
+    my $marcrecord = GetMarcBiblio( $bibnum) if ($bibnum);
     my @loop_data;
     my $authorised_values_sth =
       $dbh->prepare(
@@ -2290,9 +2310,15 @@ sub PrepareItemrecordDisplay {
                   if ($itemrecord) {
                       ( $x, $value ) = _find_value( $tag, $subfield, $itemrecord );
                   }
-                  if (!defined $value) {
-                      $value = q||;
-                  }
+                                 unless ($value) {
+                                               $value   = $tagslib->{$tag}->{$subfield}->{defaultvalue};
+                                               $value ||= $defaultvalues->{$tagslib->{$tag}->{$subfield}->{'kohafield'}};
+                                               # get today date & replace YYYY, MM, DD if provided in the default value
+                                               my ( $year, $month, $day ) = split ',', $today_iso;     # FIXME: iso dates don't have commas!
+                                               $value =~ s/YYYY/$year/g;
+                                               $value =~ s/MM/$month/g;
+                                               $value =~ s/DD/$day/g;
+                                 }
                   $value =~ s/"/&quot;/g;
 
                 # search for itemcallnumber if applicable
@@ -2304,7 +2330,7 @@ sub PrepareItemrecordDisplay {
                       substr( C4::Context->preference('itemcallnumber'), 0, 3 );
                     my $CNsubfield =
                       substr( C4::Context->preference('itemcallnumber'), 3, 1 );
-                    my $temp = $itemrecord->field($CNtag) if ($itemrecord);
+                    my $temp = $marcrecord->field($CNtag) if ($marcrecord);
                     if ($temp) {
                         $value = $temp->subfield($CNsubfield);
                     }