X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FVirtualShelves%2FPage.pm;h=d32afed84dc0ab67bf0a475aed6648a4badfcfd5;hb=680e92115f109bec50562de7043df17add8b26eb;hp=df7054e57d73c45e755a8fd4b5ae17082e9b604e;hpb=ef8171ba425f766b67d9e139194b6a8d570e301e;p=koha_gimpoz diff --git a/C4/VirtualShelves/Page.pm b/C4/VirtualShelves/Page.pm index df7054e57d..d32afed84d 100644 --- a/C4/VirtualShelves/Page.pm +++ b/C4/VirtualShelves/Page.pm @@ -22,8 +22,12 @@ package C4::VirtualShelves::Page; use strict; use warnings; + use CGI; -use C4::VirtualShelves qw/:DEFAULT RefreshShelvesSummary/; +use Exporter; +use Data::Dumper; + +use C4::VirtualShelves qw/:DEFAULT ShelvesMax/; use C4::Biblio; use C4::Items; use C4::Koha; @@ -32,11 +36,11 @@ use C4::Members; use C4::Output; use C4::Dates qw/format_date/; use C4::Tags qw(get_tags); -use Exporter; -use Data::Dumper; use C4::Csv; use C4::XSLT; +use constant VIRTUALSHELVES_COUNT => 20; + use vars qw($debug @EXPORT @ISA $VERSION); BEGIN { @@ -51,22 +55,36 @@ our %pages = ( opac => { redirect => '/cgi-bin/koha/opac-shelves.pl', }, ); -sub shelfpage ($$$$$) { +sub shelfpage { my ( $type, $query, $template, $loggedinuser, $cookie ) = @_; ( $pages{$type} ) or $type = 'opac'; $query or die "No query"; $template or die "No template"; - $template->param( { loggedinuser => $loggedinuser } ); + $template->param( + loggedinuser => $loggedinuser, + OpacAllowPublicListCreation => C4::Context->preference('OpacAllowPublicListCreation'), + ); + my $edit; + my $shelves; my @paramsloop; my $totitems; my $shelfoff = ( $query->param('shelfoff') ? $query->param('shelfoff') : 1 ); + $template->{VARS}->{'shelfoff'} = $shelfoff; my $itemoff = ( $query->param('itemoff') ? $query->param('itemoff') : 1 ); my $displaymode = ( $query->param('display') ? $query->param('display') : 'publicshelves' ); my ( $shelflimit, $shelfoffset, $shelveslimit, $shelvesoffset ); my $marcflavour = C4::Context->preference("marcflavour"); + # get biblionumbers stored in the cart + my @cart_list; + my $cart_cookie = ( $type eq 'opac' ? "bib_list" : "intranet_bib_list" ); + if($query->cookie($cart_cookie)){ + my $cart_list = $query->cookie($cart_cookie); + @cart_list = split(/\//, $cart_list); + } + $shelflimit = ( $type eq 'opac' ? C4::Context->preference('OPACnumSearchResults') : C4::Context->preference('numSearchResults') ); - $shelflimit = $shelflimit || 20; + $shelflimit = $shelflimit || ShelvesMax('MGRPAGE'); $shelfoffset = ( $itemoff - 1 ) * $shelflimit; # Sets the offset to begin retrieving items at $shelveslimit = $shelflimit; # Limits number of shelves returned for a given query (row_count) $shelvesoffset = ( $shelfoff - 1 ) * $shelflimit; # Sets the offset to begin retrieving shelves at (offset) @@ -81,37 +99,51 @@ sub shelfpage ($$$$$) { } my $op = $query->param('op'); - # my $imgdir = getitemtypeimagesrc(); - # my $itemtypes = GetItemTypes(); - # the format of this is unindented for ease of diff comparison to the old script # Note: do not mistake the assignment statements below for comparisons! - if ( $query->param('modifyshelfcontents') ) { my ( $shelfnumber, $barcode, $item, $biblio ); if ( $shelfnumber = $query->param('viewshelf') ) { - if ( ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ) ) { - if ( $barcode = $query->param('addbarcode') ) { - $item = GetItem( 0, $barcode ); - if (defined $item && $item->{'itemnumber'}){ + #add to shelf + if($barcode = $query->param('addbarcode') ) { + if(ShelfPossibleAction( $loggedinuser, $shelfnumber, 'add')) { + $item = GetItem( 0, $barcode); + if (defined $item && $item->{'itemnumber'}) { $biblio = GetBiblioFromItemNumber( $item->{'itemnumber'} ); - AddToShelf( $biblio->{'biblionumber'}, $shelfnumber ) + AddToShelf( $biblio->{'biblionumber'}, $shelfnumber, $loggedinuser) or push @paramsloop, { duplicatebiblio => $barcode }; - } else { + } + else { push @paramsloop, { failgetitem => $barcode }; } - } else { - ( grep { /REM-(\d+)/ } $query->param ) or push @paramsloop, { nobarcode => 1 }; - foreach ( $query->param ) { + } + else { + push @paramsloop, { nopermission => $shelfnumber }; + } + } + elsif(grep { /REM-(\d+)/ } $query->param) { + #remove item(s) from shelf + if(ShelfPossibleAction($loggedinuser, $shelfnumber, 'delete')) { + #This is just a general okay; DelFromShelf checks further + my @bib; + foreach($query->param) { /REM-(\d+)/ or next; - $debug and warn "SHELVES: user $loggedinuser removing item $1 from shelf $shelfnumber"; - DelFromShelf( $1, $shelfnumber ); # $1 is biblionumber + push @bib, $1; #$1 is biblionumber + } + my $t= DelFromShelf(\@bib, $shelfnumber, $loggedinuser); + if($t==0) { + push @paramsloop, {nothingdeleted => $shelfnumber}; + } + elsif($t<@bib) { + push @paramsloop, {somedeleted => $shelfnumber}; } } - } else { - push @paramsloop, { nopermission => $shelfnumber }; + else { + push @paramsloop, { nopermission => $shelfnumber }; + } } - } else { + } + else { push @paramsloop, { noshelfnumber => 1 }; } } @@ -146,25 +178,43 @@ sub shelfpage ($$$$$) { SWITCH: { if ($op) { - unless ($okmanage) { - push @paramsloop, { nopermission => $shelfnumber }; - last SWITCH; - } + #Saving modified shelf if ( $op eq 'modifsave' ) { + unless ($okmanage) { + push @paramsloop, { nopermission => $shelfnumber }; + last SWITCH; + } my $shelf = { 'shelfname' => $query->param('shelfname'), - 'category' => $query->param('category'), 'sortfield' => $query->param('sortfield'), }; + if($query->param('category')) { #optional + $shelf->{category}= $query->param('category'); + } + unless(ModShelf($shelfnumber, $shelf )) { + push @paramsloop, {modifyfailure => $shelf->{shelfname}}; + last SWITCH; + } - ModShelf( $shelfnumber, $shelf ); - - } elsif ( $op eq 'modif' ) { + if($displaymode eq "viewshelf"){ + print $query->redirect( $pages{$type}->{redirect} . "?viewshelf=$shelfnumber" ); + } elsif($displaymode eq "publicshelves"){ + print $query->redirect( $pages{$type}->{redirect} ); + } else { + print $query->redirect( $pages{$type}->{redirect} . "?display=privateshelves" ); + } + exit; + } + #Editing a shelf + elsif ( $op eq 'modif' ) { my ( $shelfnumber2, $shelfname, $owner, $category, $sortfield ) = GetShelf($shelfnumber); my $member = GetMember( 'borrowernumber' => $owner ); my $ownername = defined($member) ? $member->{firstname} . " " . $member->{surname} : ''; + $edit = 1; + $sortfield='' unless $sortfield; $template->param( edit => 1, + display => $displaymode, shelfnumber => $shelfnumber2, shelfname => $shelfname, owner => $owner, @@ -176,6 +226,8 @@ sub shelfpage ($$$$$) { } last SWITCH; } + + #View a shelf if ( $shelfnumber = $query->param('viewshelf') ) { # explicitly fetch this shelf my ($shelfnumber2,$shelfname,$owner,$category,$sorton) = GetShelf($shelfnumber); @@ -205,8 +257,8 @@ sub shelfpage ($$$$$) { my $biblionumber = $this_item->{'biblionumber'}; my $record = GetMarcBiblio($biblionumber); $this_item->{XSLTBloc} = - XSLTParse4Display($biblionumber, $record, 'Results', 'opac') - if C4::Context->preference("OPACXSLTResultsDisplay"); + XSLTParse4Display($biblionumber, $record, "OPACXSLTResultsDisplay") + if C4::Context->preference("OPACXSLTResultsDisplay") && $type eq 'opac'; # the virtualshelfcontents table does not store these columns nor are they retrieved from the items # and itemtypes tables, so I'm commenting them out for now to quiet the log -crn @@ -214,7 +266,7 @@ sub shelfpage ($$$$$) { #$this_item->{'description'} = $itemtypes->{ $this_item->{itemtype} }->{'description'}; $this_item->{'dateadded'} = format_date( $this_item->{'dateadded'} ); $this_item->{'imageurl'} = getitemtypeinfo( $this_item->{'itemtype'} )->{'imageurl'}; - $this_item->{'coins'} = GetCOinSBiblio( $this_item->{'biblionumber'} ); + $this_item->{'coins'} = GetCOinSBiblio( $record ); $this_item->{'subtitle'} = GetRecordValue('subtitle', $record, GetFrameworkCode($this_item->{'biblionumber'})); $this_item->{'normalized_upc'} = GetNormalizedUPC( $record,$marcflavour); $this_item->{'normalized_ean'} = GetNormalizedEAN( $record,$marcflavour); @@ -224,6 +276,9 @@ sub shelfpage ($$$$$) { my @items_infos = &GetItemsLocationInfo( $this_item->{'biblionumber'}); $this_item->{'itemsissued'} = CountItemsIssued( $this_item->{'biblionumber'} ); $this_item->{'ITEM_RESULTS'} = \@items_infos; + if ( grep {$_ eq $biblionumber} @cart_list) { + $this_item->{'incart'} = 1; + } if (C4::Context->preference('TagsEnabled') and $tag_quantity = C4::Context->preference('TagsShowOnList')) { $this_item->{'TagLoop'} = get_tags({ @@ -238,25 +293,37 @@ sub shelfpage ($$$$$) { my $i = 0; my $manageshelf = ShelfPossibleAction( $loggedinuser, $shelfnumber, 'manage' ); $template->param( - shelfname => $shelfname, - shelfnumber => $shelfnumber, - viewshelf => $shelfnumber, - authorsort => $authorsort, - yearsort => $yearsort, - manageshelf => $manageshelf, - itemsloop => $items, + shelfname => $shelfname, + shelfnumber => $shelfnumber, + viewshelf => $shelfnumber, + authorsort => $authorsort, + yearsort => $yearsort, + manageshelf => $manageshelf, + allowremovingitems => ShelfPossibleAction( $loggedinuser, $shelfnumber, 'delete'), + allowaddingitem => ShelfPossibleAction( $loggedinuser, $shelfnumber, 'add'), + "category$category" => 1, + category => $category, + itemsloop => $items, + showprivateshelves => $category==1, ); } else { push @paramsloop, { nopermission => $shelfnumber }; } last SWITCH; } + if ( $query->param('shelves') ) { my $stay = 1; + + #Add a shelf if ( my $newshelf = $query->param('addshelf') ) { # note: a user can always add a new shelf - my $shelfnumber = AddShelf( $newshelf, $query->param('owner'), $query->param('category'), $query->param('sortfield') ); + my $shelfnumber = AddShelf( { + shelfname => $newshelf, + sortfield => $query->param('sortfield'), + category => $query->param('category') }, + $query->param('owner') ); $stay = 1; if ( $shelfnumber == -1 ) { #shelf already exists. $showadd = 1; @@ -267,6 +334,8 @@ sub shelfpage ($$$$$) { exit; } } + + #Deleting a shelf (asking for confirmation if it has entries) foreach ( $query->param() ) { /DEL-(\d+)/ or next; $delflag = 1; @@ -308,14 +377,16 @@ sub shelfpage ($$$$$) { } push( @paramsloop, { delete_ok => $name } ); - # print $query->redirect($pages{$type}->{redirect}); exit; $stay = 0; } $showadd = 1; - $stay and $template->param( shelves => 1 ); + if ($stay){ + $template->param( shelves => 1 ); + $shelves = 1; + } last SWITCH; } - } + } # end of SWITCH block (@paramsloop) and $template->param( paramsloop => \@paramsloop ); $showadd and $template->param( showadd => 1 ); @@ -329,18 +400,19 @@ sub shelfpage ($$$$$) { my %line; $shelflist->{$element}->{shelf} = $element; my $category = $shelflist->{$element}->{'category'}; - my $owner = $shelflist->{$element}->{'owner'}; + my $owner = $shelflist->{$element}->{'owner'}||0; my $canmanage = ShelfPossibleAction( $loggedinuser, $element, 'manage' ); my $sortfield = $shelflist->{$element}->{'sortfield'}; - if ( $sortfield eq 'author' ) { - $shelflist->{$element}->{"authorsort"} = 'author'; - } - if ( $sortfield eq 'year' ) { - $shelflist->{$element}->{"yearsort"} = 'year'; + if ( $sortfield ){ + if ( $sortfield eq 'author' ) { + $shelflist->{$element}->{"authorsort"} = 'author'; + } elsif ( $sortfield eq 'year' ) { + $shelflist->{$element}->{"yearsort"} = 'year'; + } } $shelflist->{$element}->{"viewcategory$category"} = 1; $shelflist->{$element}->{manageshelf} = $canmanage; - if ( $owner eq $loggedinuser or $canmanage ) { + if($canmanage || ($loggedinuser && $owner==$loggedinuser)) { $shelflist->{$element}->{'mine'} = 1; } my $member = GetMember( 'borrowernumber' => $owner ); @@ -359,11 +431,11 @@ sub shelfpage ($$$$$) { $qhash{$_} = $query->param($_) if $query->param($_); } ( scalar keys %qhash ) and $url .= '?' . join '&', map { "$_=$qhash{$_}" } keys %qhash; - if ( $query->param('viewshelf') ) { - $template->param( { pagination_bar => pagination_bar( $url, ( int( $totitems / $shelflimit ) ) + ( ( $totitems % $shelflimit ) > 0 ? 1 : 0 ), $itemoff, "itemoff" ) } ); - } else { + if ( $shelfnumber && $totitems ) { + $template->param( pagination_bar => pagination_bar( $url, ( int( $totitems / $shelflimit ) ) + ( ( $totitems % $shelflimit ) > 0 ? 1 : 0 ), $itemoff, "itemoff" ) ); + } elsif ( $totshelves ) { $template->param( - { pagination_bar => pagination_bar( $url, ( int( $totshelves / $shelveslimit ) ) + ( ( $totshelves % $shelveslimit ) > 0 ? 1 : 0 ), $shelfoff, "shelfoff" ) } ); + pagination_bar => pagination_bar( $url, ( int( $totshelves / $shelveslimit ) ) + ( ( $totshelves % $shelveslimit ) > 0 ? 1 : 0 ), $shelfoff, "shelfoff" ) ); } $template->param( shelveslooppriv => \@shelveslooppriv, @@ -373,39 +445,26 @@ sub shelfpage ($$$$$) { "BiblioDefaultView" . C4::Context->preference("BiblioDefaultView") => 1, csv_profiles => GetCsvProfilesLoop() ); - if ( $template->param('viewshelf') - or $template->param('shelves') - or $template->param('edit') ) { + if ( $shelfnumber + or $shelves + or $edit ) { $template->param( vseflag => 1 ); } - if ($template->param('shelves') or # note: this part looks duplicative, but is intentional - $template->param('edit') + if ($shelves or # note: this part looks duplicative, but is intentional + $edit ) { $template->param( seflag => 1 ); } - #FIXME: This refresh really only needs to happen when there is a modification of some sort - # to the shelves, but the above code is so convoluted in its handling of the various - # options, it is easier to do this refresh every time C4::VirtualShelves::Page.pm is - # called - - my ( $total, $pubshelves, $barshelves ) = RefreshShelvesSummary( $query->cookie("CGISESSID"), $loggedinuser, ( $loggedinuser == -1 ? 20 : 10 ) ); - - if ( defined $barshelves ) { - $template->param( - barshelves => scalar( @{ $barshelves } ), +#Next call updates the shelves for the Lists button. +#May not always be needed (when nothing changed), but doesn't take much. + my ($total, $pubshelves, $barshelves) = C4::VirtualShelves::GetSomeShelfNames($loggedinuser, 'MASTHEAD'); + $template->param( + barshelves => $total->{bartotal}, barshelvesloop => $barshelves, - ); - $template->param( bartotal => $total->{'bartotal'}, ) if ( $total->{'bartotal'} > scalar( @{ $barshelves } ) ); - } - - if ( defined $pubshelves ) { - $template->param( - pubshelves => scalar( @{ $pubshelves } ), + pubshelves => $total->{pubtotal}, pubshelvesloop => $pubshelves, - ); - $template->param( pubtotal => $total->{'pubtotal'}, ) if ( $total->{'pubtotal'} > scalar( @{ $pubshelves } ) ); - } + ); output_html_with_http_headers $query, $cookie, $template->output; }