Koha/opac/opac-search-history.pl
Jonathan Druart ba41b7da79 Bug 10807: Add an authority search history for the OPAC
Like biblio, this feature provides an authority search history.
This history is available for connected and disconnected user.
If the user is not logged in Koha, the history is stored in an
anonymous user sessin.

The search history feature is now factorized in a new module.

This patch adds:
- 1 new db field search_history.type. It permits to distinguish the
  search type (biblio or authority).
- 1 new module C4::Search::History. It deals with 2 different storages:
  DB or cookie
- 2 new UT files: t/Search/History.t and t/db_dependent/Search/History.t
- 1 new behavior: the 'Search history' link (on the top-right corner of
  the screen) is always displayed.

Test plan:
 1/ Switch on the 'EnableOpacSearchHistory' syspref.
 2/ Go on the opac and log out.
 3/ Launch some biblio and authority searches.
 4/ Go on your search history page.
 5/ Check that all yours searches are displayed.
 6/ Click on some links and check that results are consistent.
 7/ Delete your biblio history searches.
 8/ Delete your authority searches history searches.
 9/ Launch some biblio and authority searches
10/ Delete all your history (cross on the top-right corner)
11/ Check that all your history search is empty.
12/ Launch some biblio and authority searches.
13/ Login to your account.
14/ Check that all previous searches are displayed.
15/ Launch some biblio and authority searches.
16/ Check that these previous searches are displayed under "Current
session".
17/ Play with the 4 delete links (current / previous and biblio /
authority).

Signed-off-by: Owen Leonard <oleonard@myacpl.org>
Signed-off-by: Katrin Fischer <Katrin.Fischer.83@web.de>
All patches together pass QA script and tests.
Also, new tests in t/db_dependent/ pass.

Tested in all 4 OPAC themes, being logged in and anonymous.
Anonymous search history will be appended to personal search
history after logging in.
Also verified that cleanup_database still purges search history,
now also including the authority searchs.

Signed-off-by: Galen Charlton <gmc@esilibrary.com>
2014-05-05 02:32:27 +00:00

150 lines
4.7 KiB
Perl
Executable file

#!/usr/bin/perl
# Copyright 2013 BibLibre SARL
#
# This file is part of Koha.
#
# Koha is free software; you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
#
# Koha is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with Koha; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
use Modern::Perl;
use C4::Auth qw(:DEFAULT get_session);
use CGI;
use C4::Context;
use C4::Output;
use C4::Log;
use C4::Items;
use C4::Debug;
use C4::Dates;
use C4::Search::History;
use URI::Escape;
use POSIX qw(strftime);
my $cgi = new CGI;
# Getting the template and auth
my ($template, $loggedinuser, $cookie) = get_template_and_user(
{
template_name => "opac-search-history.tmpl",
query => $cgi,
type => "opac",
authnotrequired => 1,
flagsrequired => {borrowers => 1},
debug => 1,
}
);
my $type = $cgi->param('type');
my $action = $cgi->param('action') || q{};
my $previous = $cgi->param('previous');
# If the user is not logged in, we deal with the session
unless ( $loggedinuser ) {
# Deleting search history
if ($cgi->param('action') && $cgi->param('action') eq 'delete') {
# Deleting session's search history
my $type = $cgi->param('type');
my @searches = ();
if ( $type ) {
@searches = C4::Search::History::get_from_session({ cgi => $cgi });
@searches = map { $_->{type} ne $type ? $_ : () } @searches;
}
C4::Search::History::set_to_session({ cgi => $cgi, search_history => \@searches });
# Redirecting to this same url so the user won't see the search history link in the header
my $uri = $cgi->url();
print $cgi->redirect(-uri => $uri);
# Showing search history
} else {
# Getting the searches from session
my @current_searches = C4::Search::History::get_from_session({
cgi => $cgi,
});
my @current_biblio_searches = map {
$_->{type} eq 'biblio' ? $_ : ()
} @current_searches;
my @current_authority_searches = map {
$_->{type} eq 'authority' ? $_ : ()
} @current_searches;
$template->param(
current_biblio_searches => \@current_biblio_searches,
current_authority_searches => \@current_authority_searches,
);
}
} else {
# And if the user is logged in, we deal with the database
my $dbh = C4::Context->dbh;
# Deleting search history
if ( $action eq 'delete' ) {
my $sessionid = defined $previous
? $cgi->cookie("CGISESSID")
: q{};
C4::Search::History::delete(
{
userid => $loggedinuser,
sessionid => $sessionid,
type => $type,
previous => $previous
}
);
# Redirecting to this same url so the user won't see the search history link in the header
my $uri = $cgi->url();
print $cgi->redirect($uri);
# Showing search history
} else {
my $current_searches = C4::Search::History::get({
userid => $loggedinuser,
sessionid => $cgi->cookie("CGISESSID")
});
my @current_biblio_searches = map {
$_->{type} eq 'biblio' ? $_ : ()
} @$current_searches;
my @current_authority_searches = map {
$_->{type} eq 'authority' ? $_ : ()
} @$current_searches;
my $previous_searches = C4::Search::History::get({
userid => $loggedinuser,
sessionid => $cgi->cookie("CGISESSID"),
previous => 1
});
my @previous_biblio_searches = map {
$_->{type} eq 'biblio' ? $_ : ()
} @$previous_searches;
my @previous_authority_searches = map {
$_->{type} eq 'authority' ? $_ : ()
} @$previous_searches;
$template->param(
current_biblio_searches => \@current_biblio_searches,
current_authority_searches => \@current_authority_searches,
previous_biblio_searches => \@previous_biblio_searches,
previous_authority_searches => \@previous_authority_searches,
);
}
}
$template->param(searchhistoryview => 1);
output_html_with_http_headers $cgi, $cookie, $template->output;