@@ -, +, @@ Fill a 7..$3 field with a ppn (032581270 for example). Fill the 009 field with an integer --- 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/opac.css | 10 +++ 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 | 63 ++++++++++++++ opac/opac-detail.pl | 13 +++ opac/opac-idref.pl | 91 ++++++++++++++++++++ 10 files changed, 229 insertions(+), 1 deletion(-) 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 100755 opac/opac-idref.pl --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -1928,9 +1928,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/ ) ); @@ -1966,6 +1971,7 @@ sub GetMarcAuthors { push @marcauthors, { MARCAUTHOR_SUBFIELDS_LOOP => \@subfields_loop, authoritylink => $subfield9, + unimarc3 => $unimarc3 }; } return \@marcauthors; --- a/etc/zebradb/marc_defs/unimarc/biblios/record.abs +++ a/etc/zebradb/marc_defs/unimarc/biblios/record.abs @@ -151,14 +151,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 # trademark Author : 716 melm 716$9 Koha-Auth-Number,Koha-Auth-Number:n --- a/installer/data/mysql/updatedatabase.pl +++ a/installer/data/mysql/updatedatabase.pl @@ -7953,6 +7953,22 @@ if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { SetVersion($DBversion); } + + + +$DBversion = "3.15.00.XXX"; +if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { + $dbh->do(q{ + 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 (Bug 8992: Add system preference IdRef))\n"; + SetVersion($DBversion); +} + + + + =head1 FUNCTIONS =head2 TableExists($table) --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/web_services.pref +++ a/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 --- a/koha-tmpl/opac-tmpl/prog/en/css/opac.css +++ a/koha-tmpl/opac-tmpl/prog/en/css/opac.css @@ -3074,3 +3074,13 @@ padding: 0.1em 0; width: 35%; font-size: 111%; } + +/* IDREF */ +#idref h2.role { + background-color: #DDDEEE; + cursor: pointer; +} + +#idref table { + margin: 0; +} --- a/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc +++ a/koha-tmpl/opac-tmpl/prog/en/includes/greybox.inc @@ -0,0 +1,7 @@ + + + + + --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt +++ a/koha-tmpl/opac-tmpl/prog/en/modules/opac-detail.tt @@ -30,6 +30,7 @@ [% END %] [% IF ( OpacStarRatings != 'disable' ) %] [% END %] +[% INCLUDE greybox.inc %] [% IF ( OpacHighlightedWords ) %][% END %] [% IF ( bidi ) %] @@ -558,7 +559,11 @@ YAHOO.util.Event.onContentReady("furtherm", function () { [% XSLTBloc %] [% ELSE %]

[% title |html %][% IF ( subtitle ) %] [% FOREACH subtitl IN subtitle %][% subtitl.subfield |html %] [% END %][% END %]

- [% IF ( author ) %]
by [% author |html %]
[% END %] + [% IF ( author ) %] +
+ by [% author |html %] +
+ [% END %] [% UNLESS ( item_level_itypes ) %] [ @@ -618,6 +623,9 @@ YAHOO.util.Event.onContentReady("furtherm", function () { [% IF (MARCAUTHOR.authoritylink) %] [% END %] + [% IF ( IDREF and MARCAUTHOR.unimarc3) %] + IdRef + [% END %] [% UNLESS ( loop.last ) %]|[% END %] [% END %] --- a/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt +++ a/koha-tmpl/opac-tmpl/prog/en/modules/opac-idref.tt @@ -0,0 +1,63 @@ +[% INCLUDE 'doc-head-open.inc' %] +[% IF ( LibraryNameTitle ) %][% LibraryNameTitle %][% ELSE %]Koha online[% END %] catalog › Your search IDREF for ppn [% unimarc3 %] +[% INCLUDE 'doc-head-close.inc' %] +[% INCLUDE 'datatables.inc' %] + + + +
+ [% IF error %] + This ppn is not found on the idref service. + [% ELSE %] + [% FOREACH role IN content %] +
+

[% role.role_name %] ([% role.count %])

+
+ + + + + + + + [% FOREACH doc IN role.docs %] + + + + + + [% END %] + +
CitationKohaSudoc
[% doc.citation %]KohaSudoc
+
+
+ [% END %] + [% END %] +
+[% INCLUDE 'opac-bottom.inc' %] + --- a/opac/opac-detail.pl +++ a/opac/opac-detail.pl @@ -1032,6 +1032,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'); --- a/opac/opac-idref.pl +++ a/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; + --