Support for arbitrary number of sort columns.

There is an active hard limit in there which does not allow more than two,
but changing this is as simple as setting $maxsortkeys to something else.
This commit is contained in:
defacer
2005-03-10 16:38:01 +00:00
parent 550999735f
commit 73e4f58953
+42 -19
View File
@@ -18,9 +18,10 @@ class flexible_table {
var $use_pages = false;
var $use_initials = false;
var $pagesize = 30;
var $currpage = 0;
var $totalrows = 0;
var $maxsortkeys = 2;
var $pagesize = 30;
var $currpage = 0;
var $totalrows = 0;
function flexible_table($uniqueid) {
$this->uniqueid = $uniqueid;
@@ -141,8 +142,7 @@ class flexible_table {
$SESSION->flextable = new stdClass;
$SESSION->flextable->uniqueid = $this->uniqueid;
$SESSION->flextable->collapse = array();
$SESSION->flextable->sortby = '';
$SESSION->flextable->sortdir = '';
$SESSION->flextable->sortby = array();
$SESSION->flextable->i_first = '';
$SESSION->flextable->i_last = '';
}
@@ -156,9 +156,8 @@ class flexible_table {
else if(!empty($_GET['thide']) && isset($this->columns[$_GET['thide']])) {
// Hide this column
$this->sess->collapse[$_GET['thide']] = true;
if($this->sess->sortby == $_GET['thide']) {
$this->sess->sortby = '';
$this->sess->sortdir = '';
if(array_key_exists($_GET['thide'], $this->sess->sortby)) {
unset($this->sess->sortby[$_GET['thide']]);
}
}
@@ -176,12 +175,21 @@ class flexible_table {
))
{
if(empty($this->sess->collapse[$_GET['tsort']])) {
if($this->sess->sortby == $_GET['tsort']) {
$this->sess->sortdir = $this->sess->sortdir == SORT_ASC ? SORT_DESC : SORT_ASC;
if(array_key_exists($_GET['tsort'], $this->sess->sortby)) {
// This key already exists somewhere. Change its sortorder and bring it to the top.
$sortorder = $this->sess->sortby[$_GET['tsort']] == SORT_ASC ? SORT_DESC : SORT_ASC;
unset($this->sess->sortby[$_GET['tsort']]);
$this->sess->sortby = array_merge(array($_GET['tsort'] => $sortorder), $this->sess->sortby);
}
else {
$this->sess->sortby = $_GET['tsort'];
$this->sess->sortdir = SORT_ASC;
// Key doesn't exist, so just add it to the beginning of the array, ascending order
$this->sess->sortby = array_merge(array($_GET['tsort'] => SORT_ASC), $this->sess->sortby);
}
// Finally, make sure that no more than $this->maxsortkeys are present into the array
if(!empty($this->maxsortkeys) && ($sortkeys = count($this->sess->sortby)) > $this->maxsortkeys) {
while($sortkeys-- > $this->maxsortkeys) {
array_pop($this->sess->sortby);
}
}
}
}
@@ -247,8 +255,16 @@ class flexible_table {
return false;
}
if(!empty($this->sess->sortby)) {
return $this->sess->sortby.($this->sess->sortdir == SORT_ASC ? ' ASC' : ' DESC');
$sortstring = '';
foreach($this->sess->sortby as $column => $order) {
if(!empty($sortstring)) {
$sortstring .= ', ';
}
$sortstring .= $column.($order == SORT_ASC ? ' ASC' : ' DESC');
}
return $sortstring;
}
return '';
}
function get_page_start() {
@@ -368,21 +384,28 @@ class flexible_table {
}
}
$primary_sort_column = '';
$primary_sort_order = '';
if(reset($this->sess->sortby)) {
$primary_sort_column = key($this->sess->sortby);
$primary_sort_order = current($this->sess->sortby);
}
switch($column) {
case 'fullname':
if($this->is_sortable) {
$icon_sort_first = $icon_sort_last = '';
if($this->sess->sortby == 'firstname') {
if($this->sess->sortdir == SORT_ASC) {
if($primary_sort_column == 'firstname') {
if($primary_sort_order == SORT_ASC) {
$icon_sort_first = ' <img src="'.$CFG->pixpath.'/t/down.gif" />';
}
else {
$icon_sort_first = ' <img src="'.$CFG->pixpath.'/t/up.gif" />';
}
}
else if($this->sess->sortby == 'lastname') {
if($this->sess->sortdir == SORT_ASC) {
else if($primary_sort_column == 'lastname') {
if($primary_sort_order == SORT_ASC) {
$icon_sort_last = ' <img src="'.$CFG->pixpath.'/t/down.gif" />';
}
else {
@@ -396,8 +419,8 @@ class flexible_table {
default:
if($this->is_sortable) {
if($this->sess->sortby == $column) {
if($this->sess->sortdir == SORT_ASC) {
if($primary_sort_column == $column) {
if($primary_sort_order == SORT_ASC) {
$icon_sort = ' <img src="'.$CFG->pixpath.'/t/down.gif" />';
}
else {