Browse Source

Some custom views handlers re-use fields, changes were made to ensure tripal_views_handler_field_aggregate works in these cases

laceysanderson 12 years ago
parent
commit
6d91e0e13c

+ 13 - 7
tripal_views/views/handlers/chado_wrapper_functions.inc

@@ -18,12 +18,15 @@ function chado_wrapper_split_array_agg_results($handler, &$values) {
 
   if ($handler->aggregated) {
     foreach ($values as $k => $v) {
-
-      if (preg_match('/^{(.*)}$/', $v->{$handler->field_alias}, $matches)) {
-        $values[$k]->{$handler->field_alias} = str_getcsv($matches[1]);
-      }
-      else {
-        $values[$k]->{$handler->field_alias} = array();
+      // Some custom handlers re-use the same field
+      // This ensures that an already split value doesn't get re-split
+      if (!is_array($v->{$handler->field_alias})) {
+        if (preg_match('/^{(.*)}$/', $v->{$handler->field_alias}, $matches)) {
+          $values[$k]->{$handler->field_alias} = str_getcsv($matches[1]);
+        }
+        else {
+          $values[$k]->{$handler->field_alias} = array();
+        }
       }
     }
   }
@@ -71,7 +74,10 @@ function chado_wrapper_is_aggregated_by_result($handler, $values) {
     $i++;
   }
 
-  if (preg_match('/^{.*}$/', $values[$i]->{$handler->field_alias})) {
+  if (is_array($values[$i]->{$handler->field_alias})) {
+    $aggregated = TRUE;
+  }
+  elseif (preg_match('/^{.*}$/', $values[$i]->{$handler->field_alias})) {
     $aggregated = TRUE;
   }
 

+ 22 - 21
tripal_views/views/handlers/tripal_views_handler_field_aggregate.inc

@@ -97,34 +97,35 @@ class tripal_views_handler_field_aggregate extends chado_views_handler_field {
   function split_aggregated_result_with_keys(&$value) {
 
     foreach ($value as $k => $v) {
-
-      if (preg_match('/.*::.*/',$v)) {
-        $subparts = explode(',', $v);
-        $token_values = array();
-        foreach ($subparts as $ssk => $ssv) {
-          if (preg_match('/(.*)::(.*)/', $ssv, $matches)) {
-            $values[ $matches[1] ] = $matches[2];
-            $tokens[ '[' . $this->options['id'] . '-' . $matches[1] . ']' ] = $matches[2];
+      if (!is_array($v)) {
+        if (preg_match('/.*::.*/',$v)) {
+          $subparts = explode(',', $v);
+          $token_values = array();
+          foreach ($subparts as $ssk => $ssv) {
+            if (preg_match('/(.*)::(.*)/', $ssv, $matches)) {
+              $values[ $matches[1] ] = $matches[2];
+              $tokens[ '[' . $this->options['id'] . '-' . $matches[1] . ']' ] = $matches[2];
+            }
           }
-        }
 
-        if ($this->options['format']['format_string']) {
-          $value[$k] = str_replace(array_keys($tokens), $tokens, $this->options['format']['format_string']);
-        }
-        else {
-          $value[$k] = $values;
-        }
-      }
-      else {
-        if ($this->options['format']['format_string']) {
-          $value[$k] = '';
+          if ($this->options['format']['format_string']) {
+            $value[$k] = str_replace(array_keys($tokens), $tokens, $this->options['format']['format_string']);
+          }
+          else {
+            $value[$k] = $values;
+          }
         }
         else {
-          $value[$k] = array();
+          if ($this->options['format']['format_string']) {
+            $value[$k] = '';
+          }
+          else {
+            $value[$k] = array();
+          }
         }
+        $value = array_filter($value);
       }
     }
-    $value = array_filter($value);
   }
 
 }