From 4bc4118b96f0e135934f59cd1d10067112c93c45 Mon Sep 17 00:00:00 2001 From: hickert Date: Thu, 29 Jul 2010 13:20:00 +0000 Subject: [PATCH] Updated post handling git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@19249 594d385d-05f5-0310-b6e9-bd551577e9d8 --- gosa-core/include/class_sortableListing.inc | 934 ++++++++++---------- 1 file changed, 468 insertions(+), 466 deletions(-) diff --git a/gosa-core/include/class_sortableListing.inc b/gosa-core/include/class_sortableListing.inc index 79bc25e7a..0f3e650db 100644 --- a/gosa-core/include/class_sortableListing.inc +++ b/gosa-core/include/class_sortableListing.inc @@ -25,572 +25,574 @@ define ('LIST_MARKED', 1); define ('LIST_DISABLED', 2); class sortableListing { - private $header= null; - private $colspecs= null; - private $reorderable= true; - private $width= "400px"; - private $height= "100px"; - private $cssclass= ""; - private $id; - - private $data= array(); - private $keys= array(); - private $modes= array(); - private $displayData= array(); - private $columns= 0; - private $deleteable= false; - private $editable= false; - private $colorAlternate= false; - private $instantDelete= true; - private $action; - private $mapping; - private $current_mapping; - private $active_index; - private $scrollPosition= 0; - private $sortColumn= 0; - private $sortDirection= array(); - - private $acl= ""; - private $modified= false; - - public function sortableListing($data= array(), $displayData= null, $reorderable= false) - { - global $config; - - // Save data to display - $this->setListData($data, $displayData); - - // Get list of used IDs - if(!session::is_set('sortableListing_USED_IDS')){ - session::set('sortableListing_USED_IDS',array()); - } - $usedIds = session::get('sortableListing_USED_IDS'); + private $header= null; + private $colspecs= null; + private $reorderable= true; + private $width= "400px"; + private $height= "100px"; + private $cssclass= ""; + private $id; + + private $data= array(); + private $keys= array(); + private $modes= array(); + private $displayData= array(); + private $columns= 0; + private $deleteable= false; + private $editable= false; + private $colorAlternate= false; + private $instantDelete= true; + private $action; + private $mapping; + private $current_mapping; + private $active_index; + private $scrollPosition= 0; + private $sortColumn= 0; + private $sortDirection= array(); + + private $acl= ""; + private $modified= false; + + public function sortableListing($data= array(), $displayData= null, $reorderable= false) + { + global $config; + + // Save data to display + $this->setListData($data, $displayData); + + // Get list of used IDs + if(!session::is_set('sortableListing_USED_IDS')){ + session::set('sortableListing_USED_IDS',array()); + } + $usedIds = session::get('sortableListing_USED_IDS'); - // Generate instance wide unique ID - $id = ""; - while($id == "" || in_array($id, $usedIds)){ + // Generate instance wide unique ID + $id = ""; + while($id == "" || in_array($id, $usedIds)){ - // Wait 1 msec to ensure that we definately get a new id - if($id != "") usleep(1); - $tmp= gettimeofday(); - $id = 'l'.md5(microtime().$tmp['sec']); - } + // Wait 1 msec to ensure that we definately get a new id + if($id != "") usleep(1); + $tmp= gettimeofday(); + $id = 'l'.md5(microtime().$tmp['sec']); + } - // Only keep the last 10 list IDsi - $usedIds = array_slice($usedIds, count($usedIds) -10, 10); - $usedIds[] = $id; - session::set('sortableListing_USED_IDS',$usedIds); - $this->id = $id; + // Only keep the last 10 list IDsi + $usedIds = array_slice($usedIds, count($usedIds) -10, 10); + $usedIds[] = $id; + session::set('sortableListing_USED_IDS',$usedIds); + $this->id = $id; - // Set reorderable flag - $this->reorderable= $reorderable; - if (!$reorderable) { - $this->sortData(); - } - } - - public function setReorderable($bool) - { - $this->reorderable= $bool; - } - - public function setDefaultSortColumn($id) - { - $this->sortColumn = $id; - } - - public function setListData($data, $displayData= null) - { - // Save data to display - $this->setData($data); - if (!$displayData) { - $displayData= array(); - foreach ($data as $key => $value) { - $displayData[$key]= array("data" => array($value)); - } + // Set reorderable flag + $this->reorderable= $reorderable; + if (!$reorderable) { + $this->sortData(); + } } - $this->setDisplayData($displayData); - } - - private function setData($data) - { - $this->data= $data; - } - - - private function setDisplayData($data) - { - if (!is_array($data)) { - trigger_error ("sortableList needs an array as data!"); + public function setReorderable($bool) + { + $this->reorderable= $bool; } - // Transfer information - $this->displayData= array(); - $this->modes= array(); - $this->mapping= array(); - foreach ($data as $key => $value) { - $this->displayData[]= $value['data']; - if (isset($value['mode'])) { - $this->modes[]= $value['mode']; - } + public function setDefaultSortColumn($id) + { + $this->sortColumn = $id; } - $this->keys= array_keys($data); - // Create initial mapping - if(count($this->keys)){ - $this->mapping= range(0, abs(count($this->keys)-1)); - } - $this->current_mapping= $this->mapping; - - // Find the number of coluns - reset($this->displayData); - $first= current($this->displayData); - if (is_array($first)) { - $this->columns= count($first); - } else { - $this->columns= 1; + public function setListData($data, $displayData= null) + { + // Save data to display + $this->setData($data); + if (!$displayData) { + $displayData= array(); + foreach ($data as $key => $value) { + $displayData[$key]= array("data" => array($value)); + } + } + $this->setDisplayData($displayData); } - // Preset sort orders to 'down' - for ($column= 0; $column<$this->columns; $column++) { - if(!isset($this->sortDirection[$column])){ - $this->sortDirection[$column]= true; - } + + private function setData($data) + { + $this->data= $data; } - } - public function setWidth($width) - { - $this->width= $width; - } + private function setDisplayData($data) + { + if (!is_array($data)) { + trigger_error ("sortableList needs an array as data!"); + } + // Transfer information + $this->displayData= array(); + $this->modes= array(); + $this->mapping= array(); + foreach ($data as $key => $value) { + $this->displayData[]= $value['data']; + if (isset($value['mode'])) { + $this->modes[]= $value['mode']; + } + } + $this->keys= array_keys($data); - public function setInstantDelete($flag) - { - $this->instantDelete= $flag; - } + // Create initial mapping + if(count($this->keys)){ + $this->mapping= range(0, abs(count($this->keys)-1)); + } + $this->current_mapping= $this->mapping; + // Find the number of coluns + reset($this->displayData); + $first= current($this->displayData); + if (is_array($first)) { + $this->columns= count($first); + } else { + $this->columns= 1; + } - public function setColorAlternate($flag) - { - $this->colorAlternate= $flag; - } + // Preset sort orders to 'down' + for ($column= 0; $column<$this->columns; $column++) { + if(!isset($this->sortDirection[$column])){ + $this->sortDirection[$column]= true; + } + } + } - public function setEditable($flag) - { - $this->editable= $flag; - } + public function setWidth($width) + { + $this->width= $width; + } - public function setDeleteable($flag) - { - $this->deleteable= $flag; - } + public function setInstantDelete($flag) + { + $this->instantDelete= $flag; + } - public function setHeight($height) - { - $this->height= $height; - } + public function setColorAlternate($flag) + { + $this->colorAlternate= $flag; + } - public function setCssClass($css) - { - $this->cssclass= $css; - } + public function setEditable($flag) + { + $this->editable= $flag; + } - public function setHeader($header) - { - $this->header= $header; - } + public function setDeleteable($flag) + { + $this->deleteable= $flag; + } - public function setColspecs($specs) - { - $this->colspecs= $specs; - } + public function setHeight($height) + { + $this->height= $height; + } - public function render() - { - $result= "
\n"; - $result.= "cssclass)?" class='".$this->cssclass."'":"").">\n"; - $action_width= 0; - if (strpos($this->acl, 'w') === false) { - $edit_image= $this->editable?image("images/lists/edit-grey.png"):""; - } else { - $edit_image= $this->editable?image('images/lists/edit.png', "%ID", _("Edit this entry")):""; + public function setCssClass($css) + { + $this->cssclass= $css; } - if (strpos($this->acl, 'd') === false) { - $delete_image= $this->deleteable?image('images/lists/trash-grey.png'):""; - } else { - $delete_image= $this->deleteable?image('images/lists/trash.png', "%ID", _("Delete this entry")):""; + + + public function setHeader($header) + { + $this->header= $header; } - // Do we need colspecs? - $action_width= ($this->editable?30:0) + ($this->deleteable?30:0); - if ($this->colspecs) { - $result.= " \n"; - for ($i= 0; $i<$this->columns; $i++) { - if(isset($this->colspecs[$i]) && $this->colspecs[$i] != '*'){ - $result.= " \n"; - }else{ - $result.= " \n"; - } - } - - // Extend by another column if we've actions specified - if ($action_width) { - $result.= " \n"; - } - $result.= " \n"; + + public function setColspecs($specs) + { + $this->colspecs= $specs; } - // Do we need a header? - if ($this->header) { - $result.= " \n \n"; - $first= " style='border-left:0'"; - for ($i= 0; $i<$this->columns; $i++) { - $link= "href='?plug=".$_GET['plug']."&PID=".$this->id."&act=SORT_$i'"; - $sorter= ""; - if ($i == $this->sortColumn){ - $sorter= " ".image("images/lists/sort-".($this->sortDirection[$i]?"up":"down").".png", null, $this->sortDirection[$i]?_("Sort ascending"):_("Sort descending")); - } - if ($this->reorderable) { - $result.= " ".(isset($this->header[$i])?$this->header[$i]:"").""; + public function render() + { + $result= "
\n"; + $result.= "
cssclass)?" class='".$this->cssclass."'":"").">\n"; + $action_width= 0; + if (strpos($this->acl, 'w') === false) { + $edit_image= $this->editable?image("images/lists/edit-grey.png"):""; } else { - $result.= " ".(isset($this->header[$i])?$this->header[$i]:"")."$sorter"; - } - $first= ""; - } - if ($action_width) { - $result.= ""; - } - $result.= "\n \n \n"; - } + $edit_image= $this->editable?image('images/lists/edit.png', "%ID", _("Edit this entry")):""; + } + if (strpos($this->acl, 'd') === false) { + $delete_image= $this->deleteable?image('images/lists/trash-grey.png'):""; + } else { + $delete_image= $this->deleteable?image('images/lists/trash.png', "%ID", _("Delete this entry")):""; + } - // Render table body if we've read permission - $result.= " \n"; - $reorderable= $this->reorderable?"":" style='cursor:default'"; - if (strpos($this->acl, 'r') !== false) { - foreach ($this->mapping as $nr => $row) { - $editable= $this->editable?" onClick='$(\"edit_".$this->id."_$nr\").click()'":""; - - $id= ""; - if (isset($this->modes[$row])) { - switch ($this->modes[$row]) { - case LIST_DISABLED: - $id= " sortableListItemDisabled"; - $editable= ""; - break; - case LIST_MARKED: - $id= " sortableListItemMarked"; - break; - } - } - - $result.= " \n"; - $first= " style='border:0'"; - - foreach ($this->displayData[$row] as $column) { - - // Do NOT use the onClick statement for columns that contain links or buttons. - if(preg_match("<.*type=.submit..*>", $column) || preg_match("", $column)){ - $result.= " ".$column."\n"; - }else{ - $result.= " ".$column."\n"; + // Do we need colspecs? + $action_width= ($this->editable?30:0) + ($this->deleteable?30:0); + if ($this->colspecs) { + $result.= " \n"; + for ($i= 0; $i<$this->columns; $i++) { + if(isset($this->colspecs[$i]) && $this->colspecs[$i] != '*'){ + $result.= " \n"; + }else{ + $result.= " \n"; + } } - $first= ""; + + // Extend by another column if we've actions specified + if ($action_width) { + $result.= " \n"; + } + $result.= " \n"; } - if ($action_width) { - $result.= ""; + // Do we need a header? + if ($this->header) { + $result.= " \n \n"; + $first= " style='border-left:0'"; + for ($i= 0; $i<$this->columns; $i++) { + $link= "href='?plug=".$_GET['plug']."&PID=".$this->id."&act=SORT_$i'"; + $sorter= ""; + if ($i == $this->sortColumn){ + $sorter= " ".image("images/lists/sort-".($this->sortDirection[$i]?"up":"down").".png", null, $this->sortDirection[$i]?_("Sort ascending"):_("Sort descending")); + } + + if ($this->reorderable) { + $result.= " ".(isset($this->header[$i])?$this->header[$i]:"").""; + } else { + $result.= " ".(isset($this->header[$i])?$this->header[$i]:"")."$sorter"; + } + $first= ""; + } + if ($action_width) { + $result.= ""; + } + $result.= "\n \n \n"; } - $result.= " \n"; - } - } + // Render table body if we've read permission + $result.= " \n"; + $reorderable= $this->reorderable?"":" style='cursor:default'"; + if (strpos($this->acl, 'r') !== false) { + foreach ($this->mapping as $nr => $row) { + $editable= $this->editable?" onClick='$(\"edit_".$this->id."_$nr\").click()'":""; + + $id= ""; + if (isset($this->modes[$row])) { + switch ($this->modes[$row]) { + case LIST_DISABLED: + $id= " sortableListItemDisabled"; + $editable= ""; + break; + case LIST_MARKED: + $id= " sortableListItemMarked"; + break; + } + } + + $result.= " \n"; + $first= " style='border:0'"; + + foreach ($this->displayData[$row] as $column) { + + // Do NOT use the onClick statement for columns that contain links or buttons. + if(preg_match("<.*type=.submit..*>", $column) || preg_match("", $column)){ + $result.= " ".$column."\n"; + }else{ + $result.= " ".$column."\n"; + } + $first= ""; + } + + if ($action_width) { + $result.= ""; + } + + $result.= " \n"; + } + } - // Add spacer - $result.= " "; - $num= $action_width?$this->columns:$this->columns-1; - for ($i= 0; $i<$num; $i++) { - $result.= ""; - } - $result.= "\n"; + // Add spacer + $result.= " "; + $num= $action_width?$this->columns:$this->columns-1; + for ($i= 0; $i<$num; $i++) { + $result.= ""; + } + $result.= "\n"; - $result.= " \n
 
".str_replace('%ID', "edit_".$this->id."_$nr", $edit_image). - str_replace('%ID', "del_".$this->id."_$nr", $delete_image)."
 
".str_replace('%ID', "edit_".$this->id."_$nr", $edit_image). + str_replace('%ID', "del_".$this->id."_$nr", $delete_image)."
\n
\n"; + $result.= " \n\n\n"; # $result.= " \n"; - $result.= " \n"; - $result.= " \n"; - - // Append script stuff if needed - $result.= ''; + + return $result; } - $result.= '$("scroll_'.$this->id.'").scrollTop= '.$this->scrollPosition.';'; - $result.= 'var box = $("scroll_'.$this->id.'").onscroll= function() {$("position_'.$this->id.'").value= this.scrollTop;}'; - $result.= ''; - return $result; - } + public function update() + { - public function update() - { + // Filter GET with "act" attributes + if (!$this->reorderable){ + if(isset($_GET['act']) && isset($_GET['PID']) && $this->id == $_GET['PID']) { - // Filter GET with "act" attributes - if (!$this->reorderable){ - if(isset($_GET['act']) && isset($_GET['PID']) && $this->id == $_GET['PID']) { - - $key= validate($_GET['act']); - if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { + $key= validate($_GET['act']); + if (preg_match('/^SORT_([0-9]+)$/', $key, $match)) { - // Switch to new column or invert search order? - $column= $match[1]; - if ($this->sortColumn != $column) { - $this->sortColumn= $column; - } else { - $this->sortDirection[$column]= !$this->sortDirection[$column]; - } + // Switch to new column or invert search order? + $column= $match[1]; + if ($this->sortColumn != $column) { + $this->sortColumn= $column; + } else { + $this->sortDirection[$column]= !$this->sortDirection[$column]; + } + } + } + + // Update mapping according to sort parameters + $this->sortData(); } - } - - // Update mapping according to sort parameters - $this->sortData(); } - } - public function save_object() - { - // Do not do anything if this is not our PID, or there's even no PID available... - if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->id) { - return; - } + public function save_object() + { + // Do not do anything if this is not our PID, or there's even no PID available... + if(isset($_REQUEST['PID']) && $_REQUEST['PID'] != $this->id) { + return; + } - // Do not do anything if we're not posted - or have no permission - if (strpos($this->acl, 'w') !== false && isset($_POST['reorder_'.$this->id])){ + // Do not do anything if we're not posted - or have no permission + if (strpos($this->acl, 'w') !== false && isset($_POST['reorder_'.$this->id])){ - if (isset($_POST['position_'.$this->id]) && is_numeric($_POST['position_'.$this->id])) { - $this->scrollPosition= $_POST['position_'.$this->id]; - } + if (isset($_POST['position_'.$this->id]) && is_numeric($_POST['position_'.$this->id])) { + $this->scrollPosition= get_post('position_'.$this->id); + } - // Move requested? - $move= $_POST['reorder_'.$this->id]; - if ($move != "") { - preg_match_all('/=([0-9]+)[&=]/', $move, $matches); - $this->action= "reorder"; - $tmp= array(); - foreach ($matches[1] as $id => $row) { - $tmp[$id]= $this->mapping[$row]; + // Move requested? + $move= get_post('reorder_'.$this->id); + if ($move != "") { + preg_match_all('/=([0-9]+)[&=]/', $move, $matches); + $this->action= "reorder"; + $tmp= array(); + foreach ($matches[1] as $id => $row) { + $tmp[$id]= $this->mapping[$row]; + } + $this->mapping= $tmp; + $this->current_mapping= $matches[1]; + $this->modified= true; + return; + } } - $this->mapping= $tmp; - $this->current_mapping= $matches[1]; - $this->modified= true; - return; - } - } - - // Delete requested? - $this->action = ""; - if (strpos($this->acl, 'd') !== false){ - foreach ($_POST as $key => $value) { - if (preg_match('/^del_'.$this->id.'_([0-9]+)$/', $key, $matches)) { - $this->active_index= $this->mapping[$matches[1]]; - // Ignore request if mode requests it - if (isset($this->modes[$this->active_index]) && $this->modes[$this->active_index] == LIST_DISABLED) { - $this->active_index= null; - continue; - } - - // Set action - $this->action= "delete"; + // Delete requested? + $this->action = ""; + if (strpos($this->acl, 'd') !== false){ + foreach ($_POST as $key => $value) { + $value = get_post($key); + if (preg_match('/^del_'.$this->id.'_([0-9]+)$/', $key, $matches)) { + $this->active_index= $this->mapping[$matches[1]]; + + // Ignore request if mode requests it + if (isset($this->modes[$this->active_index]) && $this->modes[$this->active_index] == LIST_DISABLED) { + $this->active_index= null; + continue; + } + + // Set action + $this->action= "delete"; + + // Remove value if requested + if ($this->instantDelete) { + $this->deleteEntry($this->active_index); + } + } + } + } - // Remove value if requested - if ($this->instantDelete) { - $this->deleteEntry($this->active_index); - } + // Edit requested? + if (strpos($this->acl, 'w') !== false){ + foreach ($_POST as $key => $value) { + $value = get_post($key); + if (preg_match('/^edit_'.$this->id.'_([0-9]+)$/', $key, $matches)) { + $this->active_index= $this->mapping[$matches[1]]; + + // Ignore request if mode requests it + if (isset($this->modes[$this->active_index]) && $this->modes[$this->active_index] == LIST_DISABLED) { + $this->active_index= null; + continue; + } + + $this->action= "edit"; + } + } } - } } - // Edit requested? - if (strpos($this->acl, 'w') !== false){ - foreach ($_POST as $key => $value) { - if (preg_match('/^edit_'.$this->id.'_([0-9]+)$/', $key, $matches)) { - $this->active_index= $this->mapping[$matches[1]]; - // Ignore request if mode requests it - if (isset($this->modes[$this->active_index]) && $this->modes[$this->active_index] == LIST_DISABLED) { - $this->active_index= null; - continue; - } + public function getAction() + { + // Do not do anything if we're not posted + if(!isset($_POST['reorder_'.$this->id])) { + return; + } - $this->action= "edit"; + // For reordering, return current mapping + if ($this->action == 'reorder') { + return array("targets" => $this->current_mapping, "mapping" => $this->mapping, "action" => $this->action); } - } - } - } + // Edit and delete + $result= array("targets" => array($this->active_index), "action" => $this->action); - public function getAction() - { - // Do not do anything if we're not posted - if(!isset($_POST['reorder_'.$this->id])) { - return; + return $result; } - // For reordering, return current mapping - if ($this->action == 'reorder') { - return array("targets" => $this->current_mapping, "mapping" => $this->mapping, "action" => $this->action); - } - // Edit and delete - $result= array("targets" => array($this->active_index), "action" => $this->action); - - return $result; - } + private function deleteEntry($id) + { + // Remove mapping + $index= array_search($id, $this->mapping); + if ($index !== false) { + unset($this->mapping[$index]); + $this->mapping= array_values($this->mapping); + $this->modified= true; + } + } - private function deleteEntry($id) - { - // Remove mapping - $index= array_search($id, $this->mapping); - if ($index !== false) { - unset($this->mapping[$index]); - $this->mapping= array_values($this->mapping); - $this->modified= true; + public function getMaintainedData() + { + $tmp= array(); + foreach ($this->mapping as $src => $dst) { + $realKey = $this->keys[$dst]; + $tmp[$realKey] = $this->data[$realKey]; + } + return $tmp; } - } - public function getMaintainedData() - { - $tmp= array(); - foreach ($this->mapping as $src => $dst) { - $realKey = $this->keys[$dst]; - $tmp[$realKey] = $this->data[$realKey]; + public function isModified() + { + return $this->modified; } - return $tmp; - } - public function isModified() - { - return $this->modified; - } + public function setAcl($acl) + { + $this->acl= $acl; + } - public function setAcl($acl) - { - $this->acl= $acl; - } + public function sortData() + { + if(!count($this->data)) return; + // Extract data + $tmp= array(); + foreach($this->displayData as $item) { + if (isset($item[$this->sortColumn])){ + $tmp[]= $item[$this->sortColumn]; + } else { + $tmp[]= ""; + } + } - public function sortData() - { - if(!count($this->data)) return; + // Sort entries + if ($this->sortDirection[$this->sortColumn]) { + asort($tmp); + } else { + arsort($tmp); + } - // Extract data - $tmp= array(); - foreach($this->displayData as $item) { - if (isset($item[$this->sortColumn])){ - $tmp[]= $item[$this->sortColumn]; - } else { - $tmp[]= ""; - } + // Adapt mapping accordingly + $this->mapping= array(); + foreach ($tmp as $key => $value) { + $this->mapping[]= $key; + } } - // Sort entries - if ($this->sortDirection[$this->sortColumn]) { - asort($tmp); - } else { - arsort($tmp); - } - // Adapt mapping accordingly - $this->mapping= array(); - foreach ($tmp as $key => $value) { - $this->mapping[]= $key; - } - } - - - public function addEntry($entry, $displayEntry= null, $key= null) - { - // Only add if not already there - if (!$key) { - if (in_array($entry, $this->data)) { - return; - } - } else { - if (isset($this->data[$key])) { - return; - } - } + public function addEntry($entry, $displayEntry= null, $key= null) + { + // Only add if not already there + if (!$key) { + if (in_array($entry, $this->data)) { + return; + } + } else { + if (isset($this->data[$key])) { + return; + } + } - // Prefill with default value if not specified - if (!$displayEntry) { - $displayEntry= array('data' => array($entry)); - } + // Prefill with default value if not specified + if (!$displayEntry) { + $displayEntry= array('data' => array($entry)); + } - // Append to data and mapping - if ($key) { - $this->data[$key]= $entry; - $this->keys[]= $key; - } else { - $this->data[]= $entry; - $this->keys[]= count($this->mapping); - } - $this->displayData[]= $displayEntry['data']; - $this->mapping[]= count($this->mapping); - $this->modified= true; - - // Find the number of coluns - reset($this->displayData); - $first= current($this->displayData); - if (is_array($first)) { - $this->columns= count($first); - } else { - $this->columns= 1; - } + // Append to data and mapping + if ($key) { + $this->data[$key]= $entry; + $this->keys[]= $key; + } else { + $this->data[]= $entry; + $this->keys[]= count($this->mapping); + } + $this->displayData[]= $displayEntry['data']; + $this->mapping[]= count($this->mapping); + $this->modified= true; - // Preset sort orders to 'down' - for ($column= 0; $column<$this->columns; $column++) { - if(!isset($this->sortDirection[$column])){ - $this->sortDirection[$column]= true; + // Find the number of coluns + reset($this->displayData); + $first= current($this->displayData); + if (is_array($first)) { + $this->columns= count($first); + } else { + $this->columns= 1; + } + + // Preset sort orders to 'down' + for ($column= 0; $column<$this->columns; $column++) { + if(!isset($this->sortDirection[$column])){ + $this->sortDirection[$column]= true; + } } - } - // Sort data after we've added stuff - $this->sortData(); - } + // Sort data after we've added stuff + $this->sortData(); + } - public function getKey($index) { - return isset($this->keys[$index])?$this->keys[$index]:null; - } + public function getKey($index) { + return isset($this->keys[$index])?$this->keys[$index]:null; + } - public function getData($index) { - $realkey = $this->keys[$index]; - return($this->data[$realkey]); - } + public function getData($index) { + $realkey = $this->keys[$index]; + return($this->data[$realkey]); + } } -- 2.30.2