From 1a68acf2c9a37ae628a2ce71e42733533aa78568 Mon Sep 17 00:00:00 2001
From: Jonathan Druart <jonathan.druart@biblibre.com>
Date: Wed, 31 Oct 2012 11:10:44 +0100
Subject: [PATCH] Bug 8992: Interfacing with the Idref webservice
On the detail page (in the opac), if the biblio comes from the Sudoc,
you must have a link (on the right of the author link) which open a popup with
informations about this author (publications by role).
To test:
1/ Switch on the Idref system preference
2/ Simulate a SUDOC record:
Fill a 7..$3 field with a ppn (032581270 for example).
Fill the 009 field with an integer
3/ Go to the opac detail page of this notice.
You should see the IDREF link.
If you click on it, a popup displays a loading icon and after a few
seconds (depending of the productivity of the authority :)), a list of
roles. For each role, a table displays all his corresponding publications.
4/ On the right, you have 2 links: 1 for a koha search for this result
and 1 for a SUDOC link
---
C4/Biblio.pm | 6 ++
etc/zebradb/marc_defs/unimarc/biblios/record.abs | 7 ++
installer/data/mysql/updatedatabase.pl | 16 ++++
.../en/modules/admin/preferences/web_services.pref | 7 ++
koha-tmpl/opac-tmpl/prog/en/css/datatables.css | 42 ++++-----
koha-tmpl/opac-tmpl/prog/en/css/opac.css | 41 +++++++++
koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc | 7 ++
koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt | 10 ++-
koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt | 66 ++++++++++++++
koha-tmpl/opac-tmpl/prog/images/first-disabled.png | Bin 0 -> 843 bytes
koha-tmpl/opac-tmpl/prog/images/first.png | Bin 0 -> 720 bytes
koha-tmpl/opac-tmpl/prog/images/last-disabled.png | Bin 0 -> 826 bytes
koha-tmpl/opac-tmpl/prog/images/last.png | Bin 0 -> 737 bytes
koha-tmpl/opac-tmpl/prog/images/next-disabled.png | Bin 0 -> 866 bytes
koha-tmpl/opac-tmpl/prog/images/next.png | Bin 0 -> 736 bytes
koha-tmpl/opac-tmpl/prog/images/prev-disabled.png | Bin 0 -> 862 bytes
koha-tmpl/opac-tmpl/prog/images/prev.png | Bin 0 -> 745 bytes
opac/opac-detail.pl | 13 +++
opac/opac-idref.pl | 91 ++++++++++++++++++++
19 files changed, 284 insertions(+), 22 deletions(-)
create mode 100644 koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
create mode 100644 koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
create mode 100644 koha-tmpl/opac-tmpl/prog/images/first-disabled.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/first.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/last-disabled.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/last.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/next-disabled.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/next.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev-disabled.png
create mode 100644 koha-tmpl/opac-tmpl/prog/images/prev.png
create mode 100755 opac/opac-idref.pl
diff --git a/C4/Biblio.pm b/C4/Biblio.pm
index afb60d3..6a8d68c 100644
--- a/C4/Biblio.pm
+++ b/C4/Biblio.pm
@@ -1834,9 +1834,14 @@ sub GetMarcAuthors {
}
# other subfields
+ my $unimarc3;
for my $authors_subfield (@subfields) {
next if ( $authors_subfield->[0] eq '9' );
+ # unimarc3 contains the $3 of the author for UNIMARC.
+ # For french academic libraries, it's the "ppn", and it's required for idref webservice
+ $unimarc3 = $authors_subfield->[1] if $marcflavour eq 'UNIMARC' and $authors_subfield->[0] =~ /3/;
+
# don't load unimarc subfields 3, 5
next if ( $marcflavour eq 'UNIMARC' and ( $authors_subfield->[0] =~ /3|5/ ) );
@@ -1872,6 +1877,7 @@ sub GetMarcAuthors {
push @marcauthors, {
MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop,
authoritylink => $subfield9,
+ unimarc3 => $unimarc3
};
}
return \@marcauthors;
diff --git a/etc/zebradb/marc_defs/unimarc/biblios/record.abs b/etc/zebradb/marc_defs/unimarc/biblios/record.abs
index dcbc7a1..7110845 100644
--- a/etc/zebradb/marc_defs/unimarc/biblios/record.abs
+++ b/etc/zebradb/marc_defs/unimarc/biblios/record.abs
@@ -101,14 +101,21 @@ melm 701 Author,Personal-name,Author:p,Personal-name:p,Personal-name:p
melm 702$9 Koha-Auth-Number,Koha-Auth-Number:n
melm 702 Author,Personal-name,Author:p,Personal-name:p,Personal-name:p
+melm 700$3 Identified-standard
+melm 701$3 Identified-standard
+melm 702$3 Identified-standard
+
# collective Author
melm 710$9 Koha-Auth-Number,Koha-Auth-Number:n
melm 710 Author,Author-name-corporate,Author-name-conference,Corporate-name,Conference-name,Author:p,Author-name-corporate:p,Author-name-conference:p,Corporate-name:p,Conference-name:p
+melm 710$3 Identified-standard
melm 711$9 Koha-Auth-Number,Koha-Auth-Number:n
melm 711 Author,Author-name-corporate,Author-name-conference,Corporate-name,Conference-name,Author:p,Author-name-corporate:p,Author-name-conference:p,Corporate-name:p,Conference-name:p
+melm 711$3 Identified-standard
melm 712$9 Koha-Auth-Number,Koha-Auth-Number:n
melm 712 Author,Author-name-corporate,Author-name-conference,Corporate-name,Conference-name,Author:p,Author-name-corporate:p,Author-name-conference:p,Corporate-name:p,Conference-name:p
+melm 712$3 Identified-standard
############## TITLE ##################
# main Title
diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl
index 7ab48ee..8e9509b 100755
--- a/installer/data/mysql/updatedatabase.pl
+++ b/installer/data/mysql/updatedatabase.pl
@@ -6020,6 +6020,22 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) {
SetVersion ($DBversion);
}
+
+
+
+$DBversion = "3.09.00.XXX";
+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) {
+ $dbh->do(qq{
+ INSERT INTO systempreferences (variable,value,explanation,options,type)
+ VALUES('IDREF','0','Disable/enable the IDREF webservice from the OPAC detail page.',NULL,'YesNo')
+ });
+ print "Upgrade to $DBversion done (Add system preference IDREF))\n";
+ SetVersion($DBversion);
+}
+
+
+
+
=head1 FUNCTIONS
=head2 TableExists($table)
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
index 7244675..a3ad67f 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref
@@ -44,3 +44,10 @@ Web services:
- pref: SvcMaxReportRows
class: integer
- rows of a report requested via the reports web service.
+ IDREF:
+ -
+ - pref: IDREF
+ choices:
+ yes: Enable
+ no: Disable
+ - the IDREF webservice from the opac detail page
diff --git a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
index e7b11bd..2a80b5a 100644
--- a/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
+++ b/koha-tmpl/opac-tmpl/prog/en/css/datatables.css
@@ -3,23 +3,23 @@ input.search_init {
}
.sorting_asc {
padding-right: 19px;
- background: url("../../img/asc.gif") no-repeat scroll right center #EEEEEE;
+ background: url("../../images/asc.gif") no-repeat scroll right center #EEEEEE;
}
.sorting_desc {
padding-right: 19px;
- background: url("../../img/desc.gif") no-repeat scroll right center #EEEEEE;
+ background: url("../../images/desc.gif") no-repeat scroll right center #EEEEEE;
}
.sorting {
padding-right: 19px;
- background: url("../../img/ascdesc.gif") no-repeat scroll right center #EEEEEE;
+ background: url("../../images/ascdesc.gif") no-repeat scroll right center #EEEEEE;
}
.sorting_asc_disabled {
padding-right: 19px;
- background: url("../../img/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
+ background: url("../../images/datatables/sort_asc_disabled.png") no-repeat scroll right center #EEEEEE;
}
.sorting_desc_disabled {
padding-right: 19px;
- background: url("../../img/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
+ background: url("../../images/datatables/sort_desc_disabled.png") no-repeat scroll right center #EEEEEE;
}
.sorting_disabled {
padding-right: 19px;
@@ -83,25 +83,25 @@ div.dataTables_paginate {
color : #0000CC;
}
.paging_full_numbers span.paginate_button.first {
- background-image : url('../../img/first.png');
+ background-image : url('../../images/first.png');
background-repeat: no-repeat;
background-position : 2px center;
padding-left : 2em;
}
.paging_full_numbers span.paginate_button.previous {
- background-image : url('../../img/prev.png');
+ background-image : url('../../images/prev.png');
background-repeat: no-repeat;
background-position : 2px center;
padding-left : 2em;
}
.paging_full_numbers span.paginate_button.next {
- background-image : url('../../img/next.png');
+ background-image : url('../../images/next.png');
background-repeat: no-repeat;
background-position : right center;
padding-right : 2em;
}
.paging_full_numbers span.paginate_button.last {
- background-image : url('../../img/last.png');
+ background-image : url('../../images/last.png');
background-repeat: no-repeat;
background-position : right center;
border-right : 1px solid #686868;
@@ -147,31 +147,31 @@ div.dataTables_paginate.paging_four_button {
width: 16px;
}
.paginate_disabled_first {
- background-image: url("../../img/first-disabled.png");
+ background-image: url("../../images/first-disabled.png");
}
.paginate_enabled_first {
- background-image: url("../../img/first.png");
+ background-image: url("../../images/first.png");
cursor: pointer;
}
.paginate_disabled_previous {
- background-image: url("../../img/prev-disabled.png");
+ background-image: url("../../images/prev-disabled.png");
}
.paginate_enabled_previous {
- background-image: url("../../img/prev.png");
+ background-image: url("../../images/prev.png");
cursor: pointer;
}
.paginate_disabled_next {
- background-image: url("../../img/next-disabled.png");
+ background-image: url("../../images/next-disabled.png");
}
.paginate_enabled_next {
- background-image: url("../../img/next.png");
+ background-image: url("../../images/next.png");
cursor: pointer;
}
.paginate_disabled_last {
- background-image: url("../../img/last-disabled.png");
+ background-image: url("../../images/last-disabled.png");
}
.paginate_enabled_last {
- background-image: url("../../img/last.png");
+ background-image: url("../../images/last.png");
cursor: pointer;
}
@@ -248,16 +248,16 @@ table.display thead th {
width: 19px;
}
.paginate_disabled_previous {
- background-image: url("../../img/datatables/back_disabled.jpg");
+ background-image: url("../../images/datatables/back_disabled.jpg");
}
.paginate_enabled_previous {
- background-image: url("../../img/datatables/back_enabled.jpg");
+ background-image: url("../../images/datatables/back_enabled.jpg");
}
.paginate_disabled_next {
- background-image: url("../../img/datatables/forward_disabled.jpg");
+ background-image: url("../../images/datatables/forward_disabled.jpg");
}
.paginate_enabled_next {
- background-image: url("../../img/datatables/forward_enabled.jpg");
+ background-image: url("../../images/datatables/forward_enabled.jpg");
}
.spacer {
clear: both;
diff --git a/koha-tmpl/opac-tmpl/prog/en/css/opac.css b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
index 7ab95e0..5fdcc07 100644
--- a/koha-tmpl/opac-tmpl/prog/en/css/opac.css
+++ b/koha-tmpl/opac-tmpl/prog/en/css/opac.css
@@ -2820,3 +2820,44 @@ body#opac-main #opacmainuserblockmobile {
.tagweight9 {
font-size: 30px;
}
+
+div.pager {
+ background-color : #E8E8E8;
+ border : 1px solid #BCBCBC;
+ -moz-border-radius : 5px;
+ display : inline-block;
+ font-size : 85%;
+ padding : .3em .5em .3em .5em;
+ margin : .4em 0;
+}
+div.pager img {
+ vertical-align : middle;
+}
+div.pager img.last {
+ padding-right: 5px;
+}
+div.pager input.pagedisplay {
+ border : 0;
+ background-color : transparent;
+ font-weight: bold;
+ text-align : center;
+}
+a.localimage img {
+ border : 1px solid #0000CC;
+ margin : 0 .5em;
+ padding : .3em;
+}
+div.pager p {
+ margin: 0;
+}
+
+
+/* IDREF */
+#idref h2.role {
+ background-color: #DDDEEE;
+ cursor: pointer;
+}
+
+#idref table {
+ margin: 0;
+}
diff --git a/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc b/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
new file mode 100644
index 0000000..b955b44
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc
@@ -0,0 +1,7 @@
+<script type="text/javascript">
+ var GB_ROOT_DIR = "[% themelang %]/lib/greybox/";
+</script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/AJS.js"></script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/AJS_fx.js"></script>
+<script type="text/javascript" src="[% themelang %]/lib/greybox/gb_scripts.js"></script>
+<link href="[% themelang %]/lib/greybox/gb_styles.css" rel="stylesheet" type="text/css" />
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
index 1d0523a..c942b2b 100644
--- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt
@@ -11,6 +11,7 @@
[% END %]
[% IF ( OpacStarRatings != 'disable' ) %]<script type="text/javascript" src="/opac-tmpl/prog/en/lib/jquery/plugins/jquery.rating.js"></script>
<link rel="stylesheet" type="text/css" href="/opac-tmpl/prog/en/css/jquery.rating.css" />[% END %]
+[% INCLUDE greybox.inc %]
[% IF ( OpacHighlightedWords ) %]<script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.highlight-3.js"></script>[% END %]
<script type="text/JavaScript" language="JavaScript">
@@ -345,7 +346,11 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
[% XSLTBloc %]
[% ELSE %]
<h1 class="title">[% title |html %][% IF ( subtitle ) %] <span class="subtitle">[% FOREACH subtitl IN subtitle %][% subtitl.subfield |html %] [% END %]</span>[% END %]</h1>
- [% IF ( author ) %]<h5 class="author">by <a href="/cgi-bin/koha/opac-search.pl?q=au:[% author |url %]">[% author |html %]</a></h5>[% END %]
+ [% IF ( author ) %]
+ <h5 class="author">
+ by <a href="/cgi-bin/koha/opac-search.pl?q=au:[% author |url %]">[% author |html %]</a>
+ </h5>
+ [% END %]
<span class="results_summary">[% UNLESS ( item_level_itypes ) %]
[
@@ -369,6 +374,9 @@ YAHOO.util.Event.onContentReady("furtherm", function () {
[% IF (MARCAUTHOR.authoritylink) %]
<a class='authlink' href="/cgi-bin/koha/opac-authoritiesdetail.pl?authid=[% MARCAUTHOR.authoritylink %]"><img style="vertical-align:middle" height="15" width="15" src="/opac-tmpl/prog/images/filefind.png"></a>
[% END %]
+ [% IF ( IDREF and MARCAUTHOR.unimarc3) %]
+ <a href="/cgi-bin/koha/opac-idref.pl?unimarc3=[% MARCAUTHOR.unimarc3 %]" title="IDREF" rel="gb_page_center[600,500]">IDREF</a>
+ [% END %]
[% UNLESS ( loop.last ) %]|[% END %]
[% END %]
</span>
diff --git a/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt b/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
new file mode 100644
index 0000000..6adbbc5
--- /dev/null
+++ b/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt
@@ -0,0 +1,66 @@
+[% INCLUDE 'doc-head-open.inc' %]
+[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog › Your search IDREF for ppn [% unimarc3 %]
+[% INCLUDE 'doc-head-close.inc' %]
+ <link rel="stylesheet" href="[% themelang %]/css/datatables.css" />
+ <script type="text/javascript" src="[% themelang %]/lib/jquery/plugins/jquery.dataTables.min.js"></script>
+ [% INCLUDE 'datatables-strings.inc' %]
+ <script type="text/javascript" src="[% themelang %]/js/datatables.js"></script>
+ <script type="text/javascript">
+ $(document).ready(function (){
+ $("table").dataTable($.extend(true, {}, dataTablesDefaults, {
+ "oLanguage": {
+ "sSearch": _("Search all columns:")
+ },
+ 'bFilter': false,
+ 'sPaginationType': 'four_button',
+ 'aoColumnDefs': [
+ { 'aTargets': [-1, -2], 'bSortable': false }
+ ],
+ 'aLengthMenu': [[10, 25, 50, 100, 250, 500, 1000, -1], [10, 25, 50, 100, 250, 500, 1000, _("All")]],
+ }));
+
+ $(".role").click(function(){
+ var docs_node = $(this).parent().find("div.docs");
+ if ( $(docs_node).is(":visible") ) {
+ $(".docs").hide();
+ } else {
+ $(".docs").hide();
+ docs_node.show();
+ }
+ });
+ $(".docs").hide();
+ });
+ </script>
+</head>
+<body>
+<div id="idref">
+ [% IF error %]
+ This ppn is not found on the idref service.
+ [% ELSE %]
+ [% FOREACH role IN content %]
+ <div>
+ <h2 class="role" title="Click to expand this role">[% role.role_name %] ([% role.count %])</h2>
+ <div class="docs">
+ <table>
+ <thead>
+ <th>Citation</th>
+ <th>Koha</th>
+ <th>Sudoc</th>
+ </thead>
+ <tbody>
+ [% FOREACH doc IN role.docs %]
+ <tr>
+ <td>[% doc.citation %]</td>
+ <td><a href="/cgi-bin/koha/opac-search.pl?q=kw,phr=[% doc.ppn %]" target="_blank">Koha</a></td>
+ <td><a href="http://www.sudoc.fr/[% doc.ppn %]" target="_blank">Sudoc</a></td>
+ </tr>
+ [% END %]
+ </tbody>
+ </table>
+ </div>
+ </div>
+ [% END %]
+ [% END %]
+</div>
+[% INCLUDE 'opac-bottom.inc' %]
+
diff --git a/koha-tmpl/opac-tmpl/prog/images/first-disabled.png b/koha-tmpl/opac-tmpl/prog/images/first-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..fdf2106cf24f9e6536907061ea9be1945552c635
GIT binary patch
literal 843
zcmV-R1GM~!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!-AP12RCwBA
z{Qv(y12ULAd9oBEBcn7>Tog$2L*+jL@oOM{nwy*Z3|T!u05QT00BYm`YS0i96El~T
zl+@zo<uzbqW77c1fB*jd#-~r8F1&pC^4gm>Z%zW0-vAo)1*8ukfWQWTGy~a&y1Ke9
z;^N{FKtt5HxVRWNI5-$U@;`q3VEFv`GsBZ7Pj0<>^=iePJ9qW~Ejyo+lk){2fLOq$
z0BzRM(Q%QGkSJ18QsM#H%<${iFNUvQzk&?_@qq?2@bU4f{r&s52#6UTJb3UOsPzm$
z05J;-3rhhdU4R;sfmo8Aot@#`yLSw~fB$Cq_wOGVgV^WJonrvXGYAO@u>oBn3G~*}
zBS(%r1qdJ}pefQoo3%tmMb$u>K~9}CX%fSdB}?D|b?w?UhBIf*FuZ>Knt_v(lR-g2
zK@CW20bM5z5I`UUM0t3447j<u!G1*sAm@WL@7lEsF81x)HwFO#0g#*l(CeZA0mK4|
zDppoj4Up|$zI*{|g5je_k20J-eHyMA<Q-7B0KEZ{*8mFf0|XEgaykI9fd;}20I`t)
z$N*TZfWigD1_&S~prVgJfg2#FfkGRm2&CD}%#5L=qy)tRQ1pTV85m19KzacJ2;_p-
zA3uJ)08A+000Joz5fOpM0LaNOLqL3xnx{{nf(*C-N}T`!1PX(v&!0cP2DJSaFfi4C
zam^4PAI|_yfnXYBI7kc>c)-NOaPi{BTR_9Efs!^r05Nadw(awwLx=t|Gc*4NMw2lx
zU9brX3c_8$#Kgn^Ox6sbSOVF+W5<p!Krhb*YTgG-&Nl%92$m9W0A0ZevT@IzJrU~a
z>S~~r$Is8t07`Yh^w03<(Ic?UfByVg!NS6_2b3Q`dI16mB{Kmj4WL)dfwUG-qXCEy
z)BtkH4IsV%)OZc(B5-B`<pYpDfB<5|mYqSV6O>4Ra{SO}{RpJN*%_!2B|8HI7y#v+
VkuA4ftNj1~002ovPDHLkV1ks|VH^Me
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/first.png b/koha-tmpl/opac-tmpl/prog/images/first.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f11fcb086b1bfa51bc5070ca45fac0a988c624c
GIT binary patch
literal 720
zcmV;>0x$iEP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!Vo5|nR5;6}
zlS^+BQ547f0sI7f4p_Q$!@|Vwx--6F!p6i!Q&	anYDUW`HQBO=|;{NKLAi)JR+D
z2+}kbI#7m(KwIcg7;qRE7@!>ITpohD^Ctgf=H~o==W*|y0)VM;-LQd9lR=YF)677|
z!Jh8V_;KSkP5LJrlF9S+j0qkk+2iPm7~x{#{$ZSbvzK9J-4zqYVC)27V7~717pTZd
znit9v$VwYJS3ROyLxp^?0)a!0U)oMn7(0Xv0eUoZ@gH)t)d5_J+J%bT22oSJ)g^nf
zqQZVCEIYOm2+<P&_Jw6*=Ak)XX+fdd0->rB;rB+cID%~N1o%g50=A<=fWgC_GFUb)
z%s4&22M=t~3G+RMgR^pz#KbcfK)ZtsdJ$j@d{400GnQJeAz+sPu#&f$`6hKh0J%~V
zq(%oWs|qZyzh}{lfSK@dRK#JSxg@DDP3^*cD+kP0j(npKkSQvp3bk_uYtD5My##O+
z;RpcDs9R5c#9;NFP5{z^GN_^r%PX%(0OOZ~7+aNFP*XZk{E2|i#E`vI`YjCrsfz|V
zndEsDXoqvug2CxaF}ZvhdOaY6!{9q~KO+jO!o5Vk0qt%NcD}`cvVR;6QTNzYGWq-=
zUX+?7V0e7VLW2m6_>T!vT6W8eRsOC$*+0hNMWWwDsLfA)S*X-WV71;M{bCz<v<Oa~
zSHSFW$#eA9?~62kl^2{LYSq2T2g51I2@;tJ_8iNK;PppffnMTgEg$~A%Hxme;j64^
z{-u|BZd+k#t6f~QFyb?_gPk*bnA=SJ-;e2kp7SrPKM4}2E#B7v0000<MNUMnLSTZm
Co<+<6
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/last-disabled.png b/koha-tmpl/opac-tmpl/prog/images/last-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3815b5f55add82f1db9114a095d1bd776742650
GIT binary patch
literal 826
zcmV-A1I7G_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!%t=H+RCwBA
z{Qv(y12UL0Wr`F~Oq!9AQ54AK2Z;gsAA!_sAby&goBIq|JwO04!VCav<N>lZ#KpzU
zrKF^^czAdW*x1-KK=R+ef4}kh^XCgMUc9*W_U+q~K(QM@gT8?D0R#}(fXS05^8nd~
zy1Ke9Km#Jg#KhFNxVRWNI5<GIGyM4Rg8^s&!{f(~Z@qr~dc~bPclH3)p9dKN5I`(Y
zmuP@AOG-)>DJm-R0BvUY_3IbImoH#T7(jfW!3=zSd}^02T>`0Lc<|uCcc9c6fB<3^
z78aHQO1da1DJ283BuMeelP4MY`T4=N|NHk3Y}mJN-#`X10M)a-di6>Y=&GkjjvRRk
z5I{`8z>=1bkkA4-8>IQ;$Bzs<ckX1ke*HQFEPN(Sn#8bd*)p&<I5{~P<mKhn*xA{&
zK!FVqKrBE)6ck_}KmYvs6Ko?$BghaCTSG$wC6+)g5fl^zF%5uN6d-_DfG*%?Wo6X>
znh5tZ%;p0J4lulX_YQ6-hz40AARqwZgG}ZJ2p}e84ajU}W@d)pzkf3@F)@L~VB#Pe
z6eb`!5C8}uCQu>)2FMMN(||4k+rq-a0#;B|RK#FnVuE5gC=5WZ0=nb|(Dfey0tgg{
zuYmz~0Tg&3Ntg{KB_&}0f(#TD6@|M36jo23JONp70hBrc0tl22p1yqf@)|G<Zt?Q+
zs(}<27Z<}dgEYm)#)4e{ipFQpo-tg!c<~lc?ixrhKmajs+qUiVp+krM1O56Nn97WS
zA<PB}WuVKz27qW#00UzRta-<d9bbT6o(<Hz510~f0t65X)NeO{lAIuod-m*!P*+!1
zgQh%&zkmNSym|8ml#IbP1Nkd}0lWuj@C}e&fB=GLCTM=p0464LpqLiWc2GQPfD8cQ
z8$huOKv!M^YDURS00G2EC_97XL7@!_Fd!QvI|Bq501}dz-y{)%cmMzZ07*qoM6N<$
Ef;ulvi2wiq
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/last.png b/koha-tmpl/opac-tmpl/prog/images/last.png
new file mode 100644
index 0000000000000000000000000000000000000000..72079357614b4254b163a5cac766093d1f99bbe7
GIT binary patch
literal 737
zcmV<70v`Q|P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!b4f%&R5;6}
zlS^+BQ547f0sI7f4p_Q$!%lo8-5FmoVPoQ=sVgVd*hOQ6%m7hLo7M&@3DuxNYNSOv
z1!)=!1<Di<Xo2z?5T*>za-4I45g$8m^55K?|L?r+odSTVNnJ96LXt|7TGI4L>d~Fz
z&-h8>1xd<>>vgSt=Y;X^$Jv9(As-4y`R%<J`^J-EW^7e0#$fDkfRXv4)tje6he@tb
zse>SPp?5wYYBW2LD^|g`7v>f>k`%^{A!C3N&EeR0q1EmI9<kGhs?Y^q(pkGt?gX&|
z+kv29b{-)_NdVXvmW`RmX2)&`ia$C~s122`wINq+%aDytA9sJXfbA#{pt7^a43>?j
zT<^fuCti3LD9UEdoCoe2BcvKUvD7KhHa~-21gL%Aj#%s&OGVR_$6iSuSoaqp%eN%J
z76DWmU8pyEP^yWrwDz7wF9N262N52Jg#ie_jHv7Leqfv#&`?`&#}Fpfom5)T>7B!>
zWsOHK0qlpu1b_k9E1Iu8-65F`u4B0T$PKrdAs|z3NmX=VY5BDbP=DEtvNfR%4Y5Zu
z5VMpOD@qkb3GkT!aIm<Uc(w+#*&?@~vbYmWCRc&M07wQ6<tFB2K_o)+O*%~4>-Gn*
z`85iZ>7zVE#RF?u>-GjXzTT2IfyTsX6XN-%yiPPHr0n_^E8Hzpe7MH(L!#e?D90zS
zP^g}fN@{04Qcb!flJ%iEo~?q;Y!zl{=dXt}`IHwd0cyqO;QYY^WD0dM6YM#f=E3C+
z!2-R=&FDY;{gfv^)4f+|?c7Tj^US!+(gqX%T+i_HIx{<~voklC*uOv1|9t14Z-oeY
T<X^Ql00000NkvXXu0mjfFR4u9
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/next-disabled.png b/koha-tmpl/opac-tmpl/prog/images/next-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..58b03409bfbe94b6eca9d45b3442245664d4b754
GIT binary patch
literal 866
zcmV-o1D*VdP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!^hrcPRCwBA
z{Qv(y12UL0Wr`F~Od7}(1!8_iMn(o8|09t78pwW{lauodSv^1iF~SU(Jb5w?kkXKl
zkT3^gEgl{o12#4`4UpXT@855H`t<3-%a<>&y?y)kBv8+d+}zwRAUS{l0viC*3^d(P
zM@Pp+TwFXtR8&-ro12?~gM)(sY5>ERFJBlQKYo1c)vH%4?%cVv2dMr$&^2EG0*D3b
z5)F`Mpv^@}N=iIHn;Cxn`o-||>sPQOD=RC5n3xy?FE6j!-@kv0fSBR_{rlg6QfB}H
zh*?-zSPE#X3s7USva+%yNb|F25O0DM{`>cj;p4}T48MQ>X5i!FV-OM&VgtHD66mU@
zhYufq3J^d{K&MDcN=j-0ZBPSg2Ktp@&YU@5C&R$(*|Wi}dGqEC11BdZgMxyB8qj-M
zAiV$q!~_fjQJ{YfKz{!D^C#F=P`J#UI~S}8<N^?wH*X%8|Lxm120=kVkdOgLFF*h>
zfuaf&+Ax2E0LTCkUbt`}!;c?7z-*8~ixw?n`0(Ka12Bd_Vj4gf@B;)8$O~{=Kr}2`
znVFfv1_A>PEDqy?G=peRn1Iv*1Q5szAAz>q067ih3YcP$g5u(0a1?@K;m@Bx3?(Hc
z3`|T+48XJiGUNu(o{s<l1oFabP$B^Z9w>l7rh+t=mX?D33*v)p1Q`YjSS~IuhNn-T
zg2XO>^a2DBv!|ygDBwhZSOpk3!oX-^FfuX%YX-RngdH6n!J1`cWWbt%(RT}|ehbim
zQvd<PylvaI&j$}4{10^6@7J$i8v_kt1BEguY(Oyr@(w#YJ2>P)=>w?#3((86f$H}G
zlk-i000O5(pyC@ZUcBH0h4`L5dm_};)zyHBi-Dh?A8ZKFU{Eq<xOnm6Enrxz0EWpP
zP<{aE1qdK`W&-9y9#GT(1JWEwYXO~Z07~MZzym1;8gv2ZnrlFel9>Pkh!I<M22#?X
sL;{LusQgDD`!$gL6sQp;I|Bq506C7S@8*npX8-^I07*qoM6N<$g03K4OaK4?
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/next.png b/koha-tmpl/opac-tmpl/prog/images/next.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a2f9d4e4a81857f509d85bbe46936c99709cd6f
GIT binary patch
literal 736
zcmV<60w4W}P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!a!Eu%R5;6}
zQ%i3WQ55bE@E7nqVCm8gyH;z`orxP0HYP5by0Me`=%O(~W-L)mo7M&@37XW}rlwS!
z4j`tnP@oJCf$}I61{?;4$54)QE)Vgs^CsWo-kk3{=R4=z2>_TF$F*h9sL-j<tC$%;
zKX}vp89z?EqC$KBt!Qw#GmQ5*#+`&tg+MSY93DluH?AZzYp)nE24jB{7?7{p*gO?D
zP4I=X2$I|Z<+4XmYqTL(tbpez$gk`rD2yG73<b1E4o1F9&6Waq<aQS-QU?ST^;Va>
zNpc$weSXQZ6Gag%5kOy9HfA1@<L3=1{%Av?+DA0kfLx_D64^WO@OL)~Xh(wrItO>g
zVA*&|VjFHeVhIV!`DzQM7F-a@NRTNvNlYYp4z%6NAQuJno^MeOJ!7dzy8e(=;etr6
z4q2h83Vb36o=G4!6u79$u)6u4LoN!;_)kItHmh9g5CP1HxVh+sSiS*Mlqx_uVfwL~
z+}p|}Y*;r1<Pw47K#&Mv`REnN(@)$aD~e9eJBh8y`F(O18y#3(dp#1+fBqWgs!|JT
zvO;_kGSw$1i}Hw!32-v8Y!zsWb!0(jb;g-=t_-~%K)Tc<<svyzkO?Lq?31ZrV>{g*
z9DE4_W&SW~qUN5hWN@-RUJ#q3Ngxr&iJp;+4aEd;HM{A>I)B?7>yL4`Nc6h^we^ve
z3YC6fwXTqAQWr8=Cd?emR={YnNptkhuSFVP<t3|+TDNcUUVj|Y1(EawJ%>{Q?6Lt^
zqF4A?)Arx1JpP&Pyh<4sUhXnam)AJ@xmkE-VuVGbg_|=vm|INb-=FD!zVlDxJ_uiv
SXLQ>D0000<MNUMnLSTa5n>yhD
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png b/koha-tmpl/opac-tmpl/prog/images/prev-disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..225c9a9ab8b4827ea16bde80eeb48b562e9564ad
GIT binary patch
literal 862
zcmV-k1EKthP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!@JU2LRCwBA
z{Qv(y12UL0Wr`F~Oq!9AQ54AKhsu8h@?QhlPjho~pCPLU2p~q70YHsBK(>a2goHT|
zYw_^#7_hOiX@KN^{P=O>^XJbOUc7j5?aiAvCxOau01f&A(gzSgU<06<4Rv*OUBt!3
zBSb|-)wsF288|pNz=nVS{+$760K=0fPj0<>^=if4yLa~h)t?6$0uVqfAO#?sL7IU!
z7bz(z@c?aR`2G7g!`H80!3MCfurL4(X5i!FQ~Ue(ZxIkP+`oVSJ5cHjKmaj|h=@o5
zC0&3TlYv;0ot>TG<HwH--@bhVYX&L)^XCs(Oi)meK}bl5?d8jtl0Sd`e0t=_k*5Fw
z!~_a3ke@-$25J8E=@Z!YIdkTKTn5HK#SHW3&u0MopMjH;lR-g2K@I3VEs$P-0Ad1#
zHZL!)0m#oFg}?v<g$V;t9Iko7gb8py$Ymgx0NDmW2Z{m&5ECe>SXo&$K(>PdYudDF
zV5k54_mAP%uU}xzFqeS512O<;AvoNChVlah5XcK)#ULA)n3x#2xVXRyL41&NK`sLY
zB1jE1z`+KCya{3h1Q5szAA!!i0Sa-TOBj-qlNo?%0BiurJDHi8U_QujkOolHzI*o$
z<h2{11O^a5ATPZB@ZrM+P$+|J1lg37lmxdG6a$HgiEuv1MZoj`a>WHu>I4WNW=~H~
zkdsA#rmF}D2nYkC37lvQ3=F^;VE)(B(_@g9mS%YR^eMyP!-sDH^=tu(p8^OV=55=y
zeLi&P(0`y4f4_eH+87kiz$k?WB*-hEKm!`i@a)+$hV9$8e*p&eY@qsmz?66sAb?n)
zdE&<N=g&Dov9Nph?g({tbv01R<LBoGdjV)L!{f(~87^MD2(ozv&^w@{3<?7VfB=GL
zrpc2h^8jtr07{wzxmrNmLGi2sG62ZF0aSMZXzMi~J_%HJBPS;ZoS6Uuh!IzI1|<?u
oJVT=noSlKpr$CJ;*%=_f02&gb@5#$_MF0Q*07*qoM6N<$f_qtQg8%>k
literal 0
HcmV?d00001
diff --git a/koha-tmpl/opac-tmpl/prog/images/prev.png b/koha-tmpl/opac-tmpl/prog/images/prev.png
new file mode 100644
index 0000000000000000000000000000000000000000..15d1584bdbb2c26a9fc4c8269aa54615a58a4657
GIT binary patch
literal 745
zcmV<F0v7#=P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00004XF*Lt006JZ
zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!dr3q=R5;6}
zlTB|DQ51&z1N;U24p_Q$L!$8`YEc&^ZcNyixM*4vBdIZs#aaksiDKHcHc&~>1hlor
z)=Ec^h7>5J3?Bj(D6|X+0|UcQj&m*_Qg!D|-c07sd7pF6opXl(U}#WhW<VxMAxSAo
z)s?clC;Kyg(0EFceC$nGZTq@UxqVT3XLpYc1VikmH%!0YNKhlzq8ei`_5`47K5cPk
zHG#c2lPi>g<C`EJw}~n>0W$d_xV%ATb~UcS*dC+@kfS*m{?64KBH-eM78JQAu#&2c
z7TM!?0X98;&a@msh@1ehFDx4~_smCS0rm@Z$dv@5Y^ec>Jl}_`uDh5!i#cpZh5&_)
z{y|~cgJzZ1d%`?CxkdJIg%by0u(~PqB0%Zdj?maMmYO=M!=;B#0>~5_5YO>&?w*4H
z@LRbi!eNPrxg`gUUIeK8JG(3%R{o~|7so$K+8_qZe0Iz($pKd%d&oOhA&AGYXkKE`
zO8~w=kN^smCS05H!-WT*2mpbXAJK6B{s*`+;U?8|s%XO8{Hs1d`DH6am$(L0coEX9
z)c+Ho)WS9-4?6~g4NrO@c2FaKCYmmR!DQ~YpfIn+s8pr^?KThtmU&}3Kr*7R^y^Rk
z5Xsb_*=oc3w-9KI@B4=+yK6a8uQ@#oTkf1PnlL+NjAm=Zh)+xqld|idFEF=^(avw|
z4U*w)Kx6;t<Z{I-2`p7bQVoJ|m@soRT?C!U!i^f1e-F~&C~M6g&4Sg=xcxCm<;vtt
zu;);cg%xK2w1!z`ME~yZQ69WZw_hgJ<1bdIshN4&@XW|g>nV0ZXQD@SHtHr7{`Y12
bpX>Y!%!CO%>C8GV00000NkvXXu0mjfJYGkQ
literal 0
HcmV?d00001
diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl
index d9ecdfa..1beabb1 100755
--- a/opac/opac-detail.pl
+++ b/opac/opac-detail.pl
@@ -950,6 +950,19 @@ if (my $search_for_title = C4::Context->preference('OPACSearchForTitleIn')){
$template->param('OPACSearchForTitleIn' => $search_for_title);
}
+#IDREF
+if ( C4::Context->preference("IDREF") ) {
+ # If the record comes from the SUDOC
+ if ( $record->field('009') ) {
+ my $unimarc3 = $record->field("009")->data;
+ if ( $unimarc3 =~ /^\d+$/ ) {
+ $template->param(
+ IDREF => 1,
+ );
+ }
+ }
+}
+
# We try to select the best default tab to show, according to what
# the user wants, and what's available for display
my $opac_serial_default = C4::Context->preference('opacSerialDefaultTab');
diff --git a/opac/opac-idref.pl b/opac/opac-idref.pl
new file mode 100755
index 0000000..8980a41
--- /dev/null
+++ b/opac/opac-idref.pl
@@ -0,0 +1,91 @@
+#!/usr/bin/perl
+
+use Modern::Perl;
+
+use CGI;
+use LWP::UserAgent;
+use HTTP::Request::Common;
+use JSON;
+use Encode;
+
+use C4::Auth;
+use C4::Context;
+use C4::Search;
+use C4::Output;
+
+my $cgi = new CGI;
+my ( $template, $borrowernumber, $cookie ) = get_template_and_user(
+ {
+ template_name => "opac-idref.tt",
+ query => $cgi,
+ type => "opac",
+ authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ),
+ flagsrequired => { borrow => 1 },
+ }
+);
+
+my $ua = LWP::UserAgent->new;
+
+my $base = 'http://www.idref.fr/services/biblio/';
+my $unimarc3 = $cgi->param('unimarc3');
+
+my $request = HTTP::Request->new(
+ 'GET',
+ $base . $unimarc3 . ".json",
+);
+$request->protocol('HTTP/1.1');
+my $response = $ua->request($request);
+if ( not $response->is_success) {
+ $template->param(error => $base.$unimarc3.'.json');
+ output_html_with_http_headers $cgi, $cookie, $template->output;
+ exit;
+}
+
+my $content = Encode::decode("utf8", $response->content);
+my $json = from_json( $content );
+my $r;
+my $role_name;
+my @unimarc3;
+my @results = ref $json->{sudoc}{result} eq "ARRAY"
+ ? @{ $json->{sudoc}{result} }
+ : ($json->{sudoc}{result});
+
+for my $role_node ( @results ) {
+ while ( my ( $k, $v ) = each %$role_node ) {
+ next unless $k eq "role";
+ my $role_name;
+ my $count = 0;
+ my $role_data = {};
+ my @nodes = ref $v eq "ARRAY"
+ ? @$v
+ : ($v);
+ for my $node ( @nodes ) {
+ while ( ( $k, $v ) = each %$node ) {
+ given ( $k ) {
+ when ( "roleName" ) {
+ $role_name = $v;
+ $role_data->{role_name} = $role_name;
+ }
+ when ( "count" ) {
+ $role_data->{count} = $v;
+ }
+ when ( "doc" ) {
+ push @{ $role_data->{docs} }, $v;
+ }
+ default {
+ # unimarcCode and marc21Code
+ }
+ }
+ }
+ }
+ push @$r, $role_data;
+ }
+}
+
+$template->param(
+ content => $r,
+ unimarc3 => $unimarc3,
+);
+
+output_html_with_http_headers $cgi, $cookie, $template->output;
+
--
1.7.10.4