. */ /** * Pager object to display a list */ require_once(FILESYSTEMROOTPATH."include/list/CounterColumn.php"); require_once(FILESYSTEMROOTPATH."include/list/DateColumn.php"); require_once(FILESYSTEMROOTPATH."include/list/TextColumn.php"); class ListPager { private $name; private $extraParms; private $columns; private $pageSize; private $defaultSort; private $sortTranslator; private $sort; private $sortOrder; private $page; /** * Constructor * * @param string name of the shown data (free string, must be unique) * @param string extraParms parameters to be added to links in http encoding * @throws InvalidArgumentException in case arguments are invalid */ public function __construct($name, $extraParms="") { $this->name = $name; $this->extraParms = $extraParms; //if extraParms empty but page was called with extra params if ($extraParms=="" && $_SERVER['QUERY_STRING']){ $extraParms = $_SERVER['QUERY_STRING']; //remove sort and asc/desc from query string $extraParms = preg_replace("/sort=([a-zA-Z_]+)(&|$)/", "", $extraParms); $extraParms = preg_replace("/page=([0-9]+)(&|$)/", "", $extraParms); $extraParms = str_replace(array("asc","desc","asc&","desc&"),"",$extraParms); $this->extraParms = $extraParms; } if( strlen($this->extraParms)>0 && substr($this->extraParms, 0, 1)!="&" ) { $this->extraParms = "&" . $this->extraParms; } $this->columns = array(); if( defined("MAXLISTLENGTH") ) { $this->pageSize = MAXLISTLENGTH; }else { $this->pageSize = 25; } $this->defaultSort = ""; $this->sortTranslator = array(); $this->sort = ""; $this->sortOrder = "asc"; $this->page = 1; } /** * Display the list * * @param array data to be shown (2-dimensional) */ public function display($data) { if( !isset($data) || !is_array($data) ) { throw new InvalidArgumentException(_("No data array given")); } // Sort order in session if( isset($_REQUEST['sort']) AND array_key_exists($_REQUEST['sort'], $this->columns) ) { $this->sort = $_REQUEST['sort']; $_SESSION['ListPager'][$this->name]['sort'] = $_REQUEST['sort']; }elseif( isset($_SESSION['ListPager'][$this->name]['sort']) ) { $this->sort = $_SESSION['ListPager'][$this->name]['sort']; }elseif( array_key_exists($this->defaultSort, $this->columns) || $this->defaultSort=="" ) { $this->sort = $this->defaultSort; }else { throw new InvalidArgumentException(_("The default sort should be a column.")); } if( isset($_REQUEST['asc']) ) { $this->sortOrder = "asc"; $_SESSION['ListPager'][$this->name]['sortOrder'] = "asc"; }elseif( isset($_REQUEST['desc']) ) { $this->sortOrder = "desc"; $_SESSION['ListPager'][$this->name]['sortOrder'] = "desc"; }elseif( isset($_SESSION['ListPager'][$this->name]['sortOrder']) ) { $this->sortOrder = $_SESSION['ListPager'][$this->name]['sortOrder']; } // Page in session if( isset($_REQUEST['page']) AND $this->isPageWithinLimits($_REQUEST['page'], $data) ) { $this->page = $_REQUEST['page']; $_SESSION['ListPager'][$this->name]['page'] = $_REQUEST['page']; }elseif( isset($_SESSION['ListPager'][$this->name]['page']) AND $this->isPageWithinLimits($_SESSION['ListPager'][$this->name]['page'], $data) ) { $this->page = $_SESSION['ListPager'][$this->name]['page']; }else { $this->page = 1; } // If columns not set, create if( count($this->columns)<1 ) { $columns = array_keys(current($data)); $this->columns = array(); for( $i=0; $icolumns[] = new TextColumn($columns[$i], $columns[$i]); } } if( $this->sort!="" && array_key_exists($this->sort, $this->columns) ) { // Sort data if( $this->sortOrder=="desc" ) { uasort($data, array($this, "sortDataDesc")); }else { uasort($data, array($this, "sortDataAsc")); } } // Pager if( count($data)<=$this->pageSize ) { $start = 0; $end = count($data); $pager = ""; }else { $start = ($this->page-1) * $this->pageSize; $end = min(count($data), $start+$this->pageSize); if( $this->page>1 ) { $pager = "extraParms."\">« page-1).$this->extraParms."\">< "; }else { $pager = "« < "; } for( $c=1; $c<=ceil(count($data)/$this->pageSize); $c++ ) { if( $c==$this->page ) { $pager .= "".$c." "; }else { $pager .= "extraParms."\">".$c." "; } } if( $this->pagepageSize) ) { $pager .= "page+1).$this->extraParms."\">> pageSize).$this->extraParms."\">»"; }else { $pager .= "> »"; } $pager .= " (showing ".($start+1)." - ".$end." of ".count($data).")"; } // Build table $rowkeys = array_keys($data); $res = "
".$pager."
"; $res .= "

"; // Table Title $res .= ""; // Headers $res .= ""; foreach($this->columns as $columnObject) { $res .= ""; } $res .= ""; // Body $res .= ""; for( $r=$start; $r<$end; $r++ ) { $res .= ""; foreach($this->columns as $columnObject) { $res .= ""; } $res .= ""; } $res .= "
columns)."\">".$this->name."
"; if( $columnObject->isSortable() ) { $res .= "getName()."&".(($columnObject->getName()==$this->sort && $this->sortOrder=="asc")?"desc":"asc").$this->extraParms."\">"; } $res .= $columnObject->getHeader(); if( $columnObject->isSortable() ) { $res .= ""; } $res .= "
".$columnObject->getCellValue($r, $data[ $rowkeys[$r] ])."
"; $res .= "

".$pager."
"; return $res; } /** * Get the name of the data * * @return string name of the data */ public function getName() { return $this->name; } /** * Add a column * * @param IColumn column to be shown. */ public function addColumn(IColumn $column) { $this->columns[$column->getName()] = $column; } /** * Get the maximum page size * * @return maximum page size */ public function getPageSize() { return $this->pageSize; } /** * Set the maximum page size * * @param int pagesize number of items to show per page * @throws InvalidArgumentException if size is not numerical and positive */ public function setPageSize($pageSize) { if( is_numeric($pageSize) AND $pageSize>0 ) { $this->pageSize = $pageSize; }else { throw new InvalidArgumentException(_("The page size should be numerical and positive.")); } } public function getDefaultSort() { return $this->defaultSort; } public function setDefaultSort($defaultSort) { $this->defaultSort = $defaultSort; } public function getSortTranslator() { return $this->sortTranslator; } public function setSortTranslator($sortTranslator) { if( is_array($sortTranslator) ) { $this->sortTranslator = $sortTranslator; }else { throw new InvalidArgumentException(_("The sort translator should be an array.")); } } private function sortDataAsc($a, $b) { if( array_key_exists($this->sort, $this->sortTranslator) ) { $sort = explode(",", $this->sortTranslator[$this->sort]); for( $i=0; $i$b[ $sort[$i] ] ) { return 1; } } return 0; }else { if( $a[$this->sort]==$b[$this->sort] ) { return 0; }else { return ($a[$this->sort]<$b[$this->sort] ? -1 : 1); } } } private function sortDataDesc($a, $b) { return $this->sortDataAsc($b, $a); } private function isPageWithinLimits($page, $data) { return $page>0 AND $page<=ceil(count($data)/$this->pageSize); } } ?>