If itemnumber is sent to catalogue/moredetail.pl use it
[koha.git] / C4 / XSLT.pm
index 3c781d2..60e8496 100644 (file)
@@ -47,14 +47,13 @@ C4::XSLT - Functions for displaying XSLT-generated content
 
 =head1 transformMARCXML4XSLT
 
-=head2 replaces codes with authorized values in a MARCXML record
+=head2 replaces codes with authorized values in a MARC::Record object
 
 =cut
 
 sub transformMARCXML4XSLT {
-    my ($biblionumber) = @_;
-    my $record = GetMarcBiblio($biblionumber);
-    my $biblio = GetBiblioData($biblionumber);
+    my ($biblionumber, $orig_record) = @_;
+    my $record = $orig_record->clone(); # not updating original record; this may be unnecessarily paranoid
     my $frameworkcode = GetFrameworkCode($biblionumber);
     my $tagslib = &GetMarcStructure(1,$frameworkcode);
     my @fields;
@@ -80,7 +79,7 @@ sub transformMARCXML4XSLT {
                 $authvalue->{tagfield},
                 $field->indicator(1),
                 $field->indicator(2),
-                $authvalue->{tagsubfield} => @newSubfields
+                @newSubfields
             );
             $field->replace_with($newField);
         }
@@ -94,32 +93,51 @@ sub transformMARCXML4XSLT {
 
 =cut
 
+# Cache for tagfield-tagsubfield to decode per framework.
+# Should be preferably be placed in Koha-core...
+my %authval_per_framework;
+
 sub getAuthorisedValues4MARCSubfields {
     my ($frameworkcode) = @_;
-    my @results;
-    my $dbh = C4::Context->dbh;
-    my $sth = $dbh->prepare("SELECT DISTINCT tagfield,tagsubfield FROM marc_subfield_structure WHERE authorised_value IS NOT NULL AND authorised_value!='' AND frameworkcode=?");
-    $sth->execute($frameworkcode);
-    while (my $result = $sth->fetchrow_hashref()) {
-        push @results, $result;
+    unless ( $authval_per_framework{ $frameworkcode } ) {
+        my @results;
+        my $dbh = C4::Context->dbh;
+        my $sth = $dbh->prepare("SELECT DISTINCT tagfield, tagsubfield
+                                 FROM marc_subfield_structure
+                                 WHERE authorised_value IS NOT NULL
+                                   AND authorised_value!=''
+                                   AND frameworkcode=?");
+        $sth->execute( $frameworkcode );
+        while ( my $result = $sth->fetchrow_hashref() ) {
+            push ( @results, $result );
+        }
+        $authval_per_framework{ $frameworkcode } = \@results;
     }
-    return \@results;
+    return $authval_per_framework{ $frameworkcode };
 }
 
+my $stylesheet;
+
 sub XSLTParse4Display {
-    my ($biblionumber,$xslfile) = @_;
+    my ( $biblionumber, $orig_record, $xsl_suffix ) = @_;
     # grab the XML, run it through our stylesheet, push it out to the browser
-    my $record = transformMARCXML4XSLT($biblionumber);
+    my $record = transformMARCXML4XSLT($biblionumber, $orig_record);
     my $itemsxml  = buildKohaItemsNamespace($biblionumber);
     my $xmlrecord = $record->as_xml();
     $xmlrecord =~ s/\<\/record\>/$itemsxml\<\/record\>/;
     my $parser = XML::LibXML->new();
     # don't die when you find &, >, etc
     $parser->recover_silently(1);
-    my $xslt = XML::LibXSLT->new();
     my $source = $parser->parse_string($xmlrecord);
-    my $style_doc = $parser->parse_file($xslfile);
-    my $stylesheet = $xslt->parse_stylesheet($style_doc);
+    unless ( $stylesheet ) {
+        my $xslt = XML::LibXSLT->new();
+        my $xslfile = C4::Context->config('opachtdocs') . 
+                      "/prog/en/xslt/" .
+                      C4::Context->preference('marcflavour') .
+                      "slim2OPAC$xsl_suffix.xsl";
+        my $style_doc = $parser->parse_file($xslfile);
+        $stylesheet = $xslt->parse_stylesheet($style_doc);
+    }
     my $results = $stylesheet->transform($source);
     my $newxmlrecord = $stylesheet->output_string($results);
     return $newxmlrecord;
@@ -130,17 +148,20 @@ sub buildKohaItemsNamespace {
     my @items = C4::Items::GetItemsInfo($biblionumber);
     my $branches = GetBranches();
     my $itemtypes = GetItemTypes();
+
     my $xml;
     for my $item (@items) {
         my $status;
+
         my ( $transfertwhen, $transfertfrom, $transfertto ) = C4::Circulation::GetTransfers($item->{itemnumber});
-        if ( $item->{notforloan} == -1 || $item->{onloan} || $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} ||
+
+        if ( $itemtypes->{ $item->{itype} }->{notforloan} == 1 || $item->{notforloan} || $item->{onloan} || $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} ||
              ($transfertwhen ne '') || $item->{itemnotforloan} ) {
-            if ( $item->{notforloan} == -1) {
+            if ( $item->{notforloan} < 0) {
                 $status = "On order";
             } 
-            if ( $item->{itemnotforloan} ) {
-                $status = "Not for loan";
+            if ( $item->{itemnotforloan} > 0 || $item->{notforloan} > 0 || $itemtypes->{ $item->{itype} }->{notforloan} == 1 ) {
+                $status = "reference";
             }
             if ($item->{onloan}) {
                 $status = "Checked out";
@@ -160,7 +181,10 @@ sub buildKohaItemsNamespace {
         } else {
             $status = "available";
         }
-        $xml.="<item><homebranch>".$branches->{$item->{homebranch}}->{'branchname'}."</homebranch>"."<status>$status</status></item>";
+        $xml.="<item><homebranch>".$branches->{$item->{homebranch}}->{'branchname'}."</homebranch>".
+               "<status>$status</status>".
+               "<itemcallnumber>".$item->{'itemcallnumber'}."</itemcallnumber></item>";
+
     }
     return "<items xmlns='http://www.koha.org/items'>".$xml."</items>";
 }