CRM-12940, towards allowing extension to alter core search
authorDeepak Srivastava <deepak.srivastava@webaccess.co.in>
Thu, 11 Jul 2013 12:37:28 +0000 (18:07 +0530)
committerDeepak Srivastava <deepak.srivastava@webaccess.co.in>
Thu, 11 Jul 2013 12:37:28 +0000 (18:07 +0530)
----------------------------------------
* CRM-12940: Allow extensions to participate in CRM_*_BAO_Query
  http://issues.civicrm.org/jira/browse/CRM-12940

CRM/Contact/BAO/Query.php
CRM/Extension/Manager.php

index 3121933d106011cb2f758ab14e2537e1ce4ff56c..cffcf2d71e3c0b7f946b507fbcefaf817f0bd93e 100644 (file)
@@ -441,6 +441,10 @@ class CRM_Contact_BAO_Query {
       // add activity fields
       $fields = CRM_Activity_BAO_Activity::exportableFields();
       $this->_fields = array_merge($this->_fields, $fields);
+
+      // add any fields supported by extensions
+      $extFields = CRM_Extension_System::singleton()->getManager()->getSearchQueryFields();
+      $this->_fields = array_merge($this->_fields, $extFields);
     }
 
     // basically do all the work once, and then reuse it
@@ -768,6 +772,8 @@ class CRM_Contact_BAO_Query {
     //fix for CRM-951
     CRM_Core_Component::alterQuery($this, 'select');
 
+    CRM_Extension_System::singleton()->getManager()->alterSearchQuery($this, 'select');
+
     if (!empty($this->_cfIDs)) {
       $this->_customQuery = new CRM_Core_BAO_CustomQuery($this->_cfIDs, TRUE);
       $this->_customQuery->query();
@@ -1626,6 +1632,8 @@ class CRM_Contact_BAO_Query {
       }
 
       CRM_Core_Component::alterQuery($this, 'where');
+
+      CRM_Extension_System::singleton()->getManager()->alterSearchQuery($this, 'where');
     }
 
     if ($this->_customQuery) {
@@ -2350,6 +2358,7 @@ class CRM_Contact_BAO_Query {
 
         default:
           $from .= CRM_Core_Component::from($name, $mode, $side);
+          $from .= CRM_Extension_System::singleton()->getManager()->buildSearchfrom($name, $mode, $side);
           continue;
       }
     }
index 57844795281cd79e0ec11deb4b48f9a008619523..f49b1dff33036a3372bfc51457fb80ca42d760b5 100644 (file)
@@ -387,6 +387,47 @@ class CRM_Extension_Manager {
     $this->mapper->refresh();
   }
 
+  public function &getSearchQueryFields() {
+    $extFields = array();
+    foreach (self::getActiveSearchQueryObjects() as $obj) {
+      $flds = $obj->getFields();
+      $extFields = array_merge($extFields, $flds);
+    }
+    return $extFields;
+  }
+
+  public function alterSearchQuery(&$query, $fnName) {
+    foreach (self::getActiveSearchQueryObjects() as $obj) {
+      $obj->$fnName($query);
+    }
+  }
+
+  public function buildSearchfrom($fieldName, $mode, $side) {
+    foreach (self::getActiveSearchQueryObjects() as $obj) {
+      $obj->from($fieldName, $mode, $side);
+    }
+  }
+
+  public function getActiveSearchQueryObjects() {
+    $queryObjects = array();
+    $extStatus = $this->getStatuses();
+    foreach ($extStatus as $key => $status) {
+      if ($status == CRM_Extension_Manager::STATUS_INSTALLED) {
+        $path = $this->mapper->keyToBasePath($key);
+        $info = $this->mapper->keyToInfo($key);
+        $classFile = $info->civix['namespace'] . DIRECTORY_SEPARATOR . 'BAO' . DIRECTORY_SEPARATOR . 'Query';
+        $queryFile = $path . DIRECTORY_SEPARATOR . "{$classFile}.php";
+        if (file_exists($queryFile)) {
+          require_once $queryFile;
+          $className = str_replace(DIRECTORY_SEPARATOR, '_', $classFile);
+          $obj  = new $className();
+          $queryObjects[] = $obj;
+        }
+      }
+    }
+    return $queryObjects;
+  }
+
   // ----------------------
 
   /**