X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-search-history.pl;h=3ae4aadd2bce4b4d7d75606f0a49e3da94f922dd;hb=38d75d28afd485aabdb5d4491a0b8380dc8c409a;hp=1b76c558945e5c87e8e1f3c393d2a7c1a60f2ea9;hpb=0db3cccf87fdb14b5556a8a1044d89a5b2baabc5;p=koha.git diff --git a/opac/opac-search-history.pl b/opac/opac-search-history.pl index 1b76c55894..3ae4aadd2b 100755 --- a/opac/opac-search-history.pl +++ b/opac/opac-search-history.pl @@ -1,34 +1,33 @@ #!/usr/bin/perl -# Copyright 2009 BibLibre SARL +# 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 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 3 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. +# 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. +# You should have received a copy of the GNU General Public License +# along with Koha; if not, see . -use strict; -use warnings; +use Modern::Perl; use C4::Auth qw(:DEFAULT get_session); -use CGI; -use Storable qw(freeze thaw); +use CGI qw ( -utf8 ); 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); @@ -36,115 +35,130 @@ 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, - }); - -# If the user is not logged in, we deal with the cookie -if (!$loggedinuser) { +my ($template, $loggedinuser, $cookie) = get_template_and_user( + { + template_name => "opac-search-history.tt", + query => $cgi, + type => "opac", + authnotrequired => ( C4::Context->preference("OpacPublic") ? 1 : 0 ), + debug => 1, + } +); - # Deleting search history - if ($cgi->param('action') && $cgi->param('action') eq 'delete') { - # Deleting cookie's content - my $recentSearchesCookie = $cgi->cookie( - -name => 'KohaOpacRecentSearches', - -value => freeze([]), - -expires => '' - ); - - # Redirecting to this same url with the cookie in the headers so it's deleted immediately - my $uri = $cgi->url(); - print $cgi->redirect(-uri => $uri, - -cookie => $recentSearchesCookie); +unless ( C4::Context->preference("EnableOpacSearchHistory") ) { + print $cgi->redirect("/cgi-bin/koha/errors/404.pl"); # escape early + exit; +} + +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 ( $action eq 'delete') { + # Deleting session's search history + my @id = $cgi->multi_param('id'); + my $all = not scalar( @id ); + + my $type = $cgi->param('type'); + my @searches = (); + unless ( $all ) { + @searches = C4::Search::History::get_from_session({ cgi => $cgi }); + if ( $type ) { + @searches = map { $_->{type} ne $type ? $_ : () } @searches; + } + if ( @id ) { + @searches = map { my $search = $_; ( grep {/^$search->{id}$/} @id ) ? () : $_ } @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 + print $cgi->redirect(-uri => '/cgi-bin/koha/opac-search-history.pl'); # Showing search history } else { - - # Getting the cookie - my $searchcookie = $cgi->cookie('KohaOpacRecentSearches'); - if ($searchcookie && thaw(uri_unescape($searchcookie))) { - my @recentSearches = @{thaw(uri_unescape($searchcookie))}; - if (@recentSearches) { - - # As the dates are stored as unix timestamps, let's do some formatting - foreach my $asearch (@recentSearches) { - - # We create an iso date from the unix timestamp - my $isodate = strftime "%Y-%m-%d", localtime($asearch->{'time'}); - - # So we can create a C4::Dates object, to get the date formatted according to the dateformat syspref - my $date = C4::Dates->new($isodate, "iso"); - my $sysprefdate = $date->output("syspref"); - - # We also get the time of the day from the unix timestamp - my $time = strftime " %H:%M:%S", localtime($asearch->{'time'}); - - # And we got our human-readable date : - $asearch->{'time'} = $sysprefdate . $time; - } - - $template->param(recentSearches => \@recentSearches); - } - } + # 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 - + # And if the user is logged in, we deal with the database my $dbh = C4::Context->dbh; # Deleting search history - if ($cgi->param('action') && $cgi->param('action') eq 'delete') { - my $query = "DELETE FROM search_history WHERE userid = ?"; - my $sth = $dbh->prepare($query); - $sth->execute($loggedinuser); - - # 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); - + if ( $action eq 'delete' ) { + my @id = $cgi->multi_param('id'); + if ( @id ) { + C4::Search::History::delete( + { + userid => $loggedinuser, + id => [ $cgi->param('id') ], + } + ); + } else { + C4::Search::History::delete( + { + userid => $loggedinuser, + } + ); + } + # Redirecting to this same url so the user won't see the search history link in the header + print $cgi->redirect(-uri => '/cgi-bin/koha/opac-search-history.pl'); # Showing search history } else { - - my $date = C4::Dates->new(); - my $dateformat = $date->DHTMLcalendar() . " %H:%i:%S"; # Current syspref date format + standard time format - - # Getting the data with date format work done by mysql - my $query = "SELECT userid, sessionid, query_desc, query_cgi, total, DATE_FORMAT(time, \"$dateformat\") as time FROM search_history WHERE userid = ? AND sessionid = ?"; - my $sth = $dbh->prepare($query); - $sth->execute($loggedinuser, $cgi->cookie("CGISESSID")); - my $searches = $sth->fetchall_arrayref({}); - $template->param(recentSearches => $searches); - - # Getting searches from previous sessions - $query = "SELECT COUNT(*) FROM search_history WHERE userid = ? AND sessionid != ?"; - $sth = $dbh->prepare($query); - $sth->execute($loggedinuser, $cgi->cookie("CGISESSID")); - - # If at least one search from previous sessions has been performed - if ($sth->fetchrow_array > 0) { - $query = "SELECT userid, sessionid, query_desc, query_cgi, total, DATE_FORMAT(time, \"$dateformat\") as time FROM search_history WHERE userid = ? AND sessionid != ?"; - $sth = $dbh->prepare($query); - $sth->execute($loggedinuser, $cgi->cookie("CGISESSID")); - my $previoussearches = $sth->fetchall_arrayref({}); - $template->param(previousSearches => $previoussearches); - - } - - $sth->finish; - - + 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; - - +output_html_with_http_headers $cgi, $cookie, $template->output, undef, { force_no_caching => 1 };