From af1db4e3223749b01b653436d0c7ca32b759aefc Mon Sep 17 00:00:00 2001 From: Peter Lorimer Date: Wed, 29 Jun 2011 14:11:37 +0100 Subject: [PATCH] Bug 6539: Creates a function to validate an isbn and uses it to populate the Z3950 search popup isbn with this value, the the value is not an isbn number the title field is populated. Content-Type: text/plain; charset="utf-8" To Test: Performa a catalogue search then hit the Z39.50 search button and your search term should populate the Title field in the pop up window. Now perform a search on a valid ISBN (10 or 13) number and the term you searched for should populate the ISBN field on the popup window. --- C4/Search.pm | 73 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 61 insertions(+), 12 deletions(-) diff --git a/C4/Search.pm b/C4/Search.pm index c3cff65..be96946 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -33,6 +33,7 @@ use C4::Debug; use C4::Items; use YAML; use URI::Escape; +use POSIX; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $DEBUG); @@ -1423,7 +1424,7 @@ sub searchResults { #find branchname #get branch information..... my %branches; - my $bsth =$dbh->prepare("SELECT branchcode,branchname FROM branches"); # FIXME : use C4::Branch::GetBranches + my $bsth =$dbh->prepare("SELECT branchcode,branchname FROM branches "); $bsth->execute(); while ( my $bdata = $bsth->fetchrow_hashref ) { $branches{ $bdata->{'branchcode'} } = $bdata->{'branchname'}; @@ -1671,7 +1672,7 @@ sub searchResults { ($reservestatus, $reserveitem) = C4::Reserves::CheckReserves($item->{itemnumber}); } - # item is withdrawn, lost, damaged, not for loan, reserved or in transit + # item is withdrawn, lost or damaged if ( $item->{wthdrawn} || $item->{itemlost} || $item->{damaged} @@ -1686,15 +1687,6 @@ sub searchResults { $item_in_transit_count++ if $transfertwhen ne ''; $item_onhold_count++ if $reservestatus eq 'Waiting'; $item->{status} = $item->{wthdrawn} . "-" . $item->{itemlost} . "-" . $item->{damaged} . "-" . $item->{notforloan}; - - # can place hold on item ? - if ((!$item->{damaged} || C4::Context->preference('AllowHoldsOnDamagedItems')) - && !$item->{itemlost} - && !$item->{withdrawn} - ) { - $can_place_holds = 1; - } - $other_count++; my $key = $prefix . $item->{status}; @@ -2599,9 +2591,20 @@ $template->param ( MYLOOP => C4::Search::z3950_search_args($searchscalar) ) =cut + + + sub z3950_search_args { my $bibrec = shift; - $bibrec = { title => $bibrec } if !ref $bibrec; + + + if (validate_isbn($bibrec) == 1) + { + $bibrec = { isbn => $bibrec } if !ref $bibrec; +} +else { + $bibrec = { title => $bibrec } if !ref $bibrec; +} my $array = []; for my $field (qw/ lccn isbn issn title author dewey subject /) { @@ -2641,6 +2644,52 @@ OR adds a new authority record =cut +=head +BOOL validate_isbn($isbn_number) + +This function validates an isbn number by: + +1. Checking it is 10 or 13 characters long +2. If it is 10 characters long, checks the lasd character is an 'X' and all other characters are digits +3. If it is 13 characters long, checks it begins with '97' and all other characters are digits + +=cut +sub validate_isbn { + my $isbn = shift; + + # Handle ISBNs with spaces or hyphens in them + $isbn =~ s/\s+//g; + $isbn =~ s/\-//g; + + # Is it the correct length ? + if (length($isbn) != 10 && length($isbn) != 13) + { return 0; } + else { + + # Is the last char 'x' for ISBN10 ? + my @chars = split('', $isbn); + if (length($isbn) == 10 && uc($chars[9]) eq 'X') + { + # Are all but the last characters digits ? + if (isdigit(substr($isbn,0,length($isbn)-1)) ) + { return 1;} + } + + # Is it 13 chars long and begin with '97' ? + if ( ($chars[0] eq '9' && $chars[1] eq '7') && length($isbn) == 13) + { + # is it made up of digits? + if (isdigit($isbn)) + { return 1;} + + + } + + } + # If this function has not yet successfully returned the return failure + return 0; +} + sub BiblioAddAuthorities{ my ( $record, $frameworkcode ) = @_; my $dbh=C4::Context->dbh; -- 1.7.4.1