PHP Code:
<?php
class Pagination {
protected
/*
* Configuration defaults
*/
$_arrConfig = array(
'limit'=>10
,'page'=>1
,'basePath'=>'#'
,'label'=>'Items'
,'visiblePages'=>5
,'pageFlag'=>'{page}'
,'display_pages'=>1
,'display_entity'=>1
)
/*
* Data to be passed to template
*/
,$_arrTemplateData = array()
/*
* function to pass resolved offset and limit
*/
,$_onPaginate
/*
* extra arguments to pass to to pagination callback
* such as data source or db connection
*/
,$_arrArgs;
public function __construct($onPaginate,$arrConfig=array(),$arrArgs=array()) {
$this->_onPaginate = $onPaginate;
$this->_arrArgs = $arrArgs;
foreach($arrConfig as $strKey=>$mixValue) {
if(array_key_exists($strKey,$this->_arrConfig)) {
$this->_arrConfig[$strKey] = $mixValue;
}
}
}
public function paginate() {
/*
* Calculate page offset
*/
$intOffset = ($this->_arrConfig['page']-1)*$this->_arrConfig['limit'];
/*
* Paginate and get number of found rows
*/
$intFoundRows = call_user_func_array($this->_onPaginate,array_merge(array($intOffset,$this->_arrConfig['limit']),$this->_arrArgs));
/*
* Assign template data
*/
$this->_arrTemplateData['limit'] = $this->_arrConfig['limit'];
$this->_arrTemplateData['page'] = $this->_arrConfig['page'];
$this->_arrTemplateData['offset'] = $intOffset;
$this->_arrTemplateData['found_rows'] = $intFoundRows;
$this->_arrTemplateData['total_pages'] = $intFoundRows < $this->_arrConfig['limit']?1:ceil($intFoundRows/$this->_arrConfig['limit']);
$this->_arrTemplateData['visible_pages'] = $this->_arrConfig['visiblePages'];
$this->_arrTemplateData['base_path'] = $this->_arrConfig['basePath'];
$this->_arrTemplateData['label'] = $this->_arrConfig['label'];
$this->_arrTemplateData['page_flag'] = $this->_arrConfig['pageFlag'];
$this->_arrTemplateData['display_pages'] = $this->_arrConfig['display_pages'];
$this->_arrTemplateData['display_entity'] = $this->_arrConfig['display_entity'];
/*
* Return the pagination template
*/
return $this->display();
}
public function display() {
extract($this->_arrTemplateData);
if($total_pages <= $visible_pages) {
$page_start = 1;
$page_end = $total_pages;
} else if($page <= ceil($visible_pages/2)) {
$page_start = 1;
$page_end = $visible_pages;
} else if($page > ($total_pages - ceil($visible_pages/2))) {
$page_start = $total_pages - (ceil(($visible_pages/2)*2)-1);
$page_end = $total_pages;
} else {
$page_start = $page-(floor($visible_pages/2));
$page_end = $page+(floor($visible_pages/2));
}
$return='';
if($display_pages && $display_entity) {
$return.= sprintf(
'<div class="summary"><p class="pages">%u %s</p><p class="total">%u %s</p></div>'
,$total_pages
,$total_pages == 1?'Page':'Pages'
,$found_rows
,$found_rows == 1?$label:$label
);
}
$return.= sprintf('<ul class="pagination">');
$return.= sprintf(
'<li class="first">%s%s%s</li>'
,$page == 1?'':sprintf('<a href="%s">',str_replace($page_flag,1,$base_path))
,'First'
,$page == 1?'':'</a>'
);
$return.= sprintf(
'<li class="previous">%s%s%s</li>'
,$page == 1?'':sprintf('<a href="%s">',str_replace($page_flag,($page-1),$base_path))
,'Previous'
,$page == 1?'':'</a>'
);
foreach(range($page_start,$page_end,1) as $i) {
$return.= sprintf(
'<li%s>%s%s%s</li>'
,$page == $i?' class="current"':''
,$page == $i?'':sprintf('<a href="%s">',str_replace($page_flag,$i,$base_path))
,$i
,$page == $i?'':'</a>'
);
}
$return.= sprintf(
'<li class="next">%s%s%s</li>'
,$page == $total_pages?'':sprintf('<a href="%s">',str_replace($page_flag,($page+1),$base_path))
,'Next'
,$page == $total_pages?'':'</a>'
);
$return.= sprintf(
'<li class="last">%s%s%s</li>'
,$page == $total_pages?'':sprintf('<a href="%s">',str_replace($page_flag,$total_pages,$base_path))
,'Last'
,$page == $total_pages?'':'</a>'
);
$return.= sprintf('</ul>');
return $return;
}
/*
* Get current page
*/
public function getPage() {
return $this->_arrConfig['page'];
}
}
class Action {
private $_objXML;
private $_boolAscending = true;
private $_arrMessages = array();
public function __construct($boolAscending=true) {
/*
* Set ordering
*/
$this->_boolAscending = $boolAscending;
$strXML =
'<sayings>
<message>
<vdate>2010-06-01 00:48:21</vdate>
<msgpost>xxxxx</msgpost>
</message>
<message>
<vdate>2010-06-09 00:48:21</vdate>
<msgpost>xxxxx</msgpost>
</message>
<message>
<vdate>2010-02-09 00:48:21</vdate>
<msgpost>xxxxx</msgpost>
</message>
<message>
<vdate>2010-02-09 00:48:21</vdate>
<msgpost>xxxxx</msgpost>
</message>
<message>
<vdate>2009-06-09 00:48:21</vdate>
<msgpost>xxxxx</msgpost>
</message>
</sayings>';
/*
* transform timestamps
*/
$objXML = simplexml_load_string($strXML);
foreach($objXML->children() as $message) {
$message->vdate = strtotime((string) $message->vdate);
}
$strStyle =
'<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xsl:template match="/">
<xsl:call-template name="content">
</xsl:call-template>
</xsl:template>
<xsl:template name="content">
<sayings>
<xsl:for-each select="/sayings/message">
<xsl:sort select="vdate" data-type="number" order="'.($this->_boolAscending?'ascending':'descending').'"/>
<message>
<vdate><xsl:value-of select="vdate"/></vdate>
<msgpost><xsl:value-of select="msgpost"/></msgpost>
</message>
</xsl:for-each>
</sayings>
</xsl:template>
</xsl:stylesheet>';
/*
* Load message DOM document
*/
$objMessage = new DOMDocument();
$objMessage->loadXML($objXML->asXML());
/*
* Load transform DOM document
*/
$objStylesheet = new DOMDocument();
$objStylesheet->loadXML($strStyle);
/*
* Create XSLT processor ansd set stylesheet
*/
$objXSLT = new XSLTProcessor();
$objXSLT->importStylesheet($objStylesheet);
/*
* apply transform
*/
$this->_objXML = simplexml_load_string($objXSLT->transformToXML($objMessage));
}
public function paginate($offset,$limit) {
$arrMessages = $this->_objXML->xpath('message');
if(isset($arrMessages[$offset])) {
for($i=0;$i<$limit;$i++) {
if(!isset($arrMessages[($i+$offset)])) break;
$this->_arrMessages[] = array(
'vdate'=>(string) $arrMessages[($i+$offset)]->vdate
,'msgpost'=>(string) $arrMessages[($i+$offset)]->msgpost
);
}
}
// return number of total found rows
return count($arrMessages);
}
public function getMessages() {
return $this->_arrMessages;
}
}
// set ordering
$order = isset($_GET['order']) && in_array($_GET['order'],array('asc','desc'))?$_GET['order']:'asc';
$action = new Action(strcmp($order,'asc') == 0?true:false);
$func = create_function('$offset,$limit,$action','return $action->paginate($offset,$limit);');
$pg = new Pagination($func,array(
'basePath'=>$_SERVER['PHP_SELF'].'?p={replace_me_with_page}&order='.$order
,'pageFlag'=>'{replace_me_with_page}'
,'label'=>'Messages'
,'limit'=>5
,'page'=>isset($_GET['p']) && is_numeric($_GET['p']) && $_GET['p'] != 0?$_GET['p']:1
,'visiblePages'=>5
,'display_pages'=>0
,'display_entity'=>0
),array($action));
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>Untitled</title>
<style type="text/css">
.pagination {
text-align: center;
}
.pagination li {
display: inline-block;
}
*+html .pagination li {
display: inline;
}
* html .pagination li {
display: inline;
}
</style>
</head>
<body>
<?php
printf(
'<a href="%s?p=%u&order=%s">%s</a>'
,$_SERVER['PHP_SELF']
,$pg->getPage()
,strcmp($order,'desc') == 0?'asc':'desc'
,strcmp($order,'desc') == 0?'Ascending':'Descending'
);
?>
<?php $paging = $pg->paginate(); ?>
<?php echo $paging; ?>
<?php
if($action->getMessages()) {
echo '<ol>';
foreach($action->getMessages() as $arrMessage) {
printf(
'<li>
<p>%s</p>
<p>%s</p>
</li>'
,date('Y-m-d, H:i:s',$arrMessage['vdate'])
,$arrMessage['msgpost']
);
}
echo '</ol>';
} else {
echo "<p>No messages available</p>";
}?>
<?php echo $paging; ?>
</body>
</html>
Bookmarks