.
*/
/**
* 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 = "
";
$res .= "";
$res .= $this->getTableHeader();
$res .= $this->getTableBody($data, $start, $end);
$res .= "
";
$res .= "";
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;
}
}
?>