From 73e4f589531b2121888223c46a86cfd0fde02458 Mon Sep 17 00:00:00 2001 From: defacer Date: Thu, 10 Mar 2005 16:38:01 +0000 Subject: [PATCH] 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. --- lib/tablelib.php | 61 +++++++++++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/lib/tablelib.php b/lib/tablelib.php index d9c04f1d8fe..2849d7395f5 100644 --- a/lib/tablelib.php +++ b/lib/tablelib.php @@ -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 = ' '; } else { $icon_sort_first = ' '; } } - 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 = ' '; } 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 = ' '; } else {