<?php
/**************************************
file: class.paging.php
php分页类代码
**************************************/
class paging{
var $sql_results;
var $sql_query;
var $display_offset;
var $display_limit;
var $display_limit_URI;
var $display_currentpage;
var $display_totalpages;
var $alt_content_count;
var $display_offset_var;
var $display_limit_var;
var $display_mid_offset;
var $display_link_first;
var $display_link_prev;
var $display_link_next;
var $display_link_last;
var $page_filename;
var $page_uri;
var $content;
var $content_type;
var $content_count;
## CONSTRUCTOR
function paging($offsetVar='offset',$limit=10,$midOffset=2){
$this->display_offset = isset($_REQUEST[$offsetVar])?$_REQUEST[$offsetVar]:0;
$this->display_limit = is_numeric($limit)?$limit:10;
$this->display_mid_offset = $midOffset;
$this->display_offset_var = $offsetVar;
$this->display_currentpage= ceil($this->display_offset / $this->display_limit);
}
## HANDLE DATA
function setContent($content){
if( is_array($content) )
$this->content_type = 'array';
$this->content = $content;
$this->private_contentDetails();
$this->getLinks();
}
function private_contentDetails(){
if( $this->content_type == 'array' )
$this->content_count = count($this->content);
}
function getContent(){
$returnAry = array();
for(
$i=$this->display_offset;
$i< min( $this->content_count, $this->display_offset+$this->display_limit );
++$i
)
array_push($returnAry,$this->content[$i]);
return $returnAry;
}
## LINKS TO NAVIGATE
function getLinks(){
$this->getNextLink('');
$this->getFirstLink('');
$this->getLastLink('');
$this->getPrevLink('');
}
function getNext(){
return $this->display_link_next;
}
function getPrev(){
return $this->display_link_prev;
}
function getFirst(){
return $this->display_link_first;
}
function getLast(){
return $this->display_link_last;
}
function getNextLink($caption){
// Check if we're counting content or the alternate user provided count
if( $this->alt_content_count )
$count = $this->alt_content_count;
else
$count = $this->content_count;
if( $this->display_offset+$this->display_limit-$count >=0 ){
$this->display_link_next = $this->display_offset;
}else{
$this->display_link_next = min(
$count-1,
$this->display_offset+$this->display_limit
);
}
return $this->buildLink( $this->buildNewURI( $this->display_link_next), $caption );
}
function getPrevLink($caption){
$this->display_link_prev = max(
0,
$this->display_offset-$this->display_limit
);
return $this->buildLink( $this->buildNewURI( $this->display_link_prev), $caption );
}
function getFirstLink($caption){
$this->display_link_first = 0;
return $this->buildLink( $this->buildNewURI( $this->display_link_first), $caption );
}
function getLastLink($caption){
$this->display_link_last = $this->content_count-$this->display_limit;
return $this->buildLink( $this->buildNewURI( $this->display_link_last), $caption );
}
## NUMBERS
function getPageCount(){
if( $this->alt_content_count )
$count = $this->alt_content_count;
else
$count = $this->content_count;
$this->display_totalpages = ceil(
$count / $this->display_limit
);
return $this->display_totalpages;
}
function getPageNumbers(){
// define variables
$midOffset = $this->display_mid_offset;
$firstLink = $this->display_link_first;
$pageCount = $this->getPageCount();
$thisPage = $this->display_currentpage;
$limit = $this->display_limit;
$displayed=$midOffset*2+1;
$returnAry=array();
// dots
$returnAry['afterdot'] = '';
$returnAry['beforedot'] = '';
// if two times and center the number is less than all the pages together
if( ($midOffset*2+1) < $pageCount ){
$min = max($firstLink,$thisPage-$midOffset);
$max = min($pageCount,$thisPage+$midOffset+1);
$total = $max-$min;
// this keeps x a
linuxjishu/9952.html target=_blank class=infotextkey>mount of pages displayed even if
// you're not in mid cause of page 1 or 2
if($total<$displayed){
if($min==0){
$max+=$displayed-$total;
}
if($max==$pageCount){
$min-=$displayed-$total;
}
}
}else{
# Just output a set of numbers
$min = 0;
$max = $pageCount;
}
// run pages, check for current page and name it
for($i=$min;$i<$max;++$i){
$cp = 'no';
if($thisPage==$i)
$cp = 'yes';
if($max!=$pageCount)
$returnAry['afterdot'] = '...';
if($min>0)
$returnAry['beforedot'] = '...';
array_push($returnAry,
array(
'currentPage'=>$cp,
'pageNumber'=>($i+1),
'pageLink'=>$this->buildLink( $this->buildNewURI( ($i*$limit) ), ($i+1) )
)
);
}
return $returnAry;
}
function makePageNumbers($format, $pages,$boldCurrent=true,$separator=' '){
$retPages = '';
// make actual page numbers
foreach($pages as $key => $value):
if(is_numeric($key))
$retPages .= ('yes'==$value['currentPage'] && $boldCurrent)?'<b>'.$value['pageLink'] .'</b>'.$separator:$value['pageLink'].$separator;
endforeach;
$format = str_replace( array('{beforedot}',
'{afterdot}',
'{pages}',
'{separator}'),
array( $pages['beforedot'],
$pages['afterdot'],
$retPages),
$format);
return $format;
}
## CHECKS
function isFirstPage(){
if($this->display_currentpage==0)
return true;
return false;
}
function isLastPage(){
// add one because basis is 0, not 1
if($this->display_currentpage+1==$this->getPageCount())
return true;
return false;
}
## FUNCTIONS
function getPageName(){
$fileName = explode('/',$_SERVER['REQUEST_URI']);
$fileName = $fileName[count($fileName)-1];
if(strpos($fileName,'?')>0) {
$fileName = explode('?',$fileName);
$fileName = $fileName[0];
}
return $fileName;
}
function getCleanURI(){
$URI = $_SERVER['REQUEST_URI'];
if(strpos($URI,'?')>0){
$URI = explode('?',$URI);
$URI = $URI[1];
$URI = preg_replace('/b'.$this->display_offset_var.'b[=0-9&]{2,20}/','',$URI);
//$URI = preg_replace('/b'.$this->display_limit_var.'b[=0-9&]{2,20}/','',$URI);
return $URI;
}
return false;
}
function buildNewURI($offset){
$newFile = $this->getPageName() . '?' . $this->getCleanURI();
$lastChar = substr($newFile,strlen($newFile)-1,1);
if( $lastChar != '&' && $lastChar != '?' )
$newFile.='&';
$newFile .= $this->display_offset_var.'='.$offset.'&';
//$newFile .= $this->display_limit_var.'='.$limit.'&';
return $newFile;
}
function buildLink( $href, $caption, $target=NULL ){
if( $target != NULL )
$target = ' target="'.$target.'"';
return '<a href="'.$href.'"'.$target.'>'.$caption.'</a>';
}
function encodeURI($str){
$salt = 'falaful';
$str = strrev($salt.$str);
return base64_encode($str);
}
function decodeURI($str){
$salt = 'falaful';
$str = strrev( base64_decode($str) );
$str = substr( $str, strlen($salt), strlen($str) );
return $str;
}
##############
#
#These functions are for inputting a query for this
#class to execute. The other functions will grab all
#x amount of rows then truncate it. These functions will
#only limit to whatever amount. This improves performance.
#Reason is so you dont grab 1,000,000 rows when you want 3.
#
##############
function runWQuery($db, $statement, $table, $where=''){
// get total rows
$db->query( 'SELECT COUNT(*) AS count FROM '. $table . ' ' . $where );
$db->movenext();
$this->alt_content_count = $db->col['count'];
// add limit to query
$where .= ' LIMIT ' . $this->display_offset .', '.$this->display_limit;
// save query
$this->sql_query = $statement . ' FROM ' . $table .' '. $where;
// print query
//echo $this->sql_query;
// run query
$db->query( $this->sql_query );
$this->sql_results = array();
// save results
while($db->movenext()){
array_push($this->sql_results , $db->col);
}
return $this->runQueryActions();
}
function runQueryActions(){
$this->setContent( $this->sql_results );
$pages = $this->getPageNumbers();
// make actual page numbers
$retPages = $this->makePageNumbers( '{beforedot} {pages} {afterdot}', $pages, true, ' ' );
// get new display
return array(
'content'=>$this->sql_results,
'pages'=>$retPages
);
}
}
?>