Details
-
Type: Bug
-
Status: Done/Fixed
-
Priority: Minor
-
Resolution: Won't Fix
-
Affects Version/s: 3.4.0, 3.4.1, 4.0.0, 4.0.1
-
Fix Version/s: Unscheduled
-
Component/s: Core CiviCRM
-
Labels:None
Description
Not sure why the db would be doing this, but here's what happens:
We have a profile listing of churches: http://www.ecww.org/civicrm/profile?force=1&gid=9&reset=1
If you sort by City ASC, you'll get 3 churches in Vancouver at the bottom of page 2, and one church in Vancouver at the top of page 3.
Paging between 2 and 3 produces a different set of Vancouver churches on each page refresh.
My fix is to explicitly sort on all additional columns in sequence after the primary sort column. I suppose there could be a performance hit if the primary column or subsequent columns are too homogeneous and there's lots of data. Maybe there's a better way to do it with a single row number column or an id instead.
Change to CRM_Utils_Sort
function orderBy( ) {
if ( ! CRM_Utils_Array::value( $this->_currentSortID, $this->_vars ) )
$orderBy = array();
$direction = ' asc';
if ( $this->_vars[$this->_currentSortID]['direction'] == self::ASCENDING ||
$this->_vars[$this->_currentSortID]['direction'] == self::DONTCARE )
else
{ $direction = ' desc'; } //primary sort column
$this->vars[$this->_currentSortID]['name'] = str_replace( ' ', '', $this->_vars[$this->_currentSortID]['name'] );
$orderBy []= $this->_vars[$this->_currentSortID]['name'];
//secondary sort columns; required for consistent results
foreach($this->_vars as $id => $sorter) {
if ( $this->_currentSortID != $id )
}
return implode(', ',$orderBy) . $direction;
}