[Koha-patches] [PATCH] Analytical records support

Amit Gupta amit.gupta at osslabs.biz
Sun Oct 31 12:49:18 CET 2010


Display links to parent biblios, show linked items in holdings, allow holds on linked items. This uses MARC to maintain relationships.
---
 C4/Biblio.pm                                       |   34 ++++++++++++++++++++
 C4/Search.pm                                       |   20 +++++++++++
 catalogue/detail.pl                                |   19 +++++++++++
 cataloguing/addbiblio.pl                           |   34 ++++++++++++++++++++
 .../prog/en/modules/catalogue/detail.tmpl          |    4 ++
 .../prog/en/modules/catalogue/moredetail.tmpl      |    2 +-
 .../opac-tmpl/prog/en/modules/opac-detail.tmpl     |    9 +++++
 opac/opac-detail.pl                                |   14 ++++++++
 opac/opac-reserve.pl                               |   16 +++++++++
 9 files changed, 151 insertions(+), 1 deletions(-)

diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index 81ccfbb..a58f03e 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -72,6 +72,7 @@ BEGIN {
       &GetMarcBiblio
       &GetMarcAuthors
       &GetMarcSeries
+      &GetMarcHosts
       GetMarcUrls
       &GetUsedMarcStructure
       &GetXmlBiblio
@@ -1553,6 +1554,39 @@ sub GetMarcSeries {
     return $marcseriessarray;
 }    #end getMARCseriess
 
+=head2 GetMarcHosts
+
+  $marchostsarray = GetMarcHosts($record,$marcflavour);
+
+Get all host records (773s) from the MARC record and returns them in an array.
+
+=cut
+
+sub GetMarcHosts {
+    my ( $record, $marcflavour ) = @_;
+    my ( $tag );
+    if ( $marcflavour eq "MARC21" ) {
+        $tag = "773";
+
+    }
+
+    my @marchosts;
+
+    foreach my $field ( $record->field('773')) {
+
+        my @fields_loop;
+
+        my $hostbiblionumber = $field->subfield("w");
+        my $hosttitle = $field->subfield("a");
+        my $hostitemnumber=$field->subfield("o");
+        push @fields_loop, { hostbiblionumber => $hostbiblionumber, hosttitle => $hosttitle, hostitemnumber => $hostitemnumber};
+        push @marchosts, { MARCHOSTS_FIELDS_LOOP => \@fields_loop };
+
+        }
+    my $marchostsarray = \@marchosts;
+    return $marchostsarray;
+}
+
 =head2 GetFrameworkCode
 
   $frameworkcode = GetFrameworkCode( $biblionumber )
diff --git a/C4/Search.pm b/C4/Search.pm
index d36459a..7795b6f 100644
--- a/C4/Search.pm
+++ b/C4/Search.pm
@@ -1501,6 +1501,26 @@ sub searchResults {
         # Pull out the items fields
         my @fields = $marcrecord->field($itemtag);
 
+        # adding linked items that belong to host records
+        foreach my $hostfield ( $marcrecord->field('773')) {
+                my $hostbiblionumber = $hostfield->subfield("w");
+                my $linkeditemnumber = $hostfield->subfield("o");
+                if(!$hostbiblionumber eq undef){
+                        my $hostbiblio = GetMarcBiblio($hostbiblionumber);
+                        if(!$hostbiblio eq undef){
+                        my @hostitems = $hostbiblio->field('952');
+                        foreach my $hostitem (@hostitems){
+                                if ($hostitem->subfield("9") eq $linkeditemnumber){
+                                        my $linkeditem =$hostitem;
+                                         # append linked items if they exist
+                                        if (!$linkeditem eq undef){
+                                        push (@fields, $linkeditem);}
+                                }
+                        }
+                        }
+                }
+        }
+
         # Setting item statuses for display
         my @available_items_loop;
         my @onloan_items_loop;
diff --git a/catalogue/detail.pl b/catalogue/detail.pl
index 4f6c23f..7990f6a 100755
--- a/catalogue/detail.pl
+++ b/catalogue/detail.pl
@@ -91,6 +91,7 @@ my $marcauthorsarray = GetMarcAuthors( $record, $marcflavour );
 my $marcsubjctsarray = GetMarcSubjects( $record, $marcflavour );
 my $marcseriesarray  = GetMarcSeries($record,$marcflavour);
 my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
+my $marchostsarray  = GetMarcHosts($record,$marcflavour);
 my $subtitle         = GetRecordValue('subtitle', $record, $fw);
 
 # Get Branches, Itemtypes and Locations
@@ -100,6 +101,23 @@ my $dbh = C4::Context->dbh;
 
 # change back when ive fixed request.pl
 my @items = &GetItemsInfo( $biblionumber, 'intra' );
+
+# flag indicating existence of at least one item linked via a host record
+my $hostrecords;
+# adding items linked via host biblios
+   foreach my $hostfield ( $record->field('773')) {
+        my $hostbiblionumber = $hostfield->subfield("w");
+        my $linkeditemnumber = $hostfield->subfield("o");
+        my @hostitemInfos = GetItemsInfo($hostbiblionumber);
+        foreach my $hostitemInfo (@hostitemInfos){
+                if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){
+                        $hostrecords =1;
+                        push(@items, $hostitemInfo);
+                }
+         }
+    }
+
+
 my $dat = &GetBiblioData($biblionumber);
 
 #coping with subscriptions
@@ -207,6 +225,7 @@ $template->param(
 	MARCAUTHORS => $marcauthorsarray,
 	MARCSERIES  => $marcseriesarray,
 	MARCURLS => $marcurlsarray,
+	MARCHOSTS => $marchostsarray,
 	subtitle    => $subtitle,
 	itemdata_ccode      => $itemfields{ccode},
 	itemdata_enumchron  => $itemfields{enumchron},
diff --git a/cataloguing/addbiblio.pl b/cataloguing/addbiblio.pl
index fc56047..a306dd3 100755
--- a/cataloguing/addbiblio.pl
+++ b/cataloguing/addbiblio.pl
@@ -693,6 +693,39 @@ sub build_tabs ($$$$$) {
                            # always include in the form regardless of the hidden setting - bug 2206
                     next
                       if ( $tagslib->{$tag}->{$subfield}->{tab} ne $tabloop );
+
+                # populating host record details for analytical records
+                my $hostbiblionumber = $input->param('hostbiblionumber');
+                my $hostitemnumber = $input->param('hostitemnumber');
+                    if ( $tag eq 773 and $hostbiblionumber){
+                                my $hostrecord = &GetMarcBiblio($hostbiblionumber);
+                                if ($subfield eq "w"){
+                                        push(
+                                                @subfields_data,
+                                        &create_input(
+                                            $tag, $subfield,$hostbiblionumber, $index_tag, $tabloop, $record,
+                                            $authorised_values_sth,$input
+                                        ));
+                                }
+                                elsif ($subfield eq "a"){
+                                        push(
+                                        @subfields_data,
+                                        &create_input(
+                                            $tag, $subfield,$hostrecord->subfield('245',"a"), $index_tag, $tabloop, $record,
+                                            $authorised_values_sth,$input
+                                        ));
+                                }
+                                elsif ($subfield eq "o"){
+                                        push(
+                                        @subfields_data,
+                                        &create_input(
+                                            $tag, $subfield,$hostitemnumber, $index_tag, $tabloop, $record,
+                                            $authorised_values_sth,$input
+                                        ));
+                                }
+
+                        }
+                         else {
                     push(
                         @subfields_data,
                         &create_input(
@@ -700,6 +733,7 @@ sub build_tabs ($$$$$) {
                             $authorised_values_sth,$input
                         )
                     );
+		}
                 }
                 if ( $#subfields_data >= 0 ) {
                     my %tag_data = (
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
index 1861028..34618bc 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/detail.tmpl
@@ -215,6 +215,7 @@ function verify_images() {
                 <!-- TMPL_IF NAME="itemdata_uri" --><th>URL</th><!-- /TMPL_IF -->
                 <!-- TMPL_IF NAME="itemdata_copynumber" --><th>Copy No.</th><!-- /TMPL_IF -->
 		<!-- TMPL_IF NAME="SpineLabelShowPrintOnBibDetails" --><th>Spine Label</th><!-- /TMPL_IF -->
+                <!-- TMPL_IF NAME="hostrecords" --><th>Host Record</th><!-- /TMPL_IF -->
             </tr>
             <!-- TMPL_LOOP NAME="itemloop" -->
                 <tr>
@@ -339,6 +340,9 @@ function verify_images() {
 		<!-- TMPL_IF NAME="SpineLabelShowPrintOnBibDetails" -->
 			<td><a href="/cgi-bin/koha/labels/spinelabel-print.pl?barcode=<!-- TMPL_VAR NAME="barcode" -->" >Print Label</a></td>
 		<!-- /TMPL_IF -->
+                <!-- TMPL_IF NAME="hostrecords" -->
+                      <td><!-- TMPL_IF NAME="hostbiblionumber" --><a href="/cgi-bin/koha/catalogue/detail.pl?biblionumber=<!-- TMPL_VAR NAME="hostbiblionumber" -->" >Host Record</a><!-- /TMPL_IF --></td>
+                <!-- /TMPL_IF -->
 
                 </tr>
             <!-- /TMPL_LOOP -->
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
index 8577193..76ebec7 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/catalogue/moredetail.tmpl
@@ -42,7 +42,7 @@
     <!-- TMPL_LOOP NAME="ITEM_DATA" -->
     <div class="yui-g">
         <h3 id="item<!-- TMPL_VAR NAME="itemnumber" -->">Barcode <!-- TMPL_VAR NAME="barcode" -->  <!-- TMPL_IF name="notforloantext" --><!-- TMPL_VAR name="notforloantext" --> <!-- /TMPL_IF --></h3>
-        <div class="listgroup"><h4>Item Information <!-- TMPL_IF NAME="CAN_user_editcatalogue_edit_catalogue" --><!-- TMPL_UNLESS name="nomod" --><a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=<!-- TMPL_VAR NAME="biblionumber"-->&amp;itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Edit Items]</a><!-- /TMPL_IF --><!-- /TMPL_UNLESS --></h4>
+        <div class="listgroup"><h4>Item Information <!-- TMPL_IF NAME="CAN_user_editcatalogue_edit_catalogue" --><!-- TMPL_UNLESS name="nomod" --><a href="/cgi-bin/koha/cataloguing/additem.pl?op=edititem&amp;biblionumber=<!-- TMPL_VAR NAME="biblionumber"-->&amp;itemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Edit Items]</a>&nbsp;<a href="/cgi-bin/koha/cataloguing/addbiblio.pl?hostbiblionumber=<!-- TMPL_VAR NAME="biblionumber" -->&amp;hostitemnumber=<!-- TMPL_VAR NAME="itemnumber" -->">[Create Analytical Record]</a><!-- /TMPL_IF --><!-- /TMPL_UNLESS --></h4>
             <ol class="bibliodetails">
             <li><span class="label">Home Library:</span> <!-- TMPL_VAR NAME="homebranchname" -->&nbsp;</li>
 	    <!-- TMPL_IF NAME="item-level_itypes" -->
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
index b1fdf84..17ecb33 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
@@ -127,6 +127,15 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
             <!-- /TMPL_LOOP -->
     </span>
     <!-- /TMPL_IF -->
+
+<!-- TMPL_IF NAME="MARCHOSTS" -->
+                <li><strong>Host Records: </strong><ul><!-- TMPL_LOOP NAME="MARCHOSTS" -->
+                <li><!-- TMPL_LOOP NAME="MARCHOSTS_FIELDS_LOOP" --> <!-- TMPL_IF NAME="hosttitle" --> <a href="/cgi-bin/koha/opac-detail.pl?biblionumber=<!-- TMPL_VAR NAME="hostbiblionumber" ESCAPE="url"-->"><!-- TMPL_VAR NAME="hosttitle" --></a><!-- /TMPL_IF --> <!-- /TMPL_LOOP --></li>
+                <!-- /TMPL_LOOP -->
+                </ul>
+                </li>
+    <!-- /TMPL_IF -->
+
     <!-- TMPL_IF name="editionstatement" -->
     <span class="results_summary"><span class="label">Edition statement:</span><!-- TMPL_VAR NAME="editionstatement" --><!-- TMPL_IF name="editionresponsibility" -->/<!-- TMPL_VAR NAME="editionresponsibility" --><!-- /TMPL_IF--></span>
     <!-- /TMPL_IF -->
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index 629ebd2..3e55fcd 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -79,6 +79,19 @@ if (C4::Context->preference("OPACXSLTDetailsDisplay") ) {
 $template->param('OPACShowCheckoutName' => C4::Context->preference("OPACShowCheckoutName") ); 
 # change back when ive fixed request.pl
 my @all_items = &GetItemsInfo( $biblionumber, 'opac' );
+
+# adding items linked via host biblios
+   foreach my $hostfield ( $record->field('773')) {
+        my $hostbiblionumber = $hostfield->subfield("w");
+        my $linkeditemnumber = $hostfield->subfield("o");
+        my @hostitemInfos = GetItemsInfo($hostbiblionumber);
+        foreach my $hostitemInfo (@hostitemInfos){
+                if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){
+                        push(@all_items, $hostitemInfo);
+                }
+         }
+    }
+
 my @items;
 @items = @all_items unless C4::Context->preference('hidelostitems');
 
@@ -203,6 +216,7 @@ my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour);
 my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour);
 my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
 my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
+my $marchostsarray  = GetMarcHosts($record,$marcflavour);
 my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
 
     $template->param(
diff --git a/opac/opac-reserve.pl b/opac/opac-reserve.pl
index 699179b..bcd47a7 100755
--- a/opac/opac-reserve.pl
+++ b/opac/opac-reserve.pl
@@ -114,6 +114,22 @@ foreach my $biblioNumber (@biblionumbers) {
     $biblioDataHash{$biblioNumber} = $biblioData;
 
     my @itemInfos = GetItemsInfo($biblioNumber);
+
+    my $marcrecord= GetMarcBiblio($biblioNumber);
+
+# adding items linked via host biblios
+    foreach my $hostfield ( $marcrecord->field('773')) {
+        my $hostbiblionumber = $hostfield->subfield("w");
+        my $linkeditemnumber = $hostfield->subfield("o");
+        my @hostitemInfos = GetItemsInfo($hostbiblionumber);
+        foreach my $hostitemInfo (@hostitemInfos){
+                if ($hostitemInfo->{itemnumber} eq $linkeditemnumber){
+                        push(@itemInfos, $hostitemInfo);
+                }
+         }
+    }
+
+
     $biblioData->{itemInfos} = \@itemInfos;
     foreach my $itemInfo (@itemInfos) {
         $itemInfoHash{$itemInfo->{itemnumber}} = $itemInfo;
-- 
1.5.4.5



More information about the Koha-patches mailing list