-- CRM-14113 fixed search builder error for activity type and activity status
authorPradeep Nayak <pradeep.nayak@webaccess.co.in>
Sat, 15 Mar 2014 16:12:48 +0000 (21:42 +0530)
committerPradeep Nayak <pradeep.nayak@webaccess.co.in>
Sat, 15 Mar 2014 16:15:13 +0000 (21:45 +0530)
----------------------------------------
* CRM-14113: Activity Search Builder
  http://issues.civicrm.org/jira/browse/CRM-14113

CRM/Activity/BAO/Query.php
CRM/Contact/BAO/Query.php

index ed3b9b07fc4f715a0fa455cb12e5583246a32eb9..6eeb8bfdad1521be10906cd554896605f2e47ea1 100644 (file)
@@ -188,32 +188,18 @@ class CRM_Activity_BAO_Query {
 
     switch ($name) {
       case 'activity_type_id':
+      case 'activity_type':
         $types = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE);
-
         //get the component activity types.
         $compActTypes = CRM_Core_PseudoConstant::activityType(TRUE, TRUE, FALSE, 'label', TRUE, TRUE);
-
-        $clause = array();
-        if (is_array($value)) {
-          foreach ($value as $id => $dontCare) {
-            if (array_key_exists($id, $types) && $dontCare) {
-              $clause[] = "'" . CRM_Utils_Type::escape($types[$id], 'String') . "'";
-              if (array_key_exists($id, $compActTypes)) {
-                CRM_Contact_BAO_Query::$_considerCompActivities = TRUE;
-              }
-            }
-          }
-          $activityTypes = implode(',', array_keys($value));
-        }
-        else {
-          $clause[] = "'" . CRM_Utils_Type::escape($value, 'String') . "'";
-          $activityTypes = $value;
-          if (array_key_exists($value, $compActTypes)) {
+        $activityTypeIds = self::buildWhereAndQill($query, $value, $types, $op, $grouping, array('Activity Type', 'civicrm_activity.activity_type_id'));
+        
+        foreach ($activityTypeIds as $activityTypeId) {
+          if (array_key_exists($activityTypeId, $compActTypes)) {
             CRM_Contact_BAO_Query::$_considerCompActivities = TRUE;
+            break;
           }
         }
-        $query->_where[$grouping][] = ' civicrm_activity.activity_type_id IN (' . $activityTypes . ')';
-        $query->_qill[$grouping][] = ts('Activity Type') . ' ' . implode(' ' . ts('or') . ' ', $clause);
         break;
 
       case 'activity_survey_id':
@@ -261,19 +247,8 @@ class CRM_Activity_BAO_Query {
 
       case 'activity_status':
         $status = CRM_Core_PseudoConstant::activityStatus();
-        $clause = array();
-        if (is_array($value)) {
-          foreach ($value as $k => $v) {
-            if ($k) {
-              $clause[] = "'" . CRM_Utils_Type::escape($status[$k], 'String') . "'";
-            }
-          }
-        }
-        else {
-          $clause[] = "'" . CRM_Utils_Type::escape($value, 'String') . "'";
-        }
-        $query->_where[$grouping][] = ' civicrm_activity.status_id IN (' . implode(',', array_keys($value)) . ')';
-        $query->_qill[$grouping][] = ts('Activity Status') . ' - ' . implode(' ' . ts('or') . ' ', $clause);
+        
+        $activityTypeIds = self::buildWhereAndQill($query, $value, $status, $op, $grouping, array('Activity Status', 'civicrm_activity.status_id'));
         break;
 
       case 'activity_subject':
@@ -597,5 +572,39 @@ class CRM_Activity_BAO_Query {
 
     return $properties;
   }
+  
+  static function buildWhereAndQill(&$query, $value, $pseudoconstantType, $op, $grouping, $params) {
+    $matches = $val = $clause = array();
+    
+    if (is_array($value)) {
+      foreach ($value as $k => $v) {
+        if ($k) {
+          $val[] = $k;
+        }
+      }
+      
+      if (count($val) > 0) {
+        // Overwrite $op so it works with an IN where statement.
+        $op = 'IN';
+      }
+      else {
+        // If we somehow have an empty array, just return
+        return;
+      }
+      $value = $matches[0] = $val;
+    }
+    else {
+      preg_match_all('/\d+/', $value, $matches);
+    }
+    foreach ($matches[0] as $qill) {
+      $clause[] = CRM_Utils_Array::value($qill, $pseudoconstantType);
+    }
+    
+    $query->_qill[$grouping][] = ts($params[0] . ' %1 ', array(1 => $op)) . implode(' ' . ts('or') . ' ', $clause);
+    $query->_where[$grouping][] = CRM_Contact_BAO_Query::buildClause($params[1],
+      $op, $value, "Integer"
+    );
+    return $matches[0];
+  }
 }
 
index 3b6a00d7f89a68124540d0804c106560a94fff1c..7757decbb0eba2545b1d89db325cf8a405834d6a 100644 (file)
@@ -1629,6 +1629,7 @@ class CRM_Contact_BAO_Query {
       case 'activity_subject':
       case 'test_activities':
       case 'activity_type_id':
+      case 'activity_type':
       case 'activity_survey_id':
       case 'activity_tags':
       case 'activity_taglist':