X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=opac%2Fopac-detail.pl;h=5940fb0c93c07c278b95e2bd633a6ee37dcdd319;hb=cd14fd421c6908a73174d2cd0267779b9fd4e08f;hp=85eeaa70caab35af8682fbab1286dacb3b9d8d4e;hpb=23f85cae11fdd5356875b52b6d1f88af9d0e141a;p=koha.git diff --git a/opac/opac-detail.pl b/opac/opac-detail.pl index 85eeaa70ca..5940fb0c93 100755 --- a/opac/opac-detail.pl +++ b/opac/opac-detail.pl @@ -33,9 +33,8 @@ use C4::Circulation; use C4::Tags qw(get_tags); use C4::Dates qw/format_date/; use C4::XISBN qw(get_xisbns get_biblionumber_from_isbn get_biblio_from_xisbn); -use C4::Amazon; +use C4::External::Amazon; use C4::Review; -use C4::Serials; use C4::Members; use C4::XSLT; @@ -58,12 +57,21 @@ my ( $template, $borrowernumber, $cookie ) = get_template_and_user( ); my $biblionumber = $query->param('biblionumber') || $query->param('bib'); + +$template->param( 'AllowOnShelfHolds' => C4::Context->preference('AllowOnShelfHolds') ); +$template->param( 'ItemsIssued' => CountItemsIssued( $biblionumber ) ); +$template->param(C4::Search::enabled_opac_search_views); + my $record = GetMarcBiblio($biblionumber); +if ( ! $record ) { + print $query->redirect("/cgi-bin/koha/errors/404.pl"); + exit; +} $template->param( biblionumber => $biblionumber ); # XSLT processing of some stuff if (C4::Context->preference("XSLTDetailsDisplay") ) { - my $newxmlrecord = XSLTParse4Display($biblionumber, $record, C4::Context->config('opachtdocs')."/prog/en/xslt/MARC21slim2OPACDetail.xsl"); - $template->param('XSLTBloc' => $newxmlrecord); + $template->param( + 'XSLTBloc' => XSLTParse4Display($biblionumber, $record, C4::Context->preference("XSLTDetailsDisplay")) ); } # change back when ive fixed request.pl @@ -79,10 +87,6 @@ if (C4::Context->preference('hidelostitems')) { } my $dat = &GetBiblioData($biblionumber); -if (!$dat) { - print $query->redirect("/cgi-bin/koha/errors/404.pl"); - exit; -} my $itemtypes = GetItemTypes(); # imageurl: my $itemtype = $dat->{'itemtype'}; @@ -97,7 +101,7 @@ my $collections = GetKohaAuthorisedValues('items.ccode',$dat->{'frameworkcode'} my $subscriptionsnumber = CountSubscriptionFromBiblionumber($biblionumber); my @subscriptions = GetSubscriptions( $dat->{title}, $dat->{issn}, $biblionumber ); my @subs; -$dat->{'serial'}=1 if $subscriptionsnumber; +$dat->{'serials'}=1 if $subscriptionsnumber; foreach my $subscription (@subscriptions) { my %cell; $cell{subscriptionid} = $subscription->{subscriptionid}; @@ -143,7 +147,7 @@ for my $itm (@items) { $itm->{'imageurl'} = getitemtypeimagelocation( 'opac', $itemtypes->{ $itm->{itype} }->{'imageurl'} ); $itm->{'description'} = $itemtypes->{ $itm->{itype} }->{'description'}; } - foreach (qw(ccode enumchron copynumber itemnotes)) { + foreach (qw(ccode enumchron copynumber itemnotes uri)) { $itemfields{$_} = 1 if ($itm->{$_}); } @@ -173,14 +177,18 @@ for my $itm (@items) { ## get notes and subjects from MARC record my $dbh = C4::Context->dbh; my $marcflavour = C4::Context->preference("marcflavour"); -my $marcnotesarray = GetMarcNotes ($record,$marcflavour); -my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour); -my $marcsubjctsarray = GetMarcSubjects($record,$marcflavour); -my $marcseriesarray = GetMarcSeries ($record,$marcflavour); -my $marcurlsarray = GetMarcUrls ($record,$marcflavour); -my $subtitle = C4::Biblio::get_koha_field_from_marc('bibliosubtitle', 'subtitle', $record, ''); +my $normalized_isbn = GetNormalizedISBN($dat->{isbn},$record,$marcflavour); +my $marcnotesarray = GetMarcNotes ($record,$marcflavour); +my $marcauthorsarray = GetMarcAuthors ($record,$marcflavour); +my $marcsubjctsarray = GetMarcSubjects ($record,$marcflavour); +my $marcseriesarray = GetMarcSeries ($record,$marcflavour); +my $marcurlsarray = GetMarcUrls ($record,$marcflavour); +my $subtitle = GetRecordValue('subtitle', $record, GetFrameworkCode($biblionumber)); $template->param( + normalized_oclc => GetNormalizedOCLCNumber($record,$marcflavour), + normalized_upc => GetNormalizedUPC ($record,$marcflavour), + normalized_isbn => $normalized_isbn, MARCNOTES => $marcnotesarray, MARCSUBJCTS => $marcsubjctsarray, MARCAUTHORS => $marcauthorsarray, @@ -190,6 +198,7 @@ my $subtitle = C4::Biblio::get_koha_field_from_marc('bibliosubtitle', 's RequestOnOpac => C4::Context->preference("RequestOnOpac"), itemdata_ccode => $itemfields{ccode}, itemdata_enumchron => $itemfields{enumchron}, + itemdata_uri => $itemfields{uri}, itemdata_copynumber => $itemfields{copynumber}, itemdata_itemnotes => $itemfields{itemnotes}, authorised_value_images => $biblio_authorised_value_images, @@ -214,6 +223,7 @@ foreach ( @$reviews ) { $_->{surname} = $borrowerData->{'surname'}; $_->{firstname} = $borrowerData->{'firstname'}; $_->{userid} = $borrowerData->{'userid'}; + $_->{cardnumber} = $borrowerData->{'cardnumber'}; $_->{datereviewed} = format_date($_->{datereviewed}); if ($borrowerData->{'borrowernumber'} eq $borrowernumber) { $_->{your_comment} = 1; @@ -236,36 +246,13 @@ $template->param( loggedincommenter => $loggedincommenter ); -sub isbn_cleanup ($) { - my $isbn=shift; - ($isbn) = $isbn =~ /([\d-]*[X]*)/; - $isbn =~ s/-//g; - if ( - $isbn =~ /\b(\d{13})\b/ or - $isbn =~ /\b(\d{10})\b/ or - $isbn =~ /\b(\d{9}X)\b/i - ) { - return $1; - } - return undef; -} # XISBN Stuff -my $xisbn=$dat->{'isbn'}; -(my $aisbn) = $xisbn =~ /([\d-]*[X]*)/; -$aisbn =~ s/-//g; -$template->param(amazonisbn => $aisbn); # FIXME: so it is OK if the ISBN = 'XXXXX' ? -my ($clean,$clean2); -# these might be overkill, but they are better than the regexp above. -if ($clean = isbn_cleanup($xisbn)){ - $template->param(clean_isbn => $clean); -} if (C4::Context->preference("OPACFRBRizeEditions")==1) { eval { $template->param( - xisbn => $xisbn, - XISBNS => get_xisbns($xisbn) + XISBNS => get_xisbns($normalized_isbn) ); }; if ($@) { warn "XISBN Failed $@"; } @@ -276,30 +263,49 @@ if ( C4::Context->preference("OPACAmazonEnabled") ) { } if ( C4::Context->preference("OPACAmazonEnabled") && C4::Context->preference("OPACAmazonSimilarItems") ) { my $similar_products_exist; - my $amazon_details = &get_amazon_details( $xisbn, $record, $marcflavour ); - my $item_attributes = \%{$amazon_details->{Items}->{Item}->{ItemAttributes}}; - my $customer_reviews = \@{$amazon_details->{Items}->{Item}->{CustomerReviews}->{Review}}; - for my $one_review (@$customer_reviews) { - $one_review->{Date} = format_date($one_review->{Date}); - } - my @similar_products; - for my $similar_product (@{$amazon_details->{Items}->{Item}->{SimilarProducts}->{SimilarProduct}}) { - # do we have any of these isbns in our collection? - my $similar_biblionumbers = get_biblionumber_from_isbn($similar_product->{ASIN}); - # verify that there is at least one similar item - if (scalar(@$similar_biblionumbers)){ - $similar_products_exist++ if ($similar_biblionumbers && $similar_biblionumbers->[0]); - push @similar_products, +{ similar_biblionumbers => $similar_biblionumbers, title => $similar_product->{Title}, ASIN => $similar_product->{ASIN} }; + my $amazon_reviews = C4::Context->preference("AmazonReviews"); + my $amazon_similars = C4::Context->preference("AmazonSimilarItems"); + my @services; + my $amazon_details = &get_amazon_details( $normalized_isbn, $record, $marcflavour, \@services ); + + if ( $amazon_reviews ) { + + my $item = $amazon_details->{Items}->{Item}->[0]; + my $customer_reviews = \@{ $item->{CustomerReviews}->{Review} }; + for my $one_review ( @$customer_reviews ) { + $one_review->{Date} = format_date($one_review->{Date}); } + my $editorial_reviews = \@{ $item->{EditorialReviews}->{EditorialReview} }; + my $average_rating = $item->{CustomerReviews}->{AverageRating} || 0; + $template->param( amazon_average_rating => $average_rating * 20); + $template->param( AMAZON_CUSTOMER_REVIEWS => $customer_reviews ); + $template->param( AMAZON_EDITORIAL_REVIEWS => $editorial_reviews ); } - my $editorial_reviews = \@{$amazon_details->{Items}->{Item}->{EditorialReviews}->{EditorialReview}}; - my $average_rating = $amazon_details->{Items}->{Item}->{CustomerReviews}->{AverageRating} || 0; - $template->param( OPACAmazonSimilarItems => $similar_products_exist ); - $template->param( amazon_average_rating => $average_rating * 20); - $template->param( AMAZON_CUSTOMER_REVIEWS => $customer_reviews ); - $template->param( AMAZON_SIMILAR_PRODUCTS => \@similar_products ); - $template->param( AMAZON_EDITORIAL_REVIEWS => $editorial_reviews ); + if ( $amazon_similars ) { + my $item = $amazon_details->{Items}->{Item}->[0]; + my @similar_products; + for my $similar_product (@{ $item->{SimilarProducts}->{SimilarProduct} }) { + # do we have any of these isbns in our collection? + my $similar_biblionumbers = get_biblionumber_from_isbn($similar_product->{ASIN}); + # verify that there is at least one similar item + if (scalar(@$similar_biblionumbers)){ + $similar_products_exist++ if ($similar_biblionumbers && $similar_biblionumbers->[0]); + push @similar_products, +{ similar_biblionumbers => $similar_biblionumbers, title => $similar_product->{Title}, ASIN => $similar_product->{ASIN} }; + } + } + $template->param( OPACAmazonSimilarItems => $similar_products_exist ); + $template->param( AMAZON_SIMILAR_PRODUCTS => \@similar_products ); + } + } + +# Babelthèque +if ( C4::Context->preference("Babeltheque") ) { + $template->param( + Babeltheque => 1, + ); +} + # Shelf Browser Stuff if (C4::Context->preference("OPACShelfBrowser")) { # pick the first itemnumber unless one was selected by the user @@ -321,7 +327,9 @@ if (C4::Context->preference("OPACShelfBrowser")) { ## List of Previous Items # order by cn_sort, which should include everything we need for ordering purposes (though not # for limits, those need to be handled separately - my $sth_shelfbrowse_previous = $dbh->prepare(" + my $sth_shelfbrowse_previous; + if (defined $starting_location->{code}) { + $sth_shelfbrowse_previous = $dbh->prepare(" SELECT * FROM items WHERE @@ -329,24 +337,32 @@ if (C4::Context->preference("OPACShelfBrowser")) { homebranch = ? AND location = ? ORDER BY cn_sort DESC, itemnumber LIMIT 3 "); - $sth_shelfbrowse_previous->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code}); + $sth_shelfbrowse_previous->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code}); + } else { + $sth_shelfbrowse_previous = $dbh->prepare(" + SELECT * + FROM items + WHERE + ((cn_sort = ? AND itemnumber < ?) OR cn_sort < ?) AND + homebranch = ? + ORDER BY cn_sort DESC, itemnumber LIMIT 3 + "); + $sth_shelfbrowse_previous->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}); + } my @previous_items; while (my $this_item = $sth_shelfbrowse_previous->fetchrow_hashref()) { my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?"); $sth_get_biblio->execute($this_item->{biblionumber}); while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) { $this_item->{'title'} = $this_biblio->{'title'}; - if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) { - $this_item->{'isbn'} = $clean2; - } else { - $this_item->{'isbn'} = $this_biblio->{'isbn'}; - } } unshift @previous_items, $this_item; } ## List of Next Items; this also intentionally catches the current item - my $sth_shelfbrowse_next = $dbh->prepare(" + my $sth_shelfbrowse_next; + if (defined $starting_location->{code}) { + $sth_shelfbrowse_next = $dbh->prepare(" SELECT * FROM items WHERE @@ -354,22 +370,30 @@ if (C4::Context->preference("OPACShelfBrowser")) { homebranch = ? AND location = ? ORDER BY cn_sort, itemnumber LIMIT 3 "); - $sth_shelfbrowse_next->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code}); + $sth_shelfbrowse_next->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}, $starting_location->{code}); + } + else { + $sth_shelfbrowse_next = $dbh->prepare(" + SELECT * + FROM items + WHERE + ((cn_sort = ? AND itemnumber >= ?) OR cn_sort > ?) AND + homebranch = ? + ORDER BY cn_sort, itemnumber LIMIT 3 + "); + $sth_shelfbrowse_next->execute($starting_cn_sort, $starting_itemnumber, $starting_cn_sort, $starting_homebranch->{code}); + } my @next_items; while (my $this_item = $sth_shelfbrowse_next->fetchrow_hashref()) { my $sth_get_biblio = $dbh->prepare("SELECT biblio.*,biblioitems.isbn AS isbn FROM biblio LEFT JOIN biblioitems ON biblio.biblionumber=biblioitems.biblionumber WHERE biblio.biblionumber=?"); $sth_get_biblio->execute($this_item->{biblionumber}); while (my $this_biblio = $sth_get_biblio->fetchrow_hashref()) { $this_item->{'title'} = $this_biblio->{'title'}; - if ($clean2 = isbn_cleanup($this_biblio->{'isbn'})) { - $this_item->{'isbn'} = $clean2; - } else { - $this_item->{'isbn'} = $this_biblio->{'isbn'}; - } } push @next_items, $this_item; } - + + # alas, these won't auto-vivify, see http://www.perlmonks.org/?node_id=508481 my $shelfbrowser_next_itemnumber = $next_items[-1]->{itemnumber} if @next_items; my $shelfbrowser_next_biblionumber = $next_items[-1]->{biblionumber} if @next_items; @@ -395,14 +419,14 @@ if (C4::Context->preference("BakerTaylorEnabled")) { BakerTaylorBookstoreURL => C4::Context->preference('BakerTaylorBookstoreURL'), ); my ($bt_user, $bt_pass); - if ($clean and + if ($normalized_isbn and $bt_user = C4::Context->preference('BakerTaylorUsername') and $bt_pass = C4::Context->preference('BakerTaylorPassword') ) { $template->param( BakerTaylorContentURL => sprintf("http://contentcafe2.btol.com/ContentCafeClient/ContentCafe.aspx?UserID=%s&Password=%s&ItemKey=%s&Options=Y", - $bt_user,$bt_pass,$clean) + $bt_user,$bt_pass,$normalized_isbn) ); } }