From f2a9b25cfb75c71052d95bba785862207a4c22e7 Mon Sep 17 00:00:00 2001 From: Deepak Srivastava Date: Thu, 11 Jul 2013 18:07:28 +0530 Subject: [PATCH] CRM-12940, towards allowing extension to alter core search ---------------------------------------- * CRM-12940: Allow extensions to participate in CRM_*_BAO_Query http://issues.civicrm.org/jira/browse/CRM-12940 --- CRM/Contact/BAO/Query.php | 9 +++++++++ CRM/Extension/Manager.php | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/CRM/Contact/BAO/Query.php b/CRM/Contact/BAO/Query.php index 3121933d10..cffcf2d71e 100644 --- a/CRM/Contact/BAO/Query.php +++ b/CRM/Contact/BAO/Query.php @@ -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; } } diff --git a/CRM/Extension/Manager.php b/CRM/Extension/Manager.php index 5784479528..f49b1dff33 100644 --- a/CRM/Extension/Manager.php +++ b/CRM/Extension/Manager.php @@ -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; + } + // ---------------------- /** -- 2.25.1