Owen Leonard
bc1cd0a656
For unknown reasons, having ListImagesForBiblio return undef when there are no images still results in a variable being passed to the template which evaluates as true, with a size of 1. This patch alters ListImagesForBiblio to remove the "return undef" condition, allowing the template to evaluate images as false and show no tab. To test, turn on local cover images and view records in the OPAC which do and do not have cover images attached. Images should display as expected when present, and no images tab should appear on records which have none. Signed-off-by: Melia Meggs <melia@test.bywatersolutions.com> Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com> Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
208 lines
6 KiB
Perl
208 lines
6 KiB
Perl
package C4::Images;
|
|
|
|
# Copyright (C) 2011 C & P Bibliography Services
|
|
# Jared Camins-Esakov <jcamins@cpbibliograpy.com>
|
|
#
|
|
# 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 strict;
|
|
use warnings;
|
|
use 5.010;
|
|
|
|
use C4::Context;
|
|
use GD;
|
|
|
|
use vars qw($debug $noimage $VERSION @ISA @EXPORT);
|
|
|
|
BEGIN {
|
|
|
|
# set the version for version checking
|
|
$VERSION = 3.07.00.049;
|
|
require Exporter;
|
|
@ISA = qw(Exporter);
|
|
@EXPORT = qw(
|
|
&PutImage
|
|
&RetrieveImage
|
|
&ListImagesForBiblio
|
|
&DelImage
|
|
);
|
|
$debug = $ENV{KOHA_DEBUG} || $ENV{DEBUG} || 0;
|
|
|
|
$noimage = pack( "H*",
|
|
'47494638396101000100800000FFFFFF'
|
|
. '00000021F90401000000002C00000000'
|
|
. '010001000002024401003B' );
|
|
}
|
|
|
|
=head2 PutImage
|
|
|
|
PutImage($biblionumber, $srcimage, $replace);
|
|
|
|
Stores binary image data and thumbnail in database, optionally replacing existing images for the given biblio.
|
|
|
|
=cut
|
|
|
|
sub PutImage {
|
|
my ( $biblionumber, $srcimage, $replace ) = @_;
|
|
|
|
return -1 unless defined($srcimage);
|
|
|
|
if ($replace) {
|
|
foreach ( ListImagesForBiblio($biblionumber) ) {
|
|
DelImage($_);
|
|
}
|
|
}
|
|
|
|
my $dbh = C4::Context->dbh;
|
|
my $query =
|
|
"INSERT INTO biblioimages (biblionumber, mimetype, imagefile, thumbnail) VALUES (?,?,?,?);";
|
|
my $sth = $dbh->prepare($query);
|
|
|
|
my $mimetype = 'image/png'
|
|
; # GD autodetects three basic image formats: PNG, JPEG, XPM; we will convert all to PNG which is lossless...
|
|
|
|
# Check the pixel size of the image we are about to import...
|
|
my $thumbnail = _scale_image( $srcimage, 140, 200 )
|
|
; # MAX pixel dims are 140 X 200 for thumbnail...
|
|
my $fullsize = _scale_image( $srcimage, 600, 800 )
|
|
; # MAX pixel dims are 600 X 800 for full-size image...
|
|
$debug and warn "thumbnail is " . length($thumbnail) . " bytes.";
|
|
|
|
$sth->execute( $biblionumber, $mimetype, $fullsize->png(),
|
|
$thumbnail->png() );
|
|
my $dberror = $sth->errstr;
|
|
warn "Error returned inserting $biblionumber.$mimetype." if $sth->errstr;
|
|
undef $thumbnail;
|
|
undef $fullsize;
|
|
return $dberror;
|
|
}
|
|
|
|
=head2 RetrieveImage
|
|
my ($imagedata, $error) = RetrieveImage($imagenumber);
|
|
|
|
Retrieves the specified image.
|
|
|
|
=cut
|
|
|
|
sub RetrieveImage {
|
|
my ($imagenumber) = @_;
|
|
|
|
my $dbh = C4::Context->dbh;
|
|
my $query =
|
|
'SELECT mimetype, imagefile, thumbnail FROM biblioimages WHERE imagenumber = ?';
|
|
my $sth = $dbh->prepare($query);
|
|
$sth->execute($imagenumber);
|
|
my $imagedata = $sth->fetchrow_hashref;
|
|
if ( !$imagedata ) {
|
|
$imagedata->{'thumbnail'} = $noimage;
|
|
$imagedata->{'imagefile'} = $noimage;
|
|
}
|
|
if ( $sth->err ) {
|
|
warn "Database error!" if $debug;
|
|
}
|
|
return $imagedata;
|
|
}
|
|
|
|
=head2 ListImagesForBiblio
|
|
my (@images) = ListImagesForBiblio($biblionumber);
|
|
|
|
Gets a list of all images associated with a particular biblio.
|
|
|
|
=cut
|
|
|
|
sub ListImagesForBiblio {
|
|
my ($biblionumber) = @_;
|
|
|
|
my @imagenumbers;
|
|
my $dbh = C4::Context->dbh;
|
|
my $query = 'SELECT imagenumber FROM biblioimages WHERE biblionumber = ?';
|
|
my $sth = $dbh->prepare($query);
|
|
$sth->execute($biblionumber);
|
|
while ( my $row = $sth->fetchrow_hashref ) {
|
|
push @imagenumbers, $row->{'imagenumber'};
|
|
}
|
|
return @imagenumbers;
|
|
}
|
|
|
|
=head2 DelImage
|
|
|
|
my ($dberror) = DelImage($imagenumber);
|
|
|
|
Removes the image with the supplied imagenumber.
|
|
|
|
=cut
|
|
|
|
sub DelImage {
|
|
my ($imagenumber) = @_;
|
|
warn "Imagenumber passed to DelImage is $imagenumber" if $debug;
|
|
my $dbh = C4::Context->dbh;
|
|
my $query = "DELETE FROM biblioimages WHERE imagenumber = ?;";
|
|
my $sth = $dbh->prepare($query);
|
|
$sth->execute($imagenumber);
|
|
my $dberror = $sth->errstr;
|
|
warn "Database error!" if $sth->errstr;
|
|
return $dberror;
|
|
}
|
|
|
|
sub _scale_image {
|
|
my ( $image, $maxwidth, $maxheight ) = @_;
|
|
my ( $width, $height ) = $image->getBounds();
|
|
$debug and warn "image is $width pix X $height pix.";
|
|
if ( $width > $maxwidth || $height > $maxheight ) {
|
|
|
|
# $debug and warn "$filename exceeds the maximum pixel dimensions of $maxwidth X $maxheight. Resizing...";
|
|
my $percent_reduce; # Percent we will reduce the image dimensions by...
|
|
if ( $width > $maxwidth ) {
|
|
$percent_reduce =
|
|
sprintf( "%.5f", ( $maxwidth / $width ) )
|
|
; # If the width is oversize, scale based on width overage...
|
|
}
|
|
else {
|
|
$percent_reduce =
|
|
sprintf( "%.5f", ( $maxheight / $height ) )
|
|
; # otherwise scale based on height overage.
|
|
}
|
|
my $width_reduce = sprintf( "%.0f", ( $width * $percent_reduce ) );
|
|
my $height_reduce = sprintf( "%.0f", ( $height * $percent_reduce ) );
|
|
$debug
|
|
and warn "Reducing image by "
|
|
. ( $percent_reduce * 100 )
|
|
. "\% or to $width_reduce pix X $height_reduce pix";
|
|
my $newimage = GD::Image->new( $width_reduce, $height_reduce, 1 )
|
|
; #'1' creates true color image...
|
|
$newimage->copyResampled( $image, 0, 0, 0, 0, $width_reduce,
|
|
$height_reduce, $width, $height );
|
|
return $newimage;
|
|
}
|
|
else {
|
|
return $image;
|
|
}
|
|
}
|
|
|
|
=head2 NoImage
|
|
|
|
C4::Images->NoImage;
|
|
|
|
Returns the gif to be used when there is no image matching the request, and
|
|
its mimetype (image/gif).
|
|
|
|
=cut
|
|
|
|
sub NoImage {
|
|
return $noimage, 'image/gif';
|
|
}
|
|
|
|
1;
|