Correcting C4::VirtualShelves::ShelfPossibleAction to handle the case where the staff...
[koha_fer] / C4 / Koha.pm
index 6c6b6e0..65822aa 100644 (file)
@@ -19,12 +19,44 @@ package C4::Koha;
 
 
 use strict;
-require Exporter;
 use C4::Context;
 use C4::Output;
-our ($VERSION,@ISA,@EXPORT);
 
-$VERSION = 3.00;
+use vars qw($VERSION @ISA @EXPORT $DEBUG);
+
+BEGIN {
+       $VERSION = 3.01;
+       require Exporter;
+       @ISA    = qw(Exporter);
+       @EXPORT = qw(
+               &slashifyDate
+               &DisplayISBN
+               &subfield_is_koha_internal_p
+               &GetPrinters &GetPrinter
+               &GetItemTypes &getitemtypeinfo
+               &GetCcodes
+               &get_itemtypeinfos_of
+               &getframeworks &getframeworkinfo
+               &getauthtypes &getauthtype
+               &getallthemes
+               &getFacets
+               &displayServers
+               &getnbpages
+               &getitemtypeimagesrcfromurl
+               &get_infos_of
+               &get_notforloan_label_of
+               &getitemtypeimagedir
+               &getitemtypeimagesrc
+               &GetAuthorisedValues
+               &GetAuthorisedValueCategories
+               &GetKohaAuthorisedValues
+               &GetAuthValCode
+               &GetManagedTagSubfields
+
+               $DEBUG
+       );
+       $DEBUG = 0;
+}
 
 =head1 NAME
 
@@ -44,38 +76,6 @@ $VERSION = 3.00;
 =over 2
 
 =cut
-
-@ISA    = qw(Exporter);
-@EXPORT = qw(
-  &slashifyDate
-  &DisplayISBN
-  &subfield_is_koha_internal_p
-  &GetPrinters &GetPrinter
-  &GetItemTypes &getitemtypeinfo
-  &GetCcodes
-  &get_itemtypeinfos_of
-  &getframeworks &getframeworkinfo
-  &getauthtypes &getauthtype
-  &getallthemes
-  &getFacets
-  &displayServers
-  &getnbpages
-  &getitemtypeimagesrcfromurl
-  &get_infos_of
-  &get_notforloan_label_of
-  &getitemtypeimagedir
-  &getitemtypeimagesrc
-  &GetAuthorisedValues
-  &FixEncoding
-  &GetKohaAuthorisedValues
-  &GetAuthValCode
-  &GetManagedTagSubfields
-
-  $DEBUG
-  );
-
-my $DEBUG = 0;
-
 =head2 slashifyDate
 
   $slash_date = &slashifyDate($dash_date);
@@ -455,16 +455,155 @@ sub getitemtypeimagesrcfromurl {
     return $imageurl;
 }
 
+=head2 getitemtypeimagedir
+
+=over
+
+=item 4
+
+  my $directory = getitemtypeimagedir( 'opac' );
+
+pass in 'opac' or 'intranet'. Defaults to 'opac'.
+
+returns the full path to the appropriate directory containing images.
+
+=back
+
+=cut
+
 sub getitemtypeimagedir {
-    return C4::Context->opachtdocs . '/'
-      . C4::Context->preference('template')
-      . '/itemtypeimg';
+       my $src = shift;
+        $src = 'opac' unless defined $src;
+
+       if ($src eq 'intranet') {
+               return C4::Context->config('intrahtdocs') . '/' .C4::Context->preference('template') . '/img/itemtypeimg';
+       }
+       else {
+               return C4::Context->config('opachtdocs') . '/' . C4::Context->preference('template') . '/itemtypeimg';
+       }
 }
 
 sub getitemtypeimagesrc {
-    return '/opac-tmpl' . '/'
-      . C4::Context->preference('template')
-      . '/itemtypeimg';
+        my $src = shift;
+       if ($src eq 'intranet') {
+               return '/intranet-tmpl' . '/' . C4::Context->preference('template') . '/img/itemtypeimg';
+       } 
+       else {
+               return '/opac-tmpl' . '/' . C4::Context->preference('template') . '/itemtypeimg';
+       }
+}
+
+=head3 _getImagesFromDirectory
+
+  Find all of the image files in a directory in the filesystem
+
+  parameters:
+    a directory name
+
+  returns: a list of images in that directory.
+
+  Notes: this does not traverse into subdirectories. See
+      _getSubdirectoryNames for help with that.
+    Images are assumed to be files with .gif or .png file extensions.
+    The image names returned do not have the directory name on them.
+
+=cut
+
+sub _getImagesFromDirectory {
+    my $directoryname = shift;
+    return unless defined $directoryname;
+    return unless -d $directoryname;
+
+    if ( opendir ( my $dh, $directoryname ) ) {
+        my @images = grep { /\.(gif|png)$/i } readdir( $dh );
+        closedir $dh;
+        return @images;
+    } else {
+        warn "unable to opendir $directoryname: $!";
+        return;
+    }
+}
+
+=head3 _getSubdirectoryNames
+
+  Find all of the directories in a directory in the filesystem
+
+  parameters:
+    a directory name
+
+  returns: a list of subdirectories in that directory.
+
+  Notes: this does not traverse into subdirectories. Only the first
+      level of subdirectories are returned.
+    The directory names returned don't have the parent directory name
+      on them.
+
+=cut
+
+sub _getSubdirectoryNames {
+    my $directoryname = shift;
+    return unless defined $directoryname;
+    return unless -d $directoryname;
+
+    if ( opendir ( my $dh, $directoryname ) ) {
+        my @directories = grep { -d File::Spec->catfile( $directoryname, $_ ) && ! ( /^\./ ) } readdir( $dh );
+        closedir $dh;
+        return @directories;
+    } else {
+        warn "unable to opendir $directoryname: $!";
+        return;
+    }
+}
+
+=head3 getImageSets
+
+  returns: a listref of hashrefs. Each hash represents another collection of images.
+           { imagesetname => 'npl', # the name of the image set (npl is the original one)
+             images => listref of image hashrefs
+           }
+
+    each image is represented by a hashref like this:
+      { KohaImage     => 'npl/image.gif',
+        StaffImageUrl => '/intranet-tmpl/prog/img/itemtypeimg/npl/image.gif',
+        OpacImageURL  => '/opac-tmpl/prog/itemtypeimg/npl/image.gif'
+        checked       => 0 or 1: was this the image passed to this method?
+                         Note: I'd like to remove this somehow.
+      }
+
+=cut
+
+sub getImageSets {
+    my %params = @_;
+    my $checked = $params{'checked'} || '';
+
+    my $paths = { staff => { filesystem => getitemtypeimagedir('intranet'),
+                             url        => getitemtypeimagesrc('intranet'),
+                        },
+                  opac => { filesystem => getitemtypeimagedir('opac'),
+                             url       => getitemtypeimagesrc('opac'),
+                        }
+                  };
+
+    my @imagesets = (); # list of hasrefs of image set data to pass to template
+    my @subdirectories = _getSubdirectoryNames( $paths->{'staff'}{'filesystem'} );
+
+    foreach my $imagesubdir ( @subdirectories ) {
+        my @imagelist     = (); # hashrefs of image info
+        my @imagenames = _getImagesFromDirectory( File::Spec->catfile( $paths->{'staff'}{'filesystem'}, $imagesubdir ) );
+        foreach my $thisimage ( @imagenames ) {
+            push( @imagelist,
+                  { KohaImage     => "$imagesubdir/$thisimage",
+                    StaffImageUrl => join( '/', $paths->{'staff'}{'url'}, $imagesubdir, $thisimage ),
+                    OpacImageUrl  => join( '/', $paths->{'opac'}{'url'}, $imagesubdir, $thisimage ),
+                    checked       => "$imagesubdir/$thisimage" eq $checked ? 1 : 0,
+               }
+             );
+        }
+        push @imagesets, { imagesetname => $imagesubdir,
+                           images       => \@imagelist };
+        
+    }
+    return \@imagesets;
 }
 
 =head2 GetPrinters
@@ -581,14 +720,18 @@ sub getFacets {
                 tags        => ['225'],
                 subfield    => 'a',
             },
-            {
+            ];
+
+            my $library_facet;
+
+            $library_facet = {
                 link_value  => 'branch',
                 label_value => 'Libraries',
                 tags        => [ '995', ],
                 subfield    => 'b',
                 expanded    => '1',
-            },
-        ];
+            };
+            push @$facets, $library_facet unless C4::Context->preference("singleBranchMode");
     }
     else {
         $facets = [
@@ -629,14 +772,16 @@ sub getFacets {
                 tags        => [ '440', '490', ],
                 subfield    => 'a',
             },
-            {
+            ];
+            my $library_facet;
+            $library_facet = {
                 link_value  => 'branch',
                 label_value => 'Libraries',
                 tags        => [ '952', ],
                 subfield    => 'b',
                 expanded    => '1',
-            },
-        ];
+            };
+            push @$facets, $library_facet unless C4::Context->preference("singleBranchMode");
     }
     return $facets;
 }
@@ -766,6 +911,7 @@ sub displayServers {
             value => $data->{host} . ":"
               . $data->{port} . "/"
               . $data->{database},
+            encoding   => ($data->{encoding}?$data->{encoding}:"iso-5426"),
             checked    => "checked",
             icon       => $data->{icon},
             zed        => $data->{type} eq 'zed',
@@ -837,79 +983,51 @@ sub GetAuthorisedValues {
     return \@results; #$data;
 }
 
-=item fixEncoding
+=head2 GetAuthorisedValueCategories
 
-  $marcrecord = &fixEncoding($marcblob);
+$auth_categories = GetAuthorisedValueCategories();
 
-Returns a well encoded marcrecord.
+Return an arrayref of all of the available authorised
+value categories.
 
 =cut
-sub FixEncoding {
-  my $marc=shift;
-  my $record = MARC::Record->new_from_usmarc($marc);
-  if (C4::Context->preference("MARCFLAVOUR") eq "UNIMARC"){
-    use Encode::Guess;
-    my $targetcharset="utf8" if (C4::Context->preference("TemplateEncoding") eq "utf-8");
-    $targetcharset="latin1" if (C4::Context->preference("TemplateEncoding") eq "iso-8859-1");
-    my $decoder = guess_encoding($marc, qw/utf8 latin1/);
-#     die $decoder unless ref($decoder);
-    if (ref($decoder)) {
-        my $newRecord=MARC::Record->new();
-        foreach my $field ($record->fields()){
-        if ($field->tag()<'010'){
-            $newRecord->insert_grouped_field($field);
-        } else {
-            my $newField;
-            my $createdfield=0;
-            foreach my $subfield ($field->subfields()){
-            if ($createdfield){
-                if (($newField->tag eq '100')) {
-                    substr($subfield->[1],26,2,"0103") if ($targetcharset eq "latin1");
-                    substr($subfield->[1],26,4,"5050") if ($targetcharset eq "utf8");
-                }
-                map {C4::Biblio::char_decode($_,"UNIMARC")} @$subfield;
-                $newField->add_subfields($subfield->[0]=>$subfield->[1]);
-            } else {
-                map {C4::Biblio::char_decode($_,"UNIMARC")} @$subfield;
-                $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>$subfield->[1]);
-                $createdfield=1;
-            }
-            }
-            $newRecord->insert_grouped_field($newField);
-        }
-        }
-    #     warn $newRecord->as_formatted(); 
-        return $newRecord;
-    } else {
-        return $record;
+
+sub GetAuthorisedValueCategories {
+    my $dbh = C4::Context->dbh;
+    my $sth = $dbh->prepare("SELECT DISTINCT category FROM authorised_values ORDER BY category");
+    $sth->execute;
+    my @results;
+    while (my $category = $sth->fetchrow_array) {
+        push @results, $category;
     }
-  } else {
-    return $record;
-  }
+    return \@results;
 }
 
 =head2 GetKohaAuthorisedValues
        
-       Takes $dbh , $kohafield as parameters.
-       returns hashref of authvalCode => liblibrarian
-       or undef if no authvals defined for kohafield.
+       Takes $kohafield, $fwcode as parameters.
+       Returns hashref of Code => description
+       Returns undef 
+         if no authorised value category is defined for the kohafield.
 
 =cut
 
 sub GetKohaAuthorisedValues {
-  my ($kohafield,$fwcode) = @_;
+  my ($kohafield,$fwcode,$codedvalue) = @_;
   $fwcode='' unless $fwcode;
   my %values;
   my $dbh = C4::Context->dbh;
   my $avcode = GetAuthValCode($kohafield,$fwcode);
   if ($avcode) {  
-    my $sth = $dbh->prepare("select authorised_value, lib from authorised_values where category=? ");
-    $sth->execute($avcode);
+       my $sth = $dbh->prepare("select authorised_value, lib from authorised_values where category=? ");
+       $sth->execute($avcode);
        while ( my ($val, $lib) = $sth->fetchrow_array ) { 
                $values{$val}= $lib;
        }
+       return \%values;
+  } else {
+       return undef;
   }
-  return \%values;
 }
 
 =head2 GetManagedTagSubfields
@@ -955,6 +1073,30 @@ ORDER BY marc_subfield_structure.tagfield, tagsubfield|);
   return $data;
 }
 
+=head2 display_marc_indicators
+
+=over 4
+
+# field is a MARC::Field object
+my $display_form = C4::Koha::display_marc_indicators($field);
+
+=back
+
+Generate a display form of the indicators of a variable
+MARC field, replacing any blanks with '#'.
+
+=cut
+
+sub display_marc_indicators {
+    my $field = shift;
+    my $indicators = '';
+    if ($field->tag() >= 10) {
+        $indicators = $field->indicator(1) . $field->indicator(2);
+        $indicators =~ s/ /#/g;
+    }
+    return $indicators;
+}
+
 1;
 
 __END__