X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FContact%2FSelector.php;h=f3523ffe92f274c56801d5e2fee429ec09efd18f;hb=87dab4a469c6829c40fe444cfbe469ce9254ed1f;hp=14261fe63c9426d59cb2d2daf50f9118fc83fe27;hpb=fd18baa6c6fb5813a429c8cc520e97833b0b4747;p=civicrm-core.git diff --git a/CRM/Contact/Selector.php b/CRM/Contact/Selector.php index 14261fe63c..f3523ffe92 100644 --- a/CRM/Contact/Selector.php +++ b/CRM/Contact/Selector.php @@ -1,7 +1,7 @@ _query->searchQuery(0, 0, NULL, TRUE); + // Use count from cache during paging/sorting + if (!empty($_GET['crmPID']) || !empty($_GET['crmSID'])) { + $count = CRM_Core_BAO_Cache::getItem('Search Results Count', $this->_key); + } + if (empty($count)) { + $count = $this->_query->searchQuery(0, 0, NULL, TRUE); + CRM_Core_BAO_Cache::setItem($count, 'Search Results Count', $this->_key); + } + return $count; } /** @@ -498,7 +506,13 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se // note the formvalues were given by CRM_Contact_Form_Search to us // and contain the search criteria (parameters) // note that the default action is basic - $result = $this->_query->searchQuery($offset, $rowCount, $sort, FALSE, $includeContactIds); + if ($rowCount) { + $cacheKey = $this->buildPrevNextCache($sort); + $result = $this->_query->getCachedContacts($cacheKey, $offset, $rowCount, $includeContactIds); + } + else { + $result = $this->_query->searchQuery($offset, $rowCount, $sort, FALSE, $includeContactIds); + } // process the result of the query $rows = array(); @@ -575,34 +589,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se $groupID = CRM_Utils_Array::key('1', $this->_formValues['group']); $pseudoconstants = array(); - if (!empty($this->_fields)) { - // get all the pseudoconstant values - foreach ($this->_fields as $name => $values) { - if (isset($this->_fields[$name]['pseudoconstant'])) { - $pseudoconstants[$name] = - array( - 'dbName' => $this->_fields[$name]['name'], - 'values' => CRM_Core_PseudoConstant::get('CRM_Contact_DAO_Contact', $name), - ); - } - } - } - // for CRM-3157 purposes - if (in_array('country', $names)) { - $pseudoconstants['country'] = array( - 'dbName' => 'country_id', - 'values' => CRM_Core_PseudoConstant::country() - ); - } - - if (in_array('state_province', $names)) { - $pseudoconstants['state_province'] = array( - 'dbName' => 'state_province_id', - 'values' => CRM_Core_PseudoConstant::stateProvince() - ); - } - if (in_array('world_region', $names)) { $pseudoconstants['world_region'] = array( 'dbName' => 'world_region_id', @@ -613,6 +600,7 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se $seenIDs = array(); while ($result->fetch()) { $row = array(); + $this->_query->convertToPseudoNames($result); // the columns we are interested in foreach ($names as $property) { @@ -652,6 +640,9 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se $greeting = $property . '_display'; $row[$property] = $result->$greeting; } + elseif ($property == 'state_province') { + $row[$property] = $result->state_province_name; + } elseif (isset($pseudoconstants[$property])) { $row[$property] = CRM_Utils_Array::value( $result->{$pseudoconstants[$property]['dbName']}, @@ -740,7 +731,16 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se 'title' => ts('Permanently Delete Contact'), ); } - $row['action'] = CRM_Core_Action::formLink($links, NULL, array('id' => $result->contact_id)); + $row['action'] = CRM_Core_Action::formLink( + $links, + NULL, + array('id' => $result->contact_id), + ts('more'), + FALSE, + 'contact.selector.row', + 'Contact', + $result->contact_id + ); } elseif ((is_numeric(CRM_Utils_Array::value('geo_code_1', $row))) || ($config->mapGeoCoding && @@ -748,10 +748,28 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se CRM_Utils_Array::value('state_province', $row) ) ) { - $row['action'] = CRM_Core_Action::formLink($links, $mask, array('id' => $result->contact_id)); + $row['action'] = CRM_Core_Action::formLink( + $links, + $mask, + array('id' => $result->contact_id), + ts('more'), + FALSE, + 'contact.selector.row', + 'Contact', + $result->contact_id + ); } else { - $row['action'] = CRM_Core_Action::formLink($links, $mapMask, array('id' => $result->contact_id)); + $row['action'] = CRM_Core_Action::formLink( + $links, + $mapMask, + array('id' => $result->contact_id), + ts('more'), + FALSE, + 'contact.selector.row', + 'Contact', + $result->contact_id + ); } // allow components to add more actions @@ -780,35 +798,38 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se } } - $this->buildPrevNextCache($sort); - return $rows; } function buildPrevNextCache($sort) { - $cacheKey = CRM_Utils_Array::value('qfKey', $this->_formValues); + $cacheKey = 'civicrm search ' . $this->_key; + + // Get current page requested + $pageNum = CRM_Utils_Request::retrieve('crmPID', 'Integer', CRM_Core_DAO::$_nullObject); + // When starting from scratch, clear any old cache + if (!$pageNum) { + CRM_Core_BAO_PrevNextCache::deleteItem(NULL, $cacheKey, 'civicrm_contact'); + $pageNum = 1; + } - //for prev/next pagination - $crmPID = CRM_Utils_Request::retrieve('crmPID', 'Integer', CRM_Core_DAO::$_nullObject); + $pageSize = CRM_Utils_Request::retrieve('crmRowCount', 'Integer', CRM_Core_DAO::$_nullObject, FALSE, 50); + $firstRecord = ($pageNum - 1) * $pageSize; //for alphabetic pagination selection save $sortByCharacter = CRM_Utils_Request::retrieve('sortByCharacter', 'String', CRM_Core_DAO::$_nullObject); //for text field pagination selection save - $countRow = CRM_Core_BAO_PrevNextCache::getCount("%civicrm search {$cacheKey}%", NULL, "entity_table = 'civicrm_contact'", "LIKE"); + $countRow = CRM_Core_BAO_PrevNextCache::getCount($cacheKey, NULL, "entity_table = 'civicrm_contact'"); - if ((!$crmPID || $countRow == 0) && !$sortByCharacter) { - $this->fillupPrevNextCache($sort); + // $sortByCharacter triggers a refresh in the prevNext cache + if ($sortByCharacter && $sortByCharacter != 'all') { + $cacheKey .= "_alphabet"; + $this->fillupPrevNextCache($sort, $cacheKey); } - elseif ($sortByCharacter) { - $cacheKeyCharacter = "civicrm search {$cacheKey}_alphabet"; - if ($sortByCharacter == 'all') { - //delete the alphabet key corresponding records in prevnext_cache - CRM_Core_BAO_PrevNextCache::deleteItem(NULL, $cacheKeyCharacter, 'civicrm_contact'); - $cacheKeyCharacter = NULL; - } - $this->fillupPrevNextCache($sort, $cacheKeyCharacter); + elseif ($firstRecord >= $countRow) { + $this->fillupPrevNextCache($sort, $cacheKey, $countRow, $firstRecord + 500); } + return $cacheKey; } function addActions(&$rows) { @@ -854,7 +875,16 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se 'title' => ts('Permanently Delete Contact'), ); } - $row['action'] = CRM_Core_Action::formLink($links, NULL, array('id' => $row['contact_id'])); + $row['action'] = CRM_Core_Action::formLink( + $links, + null, + array('id' => $row['contact_id']), + ts('more'), + FALSE, + 'contact.selector.actions', + 'Contact', + $row['contact_id'] + ); } elseif ((is_numeric(CRM_Utils_Array::value('geo_code_1', $row))) || ($config->mapGeoCoding && @@ -862,10 +892,28 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se CRM_Utils_Array::value('state_province', $row) ) ) { - $row['action'] = CRM_Core_Action::formLink($links, $mask, array('id' => $row['contact_id'])); + $row['action'] = CRM_Core_Action::formLink( + $links, + $mask, + array('id' => $row['contact_id']), + ts('more'), + FALSE, + 'contact.selector.actions', + 'Contact', + $row['contact_id'] + ); } else { - $row['action'] = CRM_Core_Action::formLink($links, $mapMask, array('id' => $row['contact_id'])); + $row['action'] = CRM_Core_Action::formLink( + $links, + $mapMask, + array('id' => $row['contact_id']), + ts('more'), + FALSE, + 'contact.selector.actions', + 'Contact', + $row['contact_id'] + ); } // allow components to add more actions @@ -885,21 +933,23 @@ class CRM_Contact_Selector extends CRM_Core_Selector_Base implements CRM_Core_Se } } - function fillupPrevNextCache($sort, $cacheKey = NULL) { - if (!$cacheKey) { - $cacheKey = "civicrm search {$this->_key}"; - } - - CRM_Core_BAO_PrevNextCache::deleteItem(NULL, $cacheKey, 'civicrm_contact'); + /** + * @param object $sort + * @param string $cacheKey + * @param int $start + * @param int $end + */ + function fillupPrevNextCache($sort, $cacheKey, $start = 0, $end = 500) { - // lets fill up the prev next cache here, so view can scroll thru + // For custom searches, use the contactIDs method if (is_a($this, 'CRM_Contact_Selector_Custom')) { - $sql = $this->_search->contactIDs(0, 0, $sort, TRUE); + $sql = $this->_search->contactIDs($start, $end, $sort, TRUE); $replaceSQL = "SELECT contact_a.id as contact_id"; } + // For core searches use the searchQuery method else { $sql = $this->_query->searchQuery( - 0, 0, $sort, + $start, $end, $sort, FALSE, FALSE, FALSE, TRUE, TRUE, NULL ); @@ -922,7 +972,6 @@ SELECT 'civicrm_contact', contact_a.id, contact_a.id, '$cacheKey', contact_a.dis $sql = str_replace($replaceSQL, $insertSQL, $sql); - CRM_Core_Error::ignoreException(); $result = CRM_Core_DAO::executeQuery($sql); CRM_Core_Error::setCallback(); @@ -1073,9 +1122,16 @@ SELECT 'civicrm_contact', contact_a.id, contact_a.id, '$cacheKey', contact_a.dis $properties = array(); foreach ($returnProperties as $name => $value) { if ($name != 'location') { + // special handling for group and tag if (in_array($name, array('group', 'tag'))) { $name = "{$name}s"; } + + // special handling for notes + if (in_array($name, array('note', 'note_subject', 'note_body'))) { + $name = "notes"; + } + $properties[] = $name; } else {