<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.3 |
+ | CiviCRM version 4.4 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2013 |
+--------------------------------------------------------------------+
$params['buttonBottom'] = 'PagerBottomButton';
}
//end of function
- function &getColHeads($action = NULL, $output = NULL) {
+ function &getColHeads($action = NULL, $output = NULL) {
$colHeads = self::_getColumnHeaders();
-
$colHeads[] = array('desc' => ts('Actions'), 'name' => ts('Action'));
return $colHeads;
}
* @access public
*/
function getTotalCount($action) {
- return $this->_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;
}
/**
// 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();
$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',
$seenIDs = array();
while ($result->fetch()) {
$row = array();
+ $this->_query->convertToPseudoNames($result);
// the columns we are interested in
foreach ($names as $property) {
$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']},
'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 &&
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
}
}
- $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) {
'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 &&
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
}
}
- 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
);
$sql = str_replace($replaceSQL, $insertSQL, $sql);
-
CRM_Core_Error::ignoreException();
$result = CRM_Core_DAO::executeQuery($sql);
CRM_Core_Error::setCallback();
'address_options', TRUE, NULL, TRUE
);
- self::$_columnHeaders = array('contact_type' => array('desc' => ts('Contact Type')),
+ self::$_columnHeaders = array(
+ 'contact_type' => array('desc' => ts('Contact Type')),
'sort_name' => array(
'name' => ts('Name'),
'sort' => 'sort_name',
),
);
- $defaultAddress = array('street_address' => array('name' => ts('Address')),
- 'city' => array('name' => ts('City'),
+ $defaultAddress = array(
+ 'street_address' => array('name' => ts('Address')),
+ 'city' => array(
+ 'name' => ts('City'),
'sort' => 'city',
'direction' => CRM_Utils_Sort::DONTCARE,
),
- 'state_province' => array('name' => ts('State'),
+ 'state_province' => array(
+ 'name' => ts('State'),
'sort' => 'state_province',
'direction' => CRM_Utils_Sort::DONTCARE,
),
- 'postal_code' => array('name' => ts('Postal'),
+ 'postal_code' => array(
+ 'name' => ts('Postal'),
'sort' => 'postal_code',
'direction' => CRM_Utils_Sort::DONTCARE,
),
- 'country' => array('name' => ts('Country'),
+ 'country' => array(
+ 'name' => ts('Country'),
'sort' => 'country',
'direction' => CRM_Utils_Sort::DONTCARE,
),
}
}
- self::$_columnHeaders['email'] = array('name' => ts('Email'),
+ self::$_columnHeaders['email'] = array(
+ 'name' => ts('Email'),
'sort' => 'email',
'direction' => CRM_Utils_Sort::DONTCARE,
);
$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 {