X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FKoha.pm;h=06b2ec5289b6b55ce0b6466adb96c6542c2a597e;hb=d150c98540e98cf783a7e06b1de76988cd4752c2;hp=fb27ee26c80f5ee7ce417dd3bcfc6bd6aef43a80;hpb=a85bd68b8e33cbf4a7cd46fa90e2fdbfc909a846;p=koha.git diff --git a/C4/Koha.pm b/C4/Koha.pm index fb27ee26c8..06b2ec5289 100644 --- a/C4/Koha.pm +++ b/C4/Koha.pm @@ -1,6 +1,8 @@ package C4::Koha; # Copyright 2000-2002 Katipo Communications +# Parts Copyright 2010 Nelsonville Public Library +# Parts copyright 2010 BibLibre # # This file is part of Koha. # @@ -34,7 +36,6 @@ BEGIN { @ISA = qw(Exporter); @EXPORT = qw( &slashifyDate - &DisplayISBN &subfield_is_koha_internal_p &GetPrinters &GetPrinter &GetItemTypes &getitemtypeinfo @@ -56,11 +57,15 @@ BEGIN { &GetAuthorisedValueCategories &GetKohaAuthorisedValues &GetKohaAuthorisedValuesFromField + &GetKohaAuthorisedValueLib + &GetAuthorisedValueByCode + &GetKohaImageurlFromAuthorisedValues &GetAuthValCode &GetNormalizedUPC &GetNormalizedISBN &GetNormalizedEAN &GetNormalizedOCLCNumber + &xml_escape $DEBUG ); @@ -103,106 +108,6 @@ sub slashifyDate { return ("$dateOut[2]/$dateOut[1]/$dateOut[0]"); } - -=head2 DisplayISBN - - my $string = DisplayISBN( $isbn ); - -=cut - -sub DisplayISBN { - my ($isbn) = @_; - if (length ($isbn)<13){ - my $seg1; - if ( substr( $isbn, 0, 1 ) <= 7 ) { - $seg1 = substr( $isbn, 0, 1 ); - } - elsif ( substr( $isbn, 0, 2 ) <= 94 ) { - $seg1 = substr( $isbn, 0, 2 ); - } - elsif ( substr( $isbn, 0, 3 ) <= 995 ) { - $seg1 = substr( $isbn, 0, 3 ); - } - elsif ( substr( $isbn, 0, 4 ) <= 9989 ) { - $seg1 = substr( $isbn, 0, 4 ); - } - else { - $seg1 = substr( $isbn, 0, 5 ); - } - my $x = substr( $isbn, length($seg1) ); - my $seg2; - if ( substr( $x, 0, 2 ) <= 19 ) { - - # if(sTmp2 < 10) sTmp2 = "0" sTmp2; - $seg2 = substr( $x, 0, 2 ); - } - elsif ( substr( $x, 0, 3 ) <= 699 ) { - $seg2 = substr( $x, 0, 3 ); - } - elsif ( substr( $x, 0, 4 ) <= 8399 ) { - $seg2 = substr( $x, 0, 4 ); - } - elsif ( substr( $x, 0, 5 ) <= 89999 ) { - $seg2 = substr( $x, 0, 5 ); - } - elsif ( substr( $x, 0, 6 ) <= 9499999 ) { - $seg2 = substr( $x, 0, 6 ); - } - else { - $seg2 = substr( $x, 0, 7 ); - } - my $seg3 = substr( $x, length($seg2) ); - $seg3 = substr( $seg3, 0, length($seg3) - 1 ); - my $seg4 = substr( $x, -1, 1 ); - return "$seg1-$seg2-$seg3-$seg4"; - } else { - my $seg1; - $seg1 = substr( $isbn, 0, 3 ); - my $seg2; - if ( substr( $isbn, 3, 1 ) <= 7 ) { - $seg2 = substr( $isbn, 3, 1 ); - } - elsif ( substr( $isbn, 3, 2 ) <= 94 ) { - $seg2 = substr( $isbn, 3, 2 ); - } - elsif ( substr( $isbn, 3, 3 ) <= 995 ) { - $seg2 = substr( $isbn, 3, 3 ); - } - elsif ( substr( $isbn, 3, 4 ) <= 9989 ) { - $seg2 = substr( $isbn, 3, 4 ); - } - else { - $seg2 = substr( $isbn, 3, 5 ); - } - my $x = substr( $isbn, length($seg2) +3); - my $seg3; - if ( substr( $x, 0, 2 ) <= 19 ) { - - # if(sTmp2 < 10) sTmp2 = "0" sTmp2; - $seg3 = substr( $x, 0, 2 ); - } - elsif ( substr( $x, 0, 3 ) <= 699 ) { - $seg3 = substr( $x, 0, 3 ); - } - elsif ( substr( $x, 0, 4 ) <= 8399 ) { - $seg3 = substr( $x, 0, 4 ); - } - elsif ( substr( $x, 0, 5 ) <= 89999 ) { - $seg3 = substr( $x, 0, 5 ); - } - elsif ( substr( $x, 0, 6 ) <= 9499999 ) { - $seg3 = substr( $x, 0, 6 ); - } - else { - $seg3 = substr( $x, 0, 7 ); - } - my $seg4 = substr( $x, length($seg3) ); - $seg4 = substr( $seg4, 0, length($seg4) - 1 ); - my $seg5 = substr( $x, -1, 1 ); - return "$seg1-$seg2-$seg3-$seg4-$seg5"; - } -} - # FIXME.. this should be moved to a MARC-specific module sub subfield_is_koha_internal_p ($) { my ($subfield) = @_; @@ -598,6 +503,7 @@ sub _getImagesFromDirectory { if ( opendir ( my $dh, $directoryname ) ) { my @images = grep { /\.(gif|png)$/i } readdir( $dh ); closedir $dh; + @images = sort(@images); return @images; } else { warn "unable to opendir $directoryname: $!"; @@ -667,10 +573,12 @@ sub getImageSets { my @imagesets = (); # list of hasrefs of image set data to pass to template my @subdirectories = _getSubdirectoryNames( $paths->{'staff'}{'filesystem'} ); - +warn $paths->{'staff'}{'filesystem'}; foreach my $imagesubdir ( @subdirectories ) { + warn $imagesubdir; my @imagelist = (); # hashrefs of image info my @imagenames = _getImagesFromDirectory( File::Spec->catfile( $paths->{'staff'}{'filesystem'}, $imagesubdir ) ); + my $imagesetactive = 0; foreach my $thisimage ( @imagenames ) { push( @imagelist, { KohaImage => "$imagesubdir/$thisimage", @@ -679,8 +587,10 @@ sub getImageSets { checked => "$imagesubdir/$thisimage" eq $checked ? 1 : 0, } ); + $imagesetactive = 1 if "$imagesubdir/$thisimage" eq $checked; } push @imagesets, { imagesetname => $imagesubdir, + imagesetactive => $imagesetactive, images => \@imagelist }; } @@ -1034,6 +944,25 @@ sub displayServers { return \@primaryserverloop; } + +=head2 GetKohaImageurlFromAuthorisedValues + +$authhorised_value = GetKohaImageurlFromAuthorisedValues( $category, $authvalcode ); + +Return the first url of the authorised value image represented by $lib. + +=cut + +sub GetKohaImageurlFromAuthorisedValues { + my ( $category, $lib ) = @_; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT imageurl FROM authorised_values WHERE category=? AND lib =?"); + $sth->execute( $category, $lib ); + while ( my $data = $sth->fetchrow_hashref ) { + return $data->{'imageurl'}; + } +} + =head2 GetAuthValCode $authvalcode = GetAuthValCode($kohafield,$frameworkcode); @@ -1122,12 +1051,32 @@ sub GetAuthorisedValueCategories { my $sth = $dbh->prepare("SELECT DISTINCT category FROM authorised_values ORDER BY category"); $sth->execute; my @results; - while (my $category = $sth->fetchrow_array) { + while (defined (my $category = $sth->fetchrow_array) ) { push @results, $category; } return \@results; } +=head2 GetAuthorisedValueByCode + +$authhorised_value = GetAuthorisedValueByCode( $category, $authvalcode ); + +Return the lib attribute from authorised_values from the row identified +by the passed category and code + +=cut + +sub GetAuthorisedValueByCode { + my ( $category, $authvalcode ) = @_; + + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("SELECT lib FROM authorised_values WHERE category=? AND authorised_value =?"); + $sth->execute( $category, $authvalcode ); + while ( my $data = $sth->fetchrow_hashref ) { + return $data->{'lib'}; + } +} + =head2 GetKohaAuthorisedValues Takes $kohafield, $fwcode as parameters. @@ -1189,6 +1138,46 @@ sub GetKohaAuthorisedValuesFromField { } } +=head2 xml_escape + + my $escaped_string = C4::Koha::xml_escape($string); + +Convert &, <, >, ', and " in a string to XML entities + +=cut + +sub xml_escape { + my $str = shift; + return '' unless defined $str; + $str =~ s/&/&/g; + $str =~ s//>/g; + $str =~ s/'/'/g; + $str =~ s/"/"/g; + return $str; +} + +=head2 GetKohaAuthorisedValueLib + +Takes $category, $authorised_value as parameters. + +If $opac parameter is set to a true value, displays OPAC descriptions rather than normal ones when they exist. + +Returns authorised value description + +=cut + +sub GetKohaAuthorisedValueLib { + my ($category,$authorised_value,$opac) = @_; + my $value; + my $dbh = C4::Context->dbh; + my $sth = $dbh->prepare("select lib, lib_opac from authorised_values where category=? and authorised_value=?"); + $sth->execute($category,$authorised_value); + my $data = $sth->fetchrow_hashref; + $value = ($opac && $$data{'lib_opac'}) ? $$data{'lib_opac'} : $$data{'lib'}; + return $value; +} + =head2 display_marc_indicators my $display_form = C4::Koha::display_marc_indicators($field); @@ -1214,21 +1203,22 @@ sub GetNormalizedUPC { my ($record,$marcflavour) = @_; my (@fields,$upc); - if ($marcflavour eq 'MARC21') { - @fields = $record->field('024'); + if ($marcflavour eq 'UNIMARC') { + @fields = $record->field('072'); foreach my $field (@fields) { - my $indicator = $field->indicator(1); my $upc = _normalize_match_point($field->subfield('a')); - if ($indicator == 1 and $upc ne '') { + if ($upc ne '') { return $upc; } } + } - else { # assume unimarc if not marc21 - @fields = $record->field('072'); + else { # assume marc21 if not unimarc + @fields = $record->field('024'); foreach my $field (@fields) { + my $indicator = $field->indicator(1); my $upc = _normalize_match_point($field->subfield('a')); - if ($upc ne '') { + if ($indicator == 1 and $upc ne '') { return $upc; } } @@ -1241,14 +1231,17 @@ sub GetNormalizedISBN { my ($isbn,$record,$marcflavour) = @_; my @fields; if ($isbn) { + # Koha attempts to store multiple ISBNs in biblioitems.isbn, separated by " | " + # anything after " | " should be removed, along with the delimiter + $isbn =~ s/(.*)( \| )(.*)/$1/; return _isbn_cleanup($isbn); } return undef unless $record; - if ($marcflavour eq 'MARC21') { - @fields = $record->field('020'); + if ($marcflavour eq 'UNIMARC') { + @fields = $record->field('010'); foreach my $field (@fields) { - $isbn = $field->subfield('a'); + my $isbn = $field->subfield('a'); if ($isbn) { return _isbn_cleanup($isbn); } else { @@ -1256,10 +1249,10 @@ sub GetNormalizedISBN { } } } - else { # assume unimarc if not marc21 - @fields = $record->field('010'); + else { # assume marc21 if not unimarc + @fields = $record->field('020'); foreach my $field (@fields) { - my $isbn = $field->subfield('a'); + $isbn = $field->subfield('a'); if ($isbn) { return _isbn_cleanup($isbn); } else { @@ -1267,28 +1260,27 @@ sub GetNormalizedISBN { } } } - } sub GetNormalizedEAN { my ($record,$marcflavour) = @_; my (@fields,$ean); - if ($marcflavour eq 'MARC21') { - @fields = $record->field('024'); + if ($marcflavour eq 'UNIMARC') { + @fields = $record->field('073'); foreach my $field (@fields) { - my $indicator = $field->indicator(1); $ean = _normalize_match_point($field->subfield('a')); - if ($indicator == 3 and $ean ne '') { + if ($ean ne '') { return $ean; } } } - else { # assume unimarc if not marc21 - @fields = $record->field('073'); + else { # assume marc21 if not unimarc + @fields = $record->field('024'); foreach my $field (@fields) { + my $indicator = $field->indicator(1); $ean = _normalize_match_point($field->subfield('a')); - if ($ean ne '') { + if ($indicator == 3 and $ean ne '') { return $ean; } } @@ -1298,7 +1290,10 @@ sub GetNormalizedOCLCNumber { my ($record,$marcflavour) = @_; my (@fields,$oclc); - if ($marcflavour eq 'MARC21') { + if ($marcflavour eq 'UNIMARC') { + # TODO: add UNIMARC fields + } + else { # assume marc21 if not unimarc @fields = $record->field('035'); foreach my $field (@fields) { $oclc = $field->subfield('a'); @@ -1310,8 +1305,6 @@ sub GetNormalizedOCLCNumber { } } } - else { # TODO: add UNIMARC fields - } } sub _normalize_match_point { @@ -1322,13 +1315,15 @@ sub _normalize_match_point { return $normalized_match_point; } -sub _isbn_cleanup ($) { - my $isbn = Business::ISBN->new( shift ); - return undef unless $isbn; - $isbn = $isbn->as_isbn10 if $isbn->type eq 'ISBN13'; - $isbn = $isbn->as_string; - $isbn =~ s/-//g; - return $isbn; +sub _isbn_cleanup { + my $isbn = Business::ISBN->new( $_[0] ); + if ( $isbn ) { + $isbn = $isbn->as_isbn10 if $isbn->type eq 'ISBN13'; + if (defined $isbn) { + return $isbn->as_string([]); + } + } + return; } 1;