Bugzilla – Attachment 115159 Details for
Bug 27428
Show the number of records in the bibliographic record detail page with ElasticSearch
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 27428: Show the number of records in the bibliographic record detail page with ElasticSearch.
Bug-27428-Show-the-number-of-records-in-the-biblio.patch (text/plain), 10.70 KB, created by
Ivan Dziuba
on 2021-01-14 13:26:51 UTC
(
hide
)
Description:
Bug 27428: Show the number of records in the bibliographic record detail page with ElasticSearch.
Filename:
MIME Type:
Creator:
Ivan Dziuba
Created:
2021-01-14 13:26:51 UTC
Size:
10.70 KB
patch
obsolete
>From 7c7a8e98c446c2529bce788dfa79ca0668ce790f Mon Sep 17 00:00:00 2001 >From: Ivan Dziuba <ivan.dziuba@inlibro.com> >Date: Thu, 14 Jan 2021 08:25:05 -0500 >Subject: [PATCH] Bug 27428: Show the number of records in the bibliographic > record detail page with ElasticSearch. > >Tests: >1. Apply this patch; >2. In the Preference system - OPACDisplayRecordCount -> Show; >3. We can see the number of records next to search links in the bibliographic record detail page in the OPAC. >--- > Koha/SearchEngine/Elasticsearch/Browse.pm | 42 +++++++++ > ...ber_records_next_to_search_links_opac.perl | 8 ++ > installer/data/mysql/mandatory/sysprefs.sql | 3 +- > .../prog/en/includes/doc-head-close.inc | 3 + > .../modules/admin/preferences/searching.pref | 9 ++ > .../bootstrap/en/modules/opac-detail.tt | 4 +- > .../bootstrap/js/opac-display-record-count.js | 91 +++++++++++++++++++ > opac/svc/elasticsearch/opac-autocomplete.pl | 53 +++++++++++ > 8 files changed, 211 insertions(+), 2 deletions(-) > create mode 100644 installer/data/mysql/atomicupdate/bug_27428-number_records_next_to_search_links_opac.perl > create mode 100644 koha-tmpl/opac-tmpl/bootstrap/js/opac-display-record-count.js > create mode 100755 opac/svc/elasticsearch/opac-autocomplete.pl > >diff --git a/Koha/SearchEngine/Elasticsearch/Browse.pm b/Koha/SearchEngine/Elasticsearch/Browse.pm >index 85070730a7..7ca6b27255 100644 >--- a/Koha/SearchEngine/Elasticsearch/Browse.pm >+++ b/Koha/SearchEngine/Elasticsearch/Browse.pm >@@ -48,6 +48,7 @@ as "suggestible" in the database when indexing takes place. > > use base qw(Koha::SearchEngine::Elasticsearch); > use Modern::Perl; >+use JSON; > > =head2 browse > >@@ -162,6 +163,47 @@ sub _build_query { > return $query; > } > >+sub _build_query_count_record { >+ my ($self, $cgi_q, $key, $item) = @_; >+ my $query = { >+ query => { >+ match_phrase => { >+ $key => $item >+ } >+ } >+ }; >+ return $query; >+} >+ >+sub count_record { >+ my ($self, $cgi_q) = @_; >+ my @results_return; >+ my $decoded; >+ $cgi_q =~ s/\{\'/\{\"/g; >+ $cgi_q =~ s/\'\}/\"\}/g; >+ #$cgi_q =~ s/\'\:\'/\"\:\"}/g; >+ eval { >+ $decoded = JSON::XS::decode_json($cgi_q); >+ }; >+ if ($@) { >+ warn "Caught JSON::XS decode error: $_"; >+ } >+ >+ foreach my $item (@$decoded) >+ { >+ for my $key ( keys %$item ){ >+ my $elasticsearch = $self->get_elasticsearch(); >+ my $query = $self->_build_query_count_record($cgi_q, $key, $$item{$key}); >+ my $res = $elasticsearch->search( >+ index => $self->index_name, >+ body => $query >+ ); >+ push(@results_return, $res->{'hits'}->{'total'}); >+ } >+ } >+ return \@results_return; >+} >+ > 1; > > __END__ >diff --git a/installer/data/mysql/atomicupdate/bug_27428-number_records_next_to_search_links_opac.perl b/installer/data/mysql/atomicupdate/bug_27428-number_records_next_to_search_links_opac.perl >new file mode 100644 >index 0000000000..1a63dbb788 >--- /dev/null >+++ b/installer/data/mysql/atomicupdate/bug_27428-number_records_next_to_search_links_opac.perl >@@ -0,0 +1,8 @@ >+$DBversion = 'XXX'; # will be replaced by the RM >+if( CheckVersion( $DBversion ) ) { >+ # you can use $dbh here like: >+ $dbh->do(q{INSERT IGNORE INTO systempreferences (variable,value,options,explanation,type) VALUES ('OPACDisplayRecordCount', '0', NULL, NULL, 'YesNo')}); >+ >+ # Always end with this (adjust the bug info) >+ NewVersion( $DBversion, 27428, "Show the number of records in the detail page in the OPAC"); >+} >diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql >index 7f0afaa594..1d7fdd8a4b 100644 >--- a/installer/data/mysql/mandatory/sysprefs.sql >+++ b/installer/data/mysql/mandatory/sysprefs.sql >@@ -722,5 +722,6 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` > ('XSLTListsDisplay','default','','Enable XSLT stylesheet control over lists pages display on intranet','Free'), > ('XSLTResultsDisplay','default','','Enable XSL stylesheet control over results page display on intranet','Free'), > ('z3950AuthorAuthFields','701,702,700',NULL,'Define the MARC biblio fields for Personal Name Authorities to fill biblio.author','free'), >-('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo') >+('z3950NormalizeAuthor','0','','If ON, Personal Name Authorities will replace authors in biblio.author','YesNo'), >+('OPACDisplayRecordCount','0',NULL,NULL,'YesNo') > ; >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc >index c2833e3009..8ca24b247e 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/doc-head-close.inc >@@ -26,6 +26,9 @@ > var Koha = {}; > </script> > >+[% IF ( Koha.Preference('OPACDisplayRecordCount') ) %] >+ [% Asset.js("js/opac-display-record-count.js") %] >+[% END %] > [% IF lang && lang != 'en' %] > [% Asset.js(lang _ '/js/locale_data.js') | $raw %] > [% END %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref >index 71bcbfaa1c..2cd0d1f16f 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref >@@ -283,3 +283,12 @@ Searching: > - LIBRIS base URL > - pref: LibrisURL > - "Please only change this if you are sure it needs changing." >+ - >+ - pref: OPACDisplayRecordCount >+ type: boolean >+ default: no >+ choices: >+ yes: Show >+ no: "Don't show" >+ - the number of records next to search links in the bibliographic record detail page in the OPAC. >+ - >\ No newline at end of file >diff --git a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >index 1f0d336a73..c66fde8e0e 100644 >--- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >+++ b/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-detail.tt >@@ -1446,7 +1446,9 @@ > [% IF ( Koha.Preference('OPACDetailQRCode') ) %] > [% Asset.js("lib/kjua/kjua.min.js") | $raw %] > [% END %] >- >+ [% IF ( Koha.Preference('OPACDisplayRecordCount') ) %] >+ NumberResultsRecord(); >+ [% END %] > [% IF ( Koha.Preference('OPACShowMusicalInscripts') ) %] > <script> > var interface = "[% interface | html %]"; >diff --git a/koha-tmpl/opac-tmpl/bootstrap/js/opac-display-record-count.js b/koha-tmpl/opac-tmpl/bootstrap/js/opac-display-record-count.js >new file mode 100644 >index 0000000000..205d31e9e1 >--- /dev/null >+++ b/koha-tmpl/opac-tmpl/bootstrap/js/opac-display-record-count.js >@@ -0,0 +1,91 @@ >+var url_request = '/cgi-bin/koha/svc/elasticsearch/opac-autocomplete.pl?q='; >+ >+const url_param = '_search?filter_path=hits.total&source_content_type=application/json' >+/* Regex pour tous les URL avec un recherche */ >+var regex_es_link = "/cgi-bin/koha/opac-search.pl?q="; >+/* key API */ >+var key_display = 'nb_notice'; >+/* idx de recherche */ >+var es_builder = { >+ 'an' : 'koha-auth-number', >+ 'Provider' : 'provider', >+ 'se,phr' : 'title-series', >+ 'au' : 'author', >+ 'su,complete-subfield' : 'subject' >+} >+/* On remplace tous les caractères suivants */ >+//https://www.obkb.com/dcljr/charstxt.html >+var not_symbols = { >+ '\'':'%27', >+ '.':'%2E', >+ '+': '', >+ ',': '%2C', >+ ';': '%3B', >+ '-': '', >+ '=': '', >+ '&': '%26', >+ '|': '', >+ '>': '', >+ '<': '', >+ '!': '', >+ '(': '', >+ ')': '', >+ '{': '', >+ '}': '', >+ '[': '', >+ ']': '', >+ '^': '', >+ '"': '', >+ '~': '', >+ '*': '', >+ '?': '', >+ ':': '%3A', >+ '/': '', >+ "\\": '%5C' >+}; >+ >+function NumberResultsRecord(){ >+ >+ var regex = `a[href*="${regex_es_link}"]`; >+ var all_link = $(regex); >+ /* array json data to server */ >+ var json_data=[]; >+ >+ $.each( all_link, function( i, val ) { >+ var url = ''; >+ var str = val.href; >+ /* on prend param de q= */ >+ str = decodeURIComponent(str.split('?q=').pop()); >+ /* split query for fields for search [0] */ >+ var es_search = str.split(':'); >+ /* Remplacement pour un requete */ >+ var str_search = str.substring(str.indexOf(":") + 1); >+ /* [0] this is field for search */ >+ str_search = str_search.replace(/[&\/\\#,+()$~%.'":;*?<>{}]/g, function(matched){ >+ return not_symbols[matched]; >+ }); >+ es_search[0] = es_search[0][0] == '(' ? es_search[0].substring(1) : es_search[0]; >+ var json = {}; >+ json[es_builder[es_search[0]]] = str_search; >+ json_data.push(json); >+ }); >+ >+ $.ajax({ >+ type: 'GET', >+ url: url_request + JSON.stringify(json_data) + '&key=' + key_display, >+ success: function (data) { >+ console.log(data); >+ jQuery.each( all_link, function( i, val ) { >+ $(val).after(" <span style=\"color:black\"><b>["+data[i]+"]</b></span>"); >+ console.log(val); >+ }); >+ }, >+ error: function (data) { >+ console.log(data); >+ }, >+ }); >+ >+ >+ >+ console.log("json_data = ", JSON.stringify(json_data) ); >+} >diff --git a/opac/svc/elasticsearch/opac-autocomplete.pl b/opac/svc/elasticsearch/opac-autocomplete.pl >new file mode 100755 >index 0000000000..0baabcceb5 >--- /dev/null >+++ b/opac/svc/elasticsearch/opac-autocomplete.pl >@@ -0,0 +1,53 @@ >+#!/usr/bin/perl >+ >+use strict; >+use warnings; >+use CGI qw ( -utf8 ); >+use v5.10; >+use JSON; >+use Switch; >+use utf8; >+use Text::Unaccent; >+use CGI::Session; >+use Koha::SearchEngine::Elasticsearch::Browse; >+ >+my $browser = Koha::SearchEngine::Elasticsearch::Browse->new( { index => 'biblios' } ); >+my $cgi = CGI->new; >+my $session = CGI::Session->new(); >+ >+$session->param(-name=>'q', -value=>$cgi->param("q")); >+$session->param(-name=>'key', -value=>$cgi->param("key")); >+$session->expire('+1h'); >+ >+#Chose GET in key parametre >+given ($session->param("key")) { >+ when ("nb_notice") { >+ my $res = $browser->count_record(unac_string("UTF-8", $session->param("q"))); >+ print $cgi->header("application/json"); >+ print to_json($res); >+ } >+ #no key 404 >+ default { >+ response404JSON(); >+ } >+} >+ >+sub response404JSON { >+ my $json = JSON->new->utf8; >+ my $header_type = "application/json"; >+ my $header_status = "404"; >+ my $output = $json->encode({ >+ "error" => "No data", >+ "description" => "Bad request", >+ }); >+ print $cgi->header( >+ -type => $header_type, >+ -charset => "utf-8", >+ -status => $header_status >+ ); >+ print $output; >+ print "\n"; >+} >+ >+ >+ >-- >2.17.1
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 27428
:
115159
|
115206
|
117950
|
119980
|
120034
|
120633
|
132068
|
139625
|
139626
|
139681
|
145222
|
148842
|
154509
|
154510
|
158639
|
158640
|
158641
|
161349
|
164557
|
164558
|
164559
|
164560
|
167328
|
167677
|
167767
|
167768
|
167769
|
167770
|
167771
|
167774
|
170274
|
170275
|
170276
|
170277
|
170278
|
170279