. */ /** * Pager object to display a list */ require_once(ROOTPATH."include/list/AjaxLinkColumn.php"); require_once(ROOTPATH."include/list/BooleanImageColumn.php"); require_once(ROOTPATH."include/list/CounterColumn.php"); require_once(ROOTPATH."include/list/DateColumn.php"); require_once(ROOTPATH."include/list/EmailColumn.php"); require_once(ROOTPATH."include/list/TextColumn.php"); class ListPager { private $name; private $extraParms; private $columns; private $pageSize; private $defaultSort; private $sortTranslator; private $sort; private $sortOrder; private $page; private $disableLinks; /** * 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( 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 = NULL; $this->sort = ""; $this->sortOrder = "asc"; $this->page = 1; $this->disableLinks = false; } /** * 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")); } $this->defineSortOrder(); $this->definePageNumber($data); $this->createColumnsIfNotDefined($data); $data = $this->sortData($data); // Pager if( count($data)<=$this->pageSize || $this->disableLinks ) { $start = 0; $end = count($data); $pager = ""; }else { $start = ($this->page-1) * $this->pageSize; $end = min(count($data), $start+$this->pageSize); $pager = $this->getPager($start, $end, count($data)); } // Build table $res = "
".$pager."
"; $res .= "

"; $res .= $this->getTableHeader(); $res .= $this->getTableBody($data, $start, $end); $res .= "
"; $res .= "

".$pager."
"; return $res; } protected function getTableHeader() { $res = ""; foreach($this->columns as $columnObject) { $res .= ""; if( !$this->disableLinks && $columnObject->isSortable() ) { $res .= "getName()."&".(($columnObject->getName()==$this->sort && $this->sortOrder=="asc")?"desc":"asc").$this->extraParms."\">"; } $res .= $columnObject->getHeader(); if( !$this->disableLinks && $columnObject->isSortable() ) { $res .= ""; } $res .= ""; } $res .= ""; return $res; } protected function getTableBody($data, $start, $end) { $rowkeys = array_keys($data); $res = ""; for( $r=$start; $r<$end; $r++ ) { $res .= ""; foreach($this->columns as $columnObject) { $class = $columnObject->getClass(); $res .= "".$columnObject->getCellValue($r, $data[ $rowkeys[$r] ]).""; } $res .= ""; } $res .= ""; return $res; } protected function getPager($start, $end, $total) { if( $this->page>1 ) { $pager = "extraParms."\">« page-1).$this->extraParms."\">< "; }else { $pager = "« < "; } for( $c=1; $c<=ceil($total/$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 ".$total.")"; return $pager; } protected function sortData($data) { 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")); } } return $data; } protected function createColumnsIfNotDefined($data) { if( count($this->columns)==0 ) { // If columns not set, create $columns = array_keys(current($data)); $this->columns = array(); for( $i=0; $icolumns[] = new TextColumn($columns[$i], $columns[$i]); } } } protected function definePageNumber($data) { 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; } } protected function defineSortOrder() { 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( $this->defaultSort=="" || array_key_exists($this->defaultSort, $this->columns) ) { $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']; } } /** * 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; } protected function getColumns() { return $this->columns; } /** * 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.")); } } protected function sortDataAsc($a, $b) { if( $this->sortTranslator!=NULL && 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); } } } protected function sortDataDesc($a, $b) { return $this->sortDataAsc($b, $a); } protected function isPageWithinLimits($page, $data) { return $page>0 AND $page<=ceil(count($data)/$this->pageSize); } /** * Do not include any links in the table (sorting, paging), useful when this table is loaded via ajax * * @param boolean $disableLinks */ public function setDisableLinks($disableLinks) { $this->disableLinks = $disableLinks; } public function getDisableLinks() { return $this->disableLinks; } } ?>