Correcting C4::VirtualShelves::ShelfPossibleAction to handle the case where the staff...
[koha_fer] / C4 / Koha.pm
index 8db25ff..65822aa 100644 (file)
@@ -21,6 +21,7 @@ package C4::Koha;
 use strict;
 use C4::Context;
 use C4::Output;
+
 use vars qw($VERSION @ISA @EXPORT $DEBUG);
 
 BEGIN {
@@ -47,7 +48,7 @@ BEGIN {
                &getitemtypeimagedir
                &getitemtypeimagesrc
                &GetAuthorisedValues
-               &FixEncoding
+               &GetAuthorisedValueCategories
                &GetKohaAuthorisedValues
                &GetAuthValCode
                &GetManagedTagSubfields
@@ -74,6 +75,7 @@ BEGIN {
 
 =over 2
 
+=cut
 =head2 slashifyDate
 
   $slash_date = &slashifyDate($dash_date);
@@ -453,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
@@ -579,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 = [
@@ -627,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;
 }
@@ -764,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',
@@ -835,102 +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 $encoding=shift;
-  my $record = MARC::Record->new_from_usmarc($marc);
-  if (C4::Context->preference("marcflavour") eq "UNIMARC"){
-    my $targetcharset="utf8";
-    if ($encoding && $targetcharset ne $encoding){   
-        my $newRecord=MARC::Record->new();
-        if ($encoding!~/5426/){  
-            use Text::Iconv;
-            my $decoder = Text::Iconv->new($encoding,$targetcharset);
-            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 {$decoder->convert($_)} @$subfield;
-                        $newField->add_subfields($subfield->[0]=>$subfield->[1]);
-                    } else {
-                        map {$decoder->convert($_)} @$subfield;
-                        $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>$subfield->[1]);
-                        $createdfield=1;
-                    }
-                    }
-                    $newRecord->insert_grouped_field($newField);
-                }
-            }        
-        }elsif ($encoding=~/5426/){
-            use MARC::Charset;    
-            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,4,"5050");
-                        }            
-                        $newField->add_subfields($subfield->[0]=>MARC::Charset::marc8_to_utf8($subfield->[1]));
-                    } else {
-                        $newField=MARC::Field->new($field->tag(),$field->indicator(1),$field->indicator(2),$subfield->[0]=>MARC::Charset::marc8_to_utf8($subfield->[1]));
-                        $createdfield=1;
-                    }
-                    }
-                    $newRecord->insert_grouped_field($newField);
-                }
-            }        
-        }
-    #     warn $newRecord->as_formatted(); 
-        return $newRecord;
-     }
-     return $record;  
-  }
-  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;
+    }
+    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
@@ -976,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__