Bug 12721 - Prevent software error if incorrect fieldnames given in sypref Statistics...
authorMarc Véron <veron@veron.ch>
Sun, 18 Oct 2015 14:28:52 +0000 (16:28 +0200)
committerChris Cormack <chrisc@catalyst.net.nz>
Sun, 19 Jun 2016 21:22:56 +0000 (09:22 +1200)
To reproduce issue:
See comment #1

To test:
- Apply patch
- Leave syspref StatisticsFields empty
- Display statistics for an author

  => Result: Table displays Shelving location, Collection code, Item type
           (as before)

- Change syspref to any combination of location|itype|ccode
  => Result: Table displays columns as appropriate

- Change syspref to some garbage
  => Result: Same as with empty syspref (was crashing without patch)

- Change syspref to valid combination with trailing |
  => Result: Table displays columns as appropriate (was crashing
     without patch)

- Change syspref to a combination of valid and invalid fields
  (location|blah|ccode)
  => Result: Table displays column of valid fields only (was crashing
     without patch)

Signed-off-by: Aleisha <aleishaamohia@hotmail.com>

Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de>

Signed-off-by: Brendan Gallagher <brendan@bywatersolutions.com>
(cherry picked from commit 5fc93bce9b786797724539bea1a1689e959078e6)
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>
(cherry picked from commit 36392d8a0cc07c3d5de51ec53c529d3a7d777508)
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>

C4/Members/Statistics.pm

index 2dffd30..c491819 100644 (file)
@@ -43,13 +43,34 @@ BEGIN {
 
 our $fields = get_fields();
 
+
+=head2 get_fields
+  Get fields form syspref 'StatisticsFields'
+  Returns list of valid fields, defaults to 'location|itype|ccode'
+  if syspref is empty or does not contain valid fields
+=cut
+
+
 sub get_fields {
-    my $r = C4::Context->preference('StatisticsFields') || 'location|itype|ccode';
-    unless ( $r =~ m/^(\w|\d|\||-)+$/) {
-        warn "Members/Statistics : Bad value for syspref StatisticsFields" if $debug;
-        $r = 'location|itype|ccode';
+
+    my $syspref = C4::Context->preference('StatisticsFields');
+    my $ret;
+
+    if ( $syspref ) {
+        my @ret;
+        my @spfields = split ('\|', $syspref);
+        my $dbh=C4::Context->dbh;
+        my $sth = $dbh->prepare('SHOW COLUMNS FROM items');
+        $sth->execute;
+        my $dbfields =  $sth->fetchall_hashref('Field');
+        $sth->finish();
+
+        foreach my $fn ( @spfields ) {
+            push ( @ret, $fn ) if ( $dbfields->{ $fn } );
+        }
+        $ret = join( '|', @ret);
     }
-    return $r;
+    return $ret || 'location|itype|ccode';
 }
 
 =head2 construct_query