[Koha-patches] [PATCH 49/54] opac-detail subject/author links improvements

paul.poulain at biblibre.com paul.poulain at biblibre.com
Thu Dec 16 11:54:43 CET 2010


From: Paul Poulain <paul.poulain at biblibre.com>

When the user clicks on a subject or an author, the list of subjects (authors) is displayed
and the user can choose more than 1 subject (author) to search on

this is very convenient when, for example, subjects are :
France, history, kingdom, war

to do a search on "France + war" easily
---
 .../opac-tmpl/prog/en/modules/opac-detail.tmpl     |  174 ++++++++++++++++++--
 opac/opac-detail.pl                                |   73 ++++++--
 2 files changed, 218 insertions(+), 29 deletions(-)

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 084c484..1c131a3 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tmpl
@@ -25,7 +25,17 @@
         KOHA.Google.GetCoverFromIsbn();<!-- /TMPL_IF --><!-- TMPL_IF NAME="TagsEnabled" -->
         $(".tagbutton").click(KOHA.Tags.add_tag_button);<!-- /TMPL_IF -->
 		<!-- TMPL_IF NAME="opacbookbag" -->$("a.print").parent().after("<li><a class=\"addtocart\" href=\"#\" onclick=\"addRecord('"+$("input[name=bib]").val()+"'); return false;\">"+_("Add to Your Cart")+"<\/a><\/li>");
-<!-- /TMPL_IF -->});
+<!-- /TMPL_IF --> 
+<!-- TMPL_IF NAME="MARCSUBJCTS" -->
+	$("#magnifier a").each(function(){
+	   var lgth = $(this).attr('href').length;
+           var authid = $(this).attr('href').substring(47, lgth ); 
+           if (!parseInt(authid)) {
+               $(this).hide();
+           } 
+        });
+<!-- /TMPL_IF -->
+});
 
 YAHOO.util.Event.onContentReady("furtherm", function () {
     $("#furtherm").css("display","block").css("visibility","hidden");
@@ -44,6 +54,95 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
 	
 //]]>
 </script>
+<script type="text/JavaScript" language="JavaScript">
+    function showAuthors(element, value){
+        check("#authorsList", value);
+        makeAuthorRequest();
+        var left = element.offsetLeft || 0;
+        var top = element.offsetTop || 0;
+        $('.authorSearch').css('display', 'block');
+        $('.authorSearch').css('left', left);
+        $('.authorSearch').css('top', top + 15);
+    }
+
+    function hideMenu(elem) {
+        $(elem).css('display', 'none');
+    }
+    
+    function check(elem, value) {
+        $(elem).find("li").each(function (){
+            if ($(this).find("input").val() == value) { $(this).find("input").attr("checked", "true"); }
+            else { $(this).find("input").attr("checked", ""); }
+        });
+    }
+    
+    function checkAll(elem) {
+        var check = "";
+        if ($(elem).find("li:first").find("input").attr("checked")){ check = true; }
+        $(elem).find("li").not(":first").each(function (){
+            $(this).find("input").attr("checked", check);
+        });
+        elem == "#authorsList" ? makeAuthorRequest() : makeSubjectRequest();
+    }
+    
+    function makeAuthorRequest(){
+        var request = "/cgi-bin/koha/opac-search.pl?q=";
+        var alreadyFound = false;
+        $("#authorsList").find("li").each(function (){ 
+            if ($(this).find("input").attr("checked") && $(this).find("input").attr("name") == "checkbox") {
+                value = $(this).find("input").val();
+                if (alreadyFound){ request += " and " + value; }
+                else { 
+                    request += value; 
+                    alreadyFound = true;
+                }  
+            }
+        });
+        if (alreadyFound) {
+            $("#validAuthorSearch").attr("href", request);
+        }else {
+            $("#validAuthorSearch").removeAttr("href");
+        }
+        
+    }
+    //Subjects
+    function showSubjects(element, value, code){
+        $("#subjectsList").find("li").each(function (){
+            $(this).find("input").attr("checked", "");
+        });
+        $("#subjectsList").find("li").each(function (){
+            if ($(this).find("input").val() == value && $(this).find("input").attr("code") == code) { 
+                $(this).find("input").attr("checked", "true");
+                var elem = this;
+                while ($(elem).prev("li").children().attr("id") == "checkbox") {
+                    $(elem).prev("li").find("input").attr("checked", "true");
+                    elem = $(elem).prev("li");
+                } 
+            }
+        });
+        makeSubjectRequest();
+        var left = element.offsetLeft || 0;
+        var top = element.offsetTop || 0;
+        $('.subjectSearch').css('display', 'block');
+        $('.subjectSearch').css('left', left);
+        $('.subjectSearch').css('top', top + 15);
+    }
+    function makeSubjectRequest() {
+        var request = "/cgi-bin/koha/opac-search.pl?q=";
+        var alreadyFound = false;
+        $("#subjectsList").find("li").each(function (){
+            if ($(this).find("input").attr("checked") && $(this).find("input").attr("name") == "checkbox") {
+                value = $(this).find("input").val();
+                if (alreadyFound){ request += " and " + value; }
+                else { 
+                    request += value; 
+                    alreadyFound = true;
+                }  
+            }
+        });
+        alreadyFound ? $("#validSubjectSearch").attr("href", request) : $("#validSubjectSearch").removeAttr("href");
+    }
+</script>
 <style type="text/css">
     #addtagl { display: none; }
 </style>
@@ -94,7 +193,24 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
     <!-- TMPL_ELSE -->
     <h1><!-- TMPL_VAR NAME="title" escape="html" --><!-- TMPL_IF NAME="subtitle" --> <span class="subtitle"><!-- TMPL_LOOP NAME="subtitle" --><!-- TMPL_VAR NAME="subfield" --> <!-- /TMPL_LOOP --></span><!-- /TMPL_IF --></h1>
     <!-- TMPL_IF NAME="author" --><h5 class="author">by <a href="/cgi-bin/koha/opac-search.pl?q=au:<!-- TMPL_VAR NAME="author" ESCAPE="URL" -->"><!-- TMPL_VAR NAME="author" ESCAPE="HTML" --></a></h5><!-- /TMPL_IF --> 
-    <div id="views"><span class="view"><span id="Normalview">Normal View</span></span> <span class="view"><a id="MARCview" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->">MARC View</a></span> <!-- TMPL_IF NAME="ISBD" --><span class="view"><a id="ISBDview" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->">ISBD View</a></span><!-- /TMPL_IF -->
+    <div id="views">
+	<span class="view">
+	    <span id="Normalview">Normal View</span>
+	</span> 
+
+	<!-- TMPL_IF NAME="can_opac_view_MARC" -->
+	    <span class="view">
+		<a id="MARCview" href="/cgi-bin/koha/opac-MARCdetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->">MARC View</a>
+	    </span>
+	<!-- /TMPL_IF -->
+
+	<!-- TMPL_IF NAME="can_opac_view_ISBD" -->
+	    <!-- TMPL_IF NAME="ISBD" -->
+		<span class="view">
+		    <a id="ISBDview" href="/cgi-bin/koha/opac-ISBDdetail.pl?biblionumber=<!-- TMPL_VAR NAME="biblionumber" -->">ISBD View</a>
+		</span>
+	    <!-- /TMPL_IF -->
+	<!-- /TMPL_IF -->
     </div>
 
     <span class="results_summary"><!-- TMPL_UNLESS NAME="item-level_itypes" -->
@@ -109,12 +225,26 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
     </span>
 
     <!-- TMPL_IF name="MARCAUTHORS" -->
-    <span class="results_summary"><span class="label">Authors:</span>
-                <!-- TMPL_LOOP NAME="MARCAUTHORS" -->
-                <!-- TMPL_LOOP NAME="MARCAUTHOR_SUBFIELDS_LOOP" --><!-- TMPL_VAR NAME="separator" --><a title="&#8225;<!-- TMPL_VAR NAME=code --> <!-- TMPL_VAR NAME=value -->" href="/cgi-bin/koha/opac-search.pl?q=<!-- TMPL_LOOP NAME=link_loop --><!-- TMPL_VAR NAME=operator ESCAPE="URL" --><!-- TMPL_VAR NAME='limit' ESCAPE="URL" -->:<!-- TMPL_VAR NAME=link ESCAPE="URL" --><!-- /TMPL_LOOP -->"><!-- TMPL_VAR NAME="value" --></a><!-- /TMPL_LOOP --> 
-        <!-- TMPL_UNLESS NAME="__last__" -->|
-<!-- /TMPL_UNLESS -->
+    <span class="results_summary">
+                <span class="label">Authors:</span>
+                <div class="authorSearch">
+                    <span><b>Select the item(s) to search :</b></span>
+                    <ul id="authorsList">
+                        <li><input type="checkbox" onchange="checkAll('#authorsList')"> <b>all</b></li>
+                        <!-- TMPL_LOOP NAME="bouncemarcauthorsarray" -->
+                                <li><input type="checkbox" name="checkbox" onclick="makeAuthorRequest()" value="<!-- TMPL_IF name="searchbyauthority" --><!-- TMPL_IF name="authoritylink" -->an:<!-- TMPL_VAR name="authoritylink" --><!-- TMPL_ELSE -->au,wrdl:<!-- TMPL_LOOP name="term" --><!-- TMPL_VAR name="value" --><!-- TMPL_UNLESS NAME="__last__" -->+<!-- /TMPL_UNLESS --><!-- /TMPL_LOOP --><!-- /TMPL_IF --><!-- TMPL_ELSE -->au,wrdl:<!-- TMPL_LOOP name="term" --><!-- TMPL_VAR name="value" --><!-- TMPL_UNLESS NAME="__last__" -->+<!-- /TMPL_UNLESS --><!-- /TMPL_LOOP --><!-- /TMPL_IF -->"><!-- TMPL_LOOP name="term" --> <!-- TMPL_VAR name="value" --> <!-- /TMPL_LOOP --></li>
+                        <!-- /TMPL_LOOP -->
+                    </ul>
+                        <a href="#" onclick="hideMenu('.authorSearch');">Cancel</a>&nbsp;|&nbsp;<a id="validAuthorSearch"href="#">Search</a>
+                </div>
+                <!-- TMPL_LOOP NAME="bouncemarcauthorsarray" -->
+                    <a href="<!-- TMPL_IF name="authoritylink" -->/cgi-bin/koha/opac-authoritiesdetail.pl?authid=<!-- TMPL_VAR name="authoritylink" --><!-- TMPL_ELSE --><!-- /TMPL_IF -->" >
+                        <img height="15" src="/opac-tmpl/prog/images/filefind.png">
+                    </a>
+                    <a href="#" onclick="showAuthors(this, '<!-- TMPL_IF name="searchbyauthority" --><!-- TMPL_IF name="authoritylink" -->an:<!-- TMPL_VAR name="authoritylink" --><!-- TMPL_ELSE -->au,wrdl:<!-- TMPL_LOOP name="term" --><!-- TMPL_VAR name="value" --><!-- TMPL_UNLESS NAME="__last__" -->+<!-- /TMPL_UNLESS --><!-- /TMPL_LOOP --><!-- /TMPL_IF --><!-- TMPL_ELSE -->au,wrdl:<!-- TMPL_LOOP name="term" --><!-- TMPL_VAR name="value" --><!-- TMPL_UNLESS NAME="__last__" -->+<!-- /TMPL_UNLESS --><!-- /TMPL_LOOP --><!-- /TMPL_IF -->')"><!-- TMPL_LOOP name="term" --><!-- TMPL_VAR name="value" --> <!-- /TMPL_LOOP --></a>&nbsp;|&nbsp;
                 <!-- /TMPL_LOOP -->
+    <!-- /TMPL_UNLESS -->
+    <!-- /TMPL_LOOP -->
     </span>
     <!-- /TMPL_IF -->
 
@@ -164,12 +294,30 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
     <!-- /TMPL_IF -->
 
     <!-- TMPL_IF NAME="MARCSUBJCTS" -->
-            <span class="results_summary"><span class="label">Subject(s):</span> 
+            <span class="results_summary"><span class="label">Subject(s):</span>
+                <div class="subjectSearch" >
+                    <span><b>Select the item(s) to search :</b></span>
+                    <ul id="subjectsList">
+                        <li><input id="all" type="checkbox" onchange="checkAll('#subjectsList')"> <b>all</b></li>
+                        <!-- TMPL_LOOP NAME="MARCSUBJCTS" -->
+                            <!-- TMPL_LOOP NAME="MARCSUBJECT_SUBFIELDS_LOOP" -->
+                                <li><input type="checkbox" onclick="makeSubjectRequest()" name="checkbox" id="checkbox" code="<!-- TMPL_VAR name="value" -->" value="<!-- TMPL_IF name="searchbyauthority" -->an:<!-- TMPL_LOOP name="link_loop" --><!-- TMPL_VAR name="link" --><!-- /TMPL_LOOP --><!-- TMPL_ELSE -->su,wrdl:<!-- TMPL_VAR name="value" --><!-- /TMPL_IF -->"> <!-- TMPL_VAR name="value" --></li>
+                            <!-- /TMPL_LOOP -->
+                                <li><hr id="trait"></li>
+                        <!-- /TMPL_LOOP -->
+                    </ul>
+                    <a href="#" onclick="hideMenu('.subjectSearch')">Cancel</a>&nbsp;|&nbsp;<a id="validSubjectSearch"href="#">Search</a>
+                </div>
                 <!-- TMPL_LOOP NAME="MARCSUBJCTS" -->
                     <!-- TMPL_LOOP NAME="MARCSUBJECT_SUBFIELDS_LOOP" -->
-                        <!-- TMPL_VAR NAME="separator" --><a title="$<!-- TMPL_VAR NAME="code" --> <!-- TMPL_VAR NAME="value" -->" href="/cgi-bin/koha/opac-search.pl?q=<!-- TMPL_LOOP NAME="link_loop" --><!-- TMPL_VAR NAME="operator" ESCAPE="URL" --><!-- TMPL_VAR NAME="limit" ESCAPE="URL" -->:<!-- TMPL_VAR NAME="link" ESCAPE="URL" --><!-- /TMPL_LOOP -->"><!-- TMPL_VAR NAME="value" --></a><!-- /TMPL_LOOP -->
-        <!-- TMPL_IF NAME="__LAST__" --><!-- TMPL_ELSE -->|<!-- /TMPL_IF -->
-                <!-- /TMPL_LOOP --></span>
+                        <!-- TMPL_VAR NAME="separator" -->
+                        <span id="magnifier">
+                            <a href="/cgi-bin/koha/opac-authoritiesdetail.pl?authid=<!-- TMPL_LOOP NAME="link_loop" --><!-- TMPL_VAR NAME="link" ESCAPE="URL" --><!-- /TMPL_LOOP -->"><img height="15" src="/opac-tmpl/prog/images/filefind.png"></a>                           
+                        </span>
+                        <a href="#" onclick="showSubjects(this, '<!-- TMPL_IF name="searchbyauthority" -->an:<!-- TMPL_LOOP name="link_loop" --><!-- TMPL_VAR name="link" --><!-- /TMPL_LOOP --><!-- TMPL_ELSE -->su,wrdl:<!-- TMPL_VAR name="value" --><!-- /TMPL_IF -->', '<!-- TMPL_VAR name="value" -->')"><!-- TMPL_VAR NAME="value" --></a><!-- /TMPL_LOOP -->
+                        <!-- TMPL_IF NAME="__LAST__" --><!-- TMPL_ELSE -->|<!-- /TMPL_IF -->
+                <!-- /TMPL_LOOP -->
+            </span>
     <!-- TMPL_ELSE -->
     <!-- TMPL_IF name="subjects" --><span class="results_summary"><span class="label">Subject(s):</span> <!-- TMPL_LOOP name="subjects" --><a href="/cgi-bin/koha/opac-search.pl?q=su:<!-- TMPL_VAR NAME="subject" escape="URL" -->"><!-- TMPL_VAR NAME="subject" --></a> | <!-- /TMPL_LOOP --></span><!-- /TMPL_IF -->
     <!-- /TMPL_IF -->
@@ -393,6 +541,8 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
 		<th>Status</th>
 		<!-- TMPL_IF NAME="itemdata_itemnotes" --><th>Notes</th><!-- /TMPL_IF -->
 		<th>Date Due</th>
+		<!-- TMPL_IF NAME="itemdata_serialseq" --><th>Serial number</th><!-- /TMPL_IF -->
+		<!-- TMPL_IF NAME="itemdata_publisheddate" --><th>Publication date</th><!-- /TMPL_IF -->
 	    </tr></thead>
 	    <tbody><!-- TMPL_LOOP NAME="ITEM_RESULTS" -->
 	    <tr><!-- TMPL_IF NAME="item-level_itypes" --><td><!-- TMPL_UNLESS NAME="noItemTypeImages" --><!-- TMPL_IF NAME="imageurl" --><img src="<!-- TMPL_VAR NAME="imageurl" -->" title="<!-- TMPL_VAR NAME="description" -->" alt="<!-- TMPL_VAR NAME="description" -->" /><!-- /TMPL_IF --><!-- /TMPL_UNLESS --> <!-- TMPL_VAR NAME="description" --></td><!-- /TMPL_IF -->
@@ -405,6 +555,8 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
 		<td><!-- TMPL_INCLUDE NAME="item-status.inc" --></td>
 		<!-- TMPL_IF NAME="itemdata_itemnotes" --><td><!-- TMPL_VAR NAME="itemnotes" --></td><!-- /TMPL_IF -->
 		<td><!-- TMPL_VAR NAME="datedue" --></td>
+		<!-- TMPL_IF NAME="itemdata_serialseq" --><td><!-- TMPL_VAR Name="serialseq"--></td><!-- /TMPL_IF -->
+		<!-- TMPL_IF NAME="itemdata_publisheddate" --><td><!-- TMPL_VAR Name="publisheddate"--></td><!-- /TMPL_IF -->
 		<!-- TMPL_IF NAME="type" -->
 		<td><a href="/cgi-bin/koha/maint/catmaintain.pl?type=fixitemtype&amp;bi=<!-- TMPL_VAR NAME="biblioitemnumber" -->&amp;item=<!-- TMPL_VAR NAME="itemtype" -->">Fix Itemtype</a></td>
 		<!-- /TMPL_IF -->
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index cf5edf7..0b0d629 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -62,6 +62,7 @@ my $biblionumber = $query->param('biblionumber') || $query->param('bib');
 
 $template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') );
 $template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) );
+$template->param(C4::Search::enabled_opac_search_views);
 
 my $record       = GetMarcBiblio($biblionumber);
 if ( ! $record ) {
@@ -166,8 +167,8 @@ for my $itm (@items) {
         $itm->{'imageurl'}    = getitemtypeimagelocation( 'opac', $itemtypes->{ $itm->{itype} }->{'imageurl'} );
         $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{'description'};
     }
-    foreach (qw(ccode enumchron copynumber itemnotes uri)) {
-        $itemfields{$_} = 1 if ($itm->{$_});
+    foreach (qw(ccode enumchron copynumber itemnotes uri serialseq publisheddate)) {
+        $itemfields{$_} = 1 if ( $itm->{$_} );
     }
 
      # walk through the item-level authorised values and populate some images
@@ -190,7 +191,8 @@ for my $itm (@items) {
         $itm->{transfertwhen} = format_date($transfertwhen);
         $itm->{transfertfrom} = $branches->{$transfertfrom}{branchname};
         $itm->{transfertto}   = $branches->{$transfertto}{branchname};
-     }
+    }
+    $itm->{publisheddate}=format_date($itm->{publisheddate});
 }
 
 ## get notes and subjects from MARC record
@@ -203,22 +205,57 @@ my $marcseriesarray  = GetMarcSeries  ($record,$marcflavour);
 my $marcurlsarray    = GetMarcUrls    ($record,$marcflavour);
 my $subtitle         = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber));
 
-    $template->param(
-                     MARCNOTES               => $marcnotesarray,
-                     MARCSUBJCTS             => $marcsubjctsarray,
-                     MARCAUTHORS             => $marcauthorsarray,
-                     MARCSERIES              => $marcseriesarray,
-                     MARCURLS                => $marcurlsarray,
-                     norequests              => $norequests,
-                     RequestOnOpac           => C4::Context->preference("RequestOnOpac"),
-                     itemdata_ccode          => $itemfields{ccode},
-                     itemdata_enumchron      => $itemfields{enumchron},
-                     itemdata_uri            => $itemfields{uri},
-                     itemdata_copynumber     => $itemfields{copynumber},
-                     itemdata_itemnotes          => $itemfields{itemnotes},
-                     authorised_value_images => $biblio_authorised_value_images,
-                     subtitle                => $subtitle,
+#search rebound parameter
+my $searchByauthority = 0;
+if ( C4::Context->preference("OPACSearchReboundBy") eq "authority" ) {
+    $searchByauthority = 1;
+}
+
+#search rebound on author
+my @reboundmarcauthorsarray;
+foreach my $author (@$marcauthorsarray) {
+    my ( $a, $b, $authoritylink, @term );
+    foreach my $subfield ( @{ $author->{'MARCAUTHOR_SUBFIELDS_LOOP'} } ) {
+        if ( $subfield->{'code'} eq "a" && @{ $subfield->{'link_loop'} }[0]->{"limit"} eq "an" ) {
+            $authoritylink = @{ $subfield->{'link_loop'} }[0]->{"link"};
+        }
+        unless ( $subfield->{'code'} eq "3" || $subfield->{'code'} eq "4" ) { push( @term, { value => $subfield->{'value'} } ); }
+    }
+    push(
+        @reboundmarcauthorsarray,
+        {   term              => \@term,
+            authoritylink     => $authoritylink,
+            searchbyauthority => $searchByauthority,
+        }
     );
+}
+
+#search rebound on subject
+foreach my $subject (@$marcsubjctsarray) {
+    foreach my $subfield ( @{ $subject->{'MARCSUBJECT_SUBFIELDS_LOOP'} } ) {
+        $subfield->{'searchbyauthority'} = $searchByauthority;
+    }
+}
+
+$template->param(
+    MARCNOTES               => $marcnotesarray,
+    MARCSUBJCTS             => $marcsubjctsarray,
+    MARCAUTHORS             => $marcauthorsarray,
+    MARCSERIES              => $marcseriesarray,
+    MARCURLS                => $marcurlsarray,
+    norequests              => $norequests,
+    RequestOnOpac           => C4::Context->preference("RequestOnOpac"),
+    itemdata_serialseq      => $itemfields{serialseq},
+    itemdata_publisheddate  => $itemfields{publisheddate},
+    itemdata_ccode          => $itemfields{ccode},
+    itemdata_enumchron      => $itemfields{enumchron},
+    itemdata_uri            => $itemfields{uri},
+    itemdata_copynumber     => $itemfields{copynumber},
+    itemdata_itemnotes      => $itemfields{itemnotes},
+    authorised_value_images => $biblio_authorised_value_images,
+    subtitle                => $subtitle,
+    bouncemarcauthorsarray  => \@reboundmarcauthorsarray,
+);
 
 foreach ( keys %{$dat} ) {
     $template->param( "$_" => defined $dat->{$_} ? $dat->{$_} : '' );
-- 
1.7.1



More information about the Koha-patches mailing list