X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;ds=sidebyside;f=opac%2Fopac-tags.pl;h=4aec61ee7306ec3092761d18c6bc0e9167068d9c;hb=6b137e75b98b7a91c8900322d3fa062d48ff2fe5;hp=3cf1f53e8d218755cf7faa33a21143d4be51288b;hpb=0db3cccf87fdb14b5556a8a1044d89a5b2baabc5;p=koha-ffzg.git diff --git a/opac/opac-tags.pl b/opac/opac-tags.pl index 3cf1f53e8d..4aec61ee73 100755 --- a/opac/opac-tags.pl +++ b/opac/opac-tags.pl @@ -4,18 +4,18 @@ # # 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 . =head1 NAME @@ -30,20 +30,30 @@ C4::Scrubber is used to remove all markup content from the sumitted text. =cut -use strict; -use warnings; -use CGI; +use Modern::Perl; + +use CGI qw ( -utf8 ); use CGI::Cookie; # need to check cookies before having CGI parse the POST request +use Array::Utils qw( array_minus ); -use C4::Auth qw(:DEFAULT check_cookie_auth); +use C4::Auth qw( check_cookie_auth get_template_and_user ); use C4::Context; -use C4::Debug; -use C4::Output qw(:html :ajax pagination_bar); +use C4::Output qw( output_with_http_headers is_ajax output_html_with_http_headers ); use C4::Scrubber; -use C4::Biblio; -use C4::Tags qw(add_tag get_approval_rows get_tag_rows remove_tag stratify_tags); +use C4::Tags qw( + add_tag + get_approval_rows + get_tag_rows + remove_tag + stratify_tags +); +use C4::XSLT qw( XSLTParse4Display ); +use Koha::Biblios; + -use Data::Dumper; +use Koha::Logger; +use Koha::Biblios; +use Koha::CirculationRules; my %newtags = (); my @deltags = (); @@ -56,20 +66,16 @@ my @globalErrorIndexes = (); sub ajax_auth_cgi { # returns CGI object my $needed_flags = shift; - my %cookies = fetch CGI::Cookie; + my %cookies = CGI::Cookie->fetch; my $input = CGI->new; - my $sessid = $cookies{'CGISESSID'}->value || $input->param('CGISESSID'); - my ($auth_status, $auth_sessid) = check_cookie_auth($sessid, $needed_flags); - $debug and - print STDERR "($auth_status, $auth_sessid) = check_cookie_auth($sessid," . Dumper($needed_flags) . ")\n"; + my $sessid = $cookies{'CGISESSID'}->value; + my ($auth_status) = check_cookie_auth($sessid, $needed_flags); if ($auth_status ne "ok") { output_with_http_headers $input, undef, "window.alert('Your CGI session cookie ($sessid) is not current. " . "Please refresh the page and try again.');\n", 'js'; exit 0; } - $debug and print STDERR "AJAX request: " . Dumper($input), - "\n(\$auth_status,\$auth_sessid) = ($auth_status,$auth_sessid)\n"; return $input; } @@ -82,41 +88,38 @@ sub ajax_auth_cgi { # returns CGI object my $is_ajax = is_ajax(); my $openadds = C4::Context->preference('TagsModeration') ? 0 : 1; my $query = ($is_ajax) ? &ajax_auth_cgi({}) : CGI->new(); -unless (C4::Context->preference('TagsEnabled')) { - push @errors, {+ tagsdisabled=>1 }; - push @globalErrorIndexes, $#errors; -} else { - foreach ($query->param) { - if (/^newtag(.*)/) { - my $biblionumber = $1; - unless ($biblionumber =~ /^\d+$/) { - $debug and warn "$_ references non numerical biblionumber '$biblionumber'"; - push @errors, {+'badparam' => $_ }; - push @globalErrorIndexes, $#errors; - next; - } - $newtags{$biblionumber} = $query->param($_); - } elsif (/^del(\d+)$/) { - push @deltags, $1; - } - } +foreach ($query->param) { + if (/^newtag(.*)/) { + my $biblionumber = $1; + unless ($biblionumber =~ /^\d+$/) { + push @errors, {+'badparam' => $_ }; + push @globalErrorIndexes, $#errors; + next; + } + $newtags{$biblionumber} = $query->param($_); + } elsif (/^del(\d+)$/) { + push @deltags, $1; + } } my $add_op = (scalar(keys %newtags) + scalar(@deltags)) ? 1 : 0; my ($template, $loggedinuser, $cookie); if ($is_ajax) { $loggedinuser = C4::Context->userenv->{'number'}; # must occur AFTER auth - $debug and print STDERR "op: $loggedinuser\n"; } else { ($template, $loggedinuser, $cookie) = get_template_and_user({ - template_name => "opac-tags.tmpl", - query => $query, - type => "opac", - authnotrequired => ($add_op ? 0 : 1), # auth required to add tags - debug => 1, + template_name => "opac-tags.tt", + query => $query, + type => "opac", + authnotrequired => ($add_op ? 0 : 1), # auth required to add tags }); } +unless ( C4::Context->preference('TagsEnabled') ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} + if ($add_op) { unless ($loggedinuser) { push @errors, {+'login' => 1 }; @@ -155,7 +158,7 @@ if (scalar @newtags_keys) { } else { push @errors, {failed_add_tag=>$clean_tag}; push @{$bibResults->{errors}}, {failed_add_tag=>$clean_tag}; - $debug and warn "add_tag($biblionumber,$clean_tag,$loggedinuser...) returned bad result (" . (defined $result ? $result : 'UNDEF') .")"; + Koha::Logger->get->warn("add_tag($biblionumber,$clean_tag,$loggedinuser...) returned bad result (" . (defined $result ? $result : 'UNDEF') .")"); } } $perBibResults->{$biblionumber} = $bibResults; @@ -225,15 +228,84 @@ my $results = []; my $my_tags = []; if ($loggedinuser) { - $my_tags = get_tag_rows({borrowernumber=>$loggedinuser}); - foreach (@$my_tags) { - my $biblio = GetBiblioData($_->{biblionumber}); - $_->{bib_summary} = $biblio->{title}; - ($biblio->{author}) and $_->{bib_summary} .= " by " . $biblio->{author}; - my $date = $_->{date_created} || ''; - $date =~ /\s+(\d{2}\:\d{2}\:\d{2})/; - $_->{time_created_display} = $1; - } + my $patron = Koha::Patrons->find( { borrowernumber => $loggedinuser } ); + my $rules = C4::Context->yaml_preference('OpacHiddenItems'); + my $should_hide = ( $rules ) ? 1 : 0; + $my_tags = get_tag_rows({borrowernumber=>$loggedinuser}); + my $my_approved_tags = get_approval_rows({ approved => 1 }); + + my $art_req_itypes; + if( C4::Context->preference('ArticleRequests') ) { + $art_req_itypes = Koha::CirculationRules->guess_article_requestable_itemtypes({ $patron ? ( categorycode => $patron->categorycode ) : () }); + } + + # get biblionumbers stored in the cart + my @cart_list; + + if($query->cookie("bib_list")){ + my $cart_list = $query->cookie("bib_list"); + @cart_list = split(/\//, $cart_list); + } + + foreach my $tag (@$my_tags) { + $tag->{visible} = 0; + my $biblio = Koha::Biblios->find( $tag->{biblionumber} ); + my $record = $biblio->metadata->record( + { + embed_items => 1, + opac => 1, + patron => $patron, + } + ); + next unless $record; + my @hidden_items; + if ($should_hide) { + my $items = $biblio->items->search_ordered; + my @all_itemnumbers = $items->get_column('itemnumber'); + my @items_to_show = $items->filter_by_visible_in_opac({ opac => 1, patron => $patron })->as_list; + @hidden_items = array_minus( @all_itemnumbers, @items_to_show ); + } + next + if ( + ( + !$patron + or ( $patron and !$patron->category->override_hidden_items ) + ) + and $biblio->hidden_in_opac( { rules => $rules } ) + ); + $tag->{title} = $biblio->title; + $tag->{subtitle} = $biblio->subtitle; + $tag->{medium} = $biblio->medium; + $tag->{part_number} = $biblio->part_number; + $tag->{part_name} = $biblio->part_name; + $tag->{author} = $biblio->author; + # BZ17530: 'Intelligent' guess if result can be article requested + $tag->{artreqpossible} = ( $art_req_itypes->{ $tag->{itemtype} // q{} } || $art_req_itypes->{ '*' } ) ? 1 : q{}; + + my $variables = { + anonymous_session => ($loggedinuser) ? 0 : 1 + }; + $tag->{XSLTBloc} = XSLTParse4Display( + { + biblionumber => $tag->{biblionumber}, + record => $record, + xsl_syspref => 'OPACXSLTResultsDisplay', + fix_amps => 1, + hidden_items => \@hidden_items, + xslt_variables => $variables + } + ); + + my $date = $tag->{date_created} || ''; + $date =~ /\s+(\d{2}\:\d{2}\:\d{2})/; + $tag->{time_created_display} = $1; + $tag->{approved} = ( grep { $_->{term} eq $tag->{term} and $_->{approved} } @$my_approved_tags ); + $tag->{visible} = 1; + # while we're checking each line, see if item is in the cart + if ( grep {$_ eq $biblio->biblionumber} @cart_list) { + $tag->{incart} = 1; + } + } } $template->param(tagsview => 1);