PHP通用分页类(支持php,ajax,html) v1.1.20100329修正版

<?php
/**
 * 通用分页类
 * Author:Zero QQ:93133
 * ver 1.2.20120519 修正版
 */

class pagination{
 private $pstyle=array();
 private static $url=array();
 public $arg=array();
 public $cfg=array(
  'text'=>array('首页','上一页','下一页','尾页'),
  'pagesize'=>20,
  //htmltpl=> "list{\$page}.shtml",
  'listtpl'=>'[{$page}]',//仿搜索引擎页模板
  'tpl'=>array('t','条','l','s'),  //默认调用方式
  //  total=>0  记录总数
  //'attachtotal'=>false
  );
 public $totalpage;  //总页数
 
 function __construct(array $cfg){
  is_numeric($cfg['total'])&&$cfg['total']>=0 or exit('必须传入有效记录数');
  if(!is_numeric($cfg['pagesize'])||$cfg['pagesize']<=0) unset($cfg['pagesize']);
  $this->cfg=array_merge($this->cfg,$cfg);
    //计算分页总数
  $this->totalpage=ceil($this->cfg['total']/$this->cfg['pagesize']);
  if($this->cfg['page']){  //传入当前页 适合html,ajax 需同时传入cfg[htmltpl]才起作用
   $this->arg['page']=$this->cfg['page'];
  }
  else{
   //分析URL中的当前页
   //2011-5-29修改分析方法,以兼容URL重写后的地址
   self::$url or self::$url=parse_url($_SERVER['REQUEST_URI']);
   parse_str($this->cfg['arg']?$this->cfg['arg']:self::$url['query'],$this->arg);
   
   $this->arg['page']=is_numeric($this->arg['page'])&&$this->arg['page']<=$this->totalpage?abs(ceil($this->arg['page'])):1;
  }

  //客户端缓存记录总数
  ($this->cfg['total']>8000||$this->totalpage>400)&&!isset($this->cfg['attachtotal']) and $this->cfg['attachtotal']=true;
  
  $this->cfg['attachtotal']&&!self::totalcache() and self::totalcache($this->cfg['total']);
  
 }
 
 public static function totalcache($total=null,$cachetime=3600){
  self::$url or self::$url=parse_url($_SERVER['REQUEST_URI']);
  $urlparts=self::$url;
  parse_str($urlparts['query'],$urlparts['query']);
  unset($urlparts['query']['page'],$urlparts['query']['ajax']);
  //header('sdfsdf:'.serialize($urlparts));
  $key='_total_'.md5(serialize($urlparts));
  if($total!=null){ //设置缓存
   setcookie($key,$total,$_SERVER['REQUEST_TIME']+$cachetime);
  }
  else{ //获取缓存
   return $_COOKIE[$key];
  }
 }
 
 /**
  * 创建翻页链接
  *
  * @param int $page 页数
  * @return string 链接字符串
  *
  */
 
 private function buildurl($page){
  if(!is_numeric($page)){ //javascript select控件翻页
   $arg=$this->arg;
   $arg['page']='{page}';
   $url= '\'?'.http_build_query($arg)."'.replace(escape('{page}'),$page)";
  }
  elseif(is_numeric($this->arg['page'])&&$this->cfg['htmltpl']){ //静态翻页
   
   $url=str_replace('{$page}',$page==1?null:$page,$this->cfg['htmltpl']);
  }
  else{ //PHP翻页
   $arg=$this->arg;
   $arg['page']=$page;
   
   
   if($this->cfg['ajax']){
    if(isset($_SERVER['HTTP_X_REQUESTED_WITH'])){  //ajax翻页
     $οnclick="\" οnclick=\"{$this->cfg['ajax']}.call(this,$page);return false";
     $path=self::$url['path'];
    }
    else{
     unset($arg['ajax']);
    }
   }
   $query= '?'.http_build_query($arg);
   $url=$path.$query.$onclick;
  }
  return $url; 
 }
 
 /**
  * 文本输入框样式
  *
  */
 
 private function i(){
  $this->pstyle[]='跳转<input type="text" title="输入页数,按回车跳转" style="width:30px;text-align:center" οnkeydοwn="javascript:if(event.keyCode==13){'.($this->cfg['ajax']?$this->buildurl('this.value'):"location.href={$this->buildurl('this.value')};return false;}").'" />页';
 }
 
 /**
  * 下拉列表
  *
  */
 
 private function s(){
  if($this->totalpage>300) return $this->i(); //大于300页,用输入方式代替
  $str='<select size="1" οnchange="'.($this->cfg['ajax']?$this->buildurl('this.value'):"location.href={$this->buildurl('this.value')}").'">';
  for($i=1;$i<=$this->totalpage;$i++){
   $str.="<option value='$i'".($this->arg['page']==$i?' selected':null).">第{$i}页</option>";
  }
  $str.="</select>";
  $this->pstyle[]=$str;
 }
 
 /**
  * 首页样式
  *
  */
 
 private function f($show=true){
  $this->pstyle[]=$this->arg['page']==1&&$show? $this->cfg['text'][0]:"<a href=\"{$this->buildurl(1)}\">{$this->cfg['text'][0]}</a>";
 }
 
 /**
  * 尾页样式
  *
  */
 
 private function e($show=true){
  $this->pstyle[]=$this->arg['page']==$this->totalpage&&$show? $this->cfg['text'][3]:"<a href=\"{$this->buildurl($this->totalpage)}\">{$this->cfg['text'][3]}</a>";
  
 }
 
 /**
  * 上一页样式
  *
  */
 
 private function p($show=true){
  $this->pstyle[]=$this->arg['page']<2&&$show? $this->cfg['text'][1]:"<a href=\"{$this->buildurl($this->arg['page']-1)}\">{$this->cfg[text][1]}</a>";
 }
 
 /**
  * 下一页样式
  *
  */
 
 private function n($show=true){
  $this->pstyle[]=$this->arg['page']>=$this->totalpage&&$show? $this->cfg['text'][2]:"<a href=\"{$this->buildurl($this->arg['page']+1)}\">{$this->cfg['text'][2]}</a>";
 }
 
 
 
 /**
  * 搜索引擎分页
  *
  * @param int $limit 最大左右偏移量之和
  * @param int $lstyle 样式
  * @return string 样式字符串
  *
  */
 private function l($limit=7,$lstyle=1){
  $a=floor($limit/2);  //左右偏移量
  $l=$this->arg['page']-$a;$r=$this->arg['page']+$a;  //默认偏移量
  $l<$a-1&&$r+=1-$l;//如果左不足
  
  if($r>$this->totalpage){//如果右不足
   $l-=$r-$this->totalpage;
   $r=$this->totalpage;
  }
  $l<1&&$l=1;
  //输出
  switch ($lstyle){
   case '0':
    for($i=$l;$i<=$r;$i++){
     $output.=' '.($this->arg['page']==$i? str_replace('{$page}',$i,$this->cfg['listtpl']):"<a href=\"{$this->buildurl($i)}\">".str_replace('{$page}',$i,$this->cfg['listtpl'])."</a>").' ';
    }
    break;
   case '1':
    $l>1&&$output="<a href=\"{$this->buildurl(1)}\">".str_replace('{$page}',1,$this->cfg['listtpl'])."</a>";
    $l>2&&$output.='...';
    for($i=$l;$i<=$r;$i++){
     $output.=' '.($this->arg['page']==$i? "<strong>$i</strong>":"<a href=\"{$this->buildurl($i)}\">".str_replace('{$page}',$i,$this->cfg['listtpl'])."</a>").' ';
    }
    $r<$this->totalpage-1&&$output.='...';
    $r<=$this->totalpage-1&&$output.="<a href=\"{$this->buildurl($this->totalpage)}\">".str_replace('{$page}',$this->totalpage,$this->cfg['listtpl'])."</a>";
  }
  $this->pstyle[]=$output;
 }
 /**
  * 取得记录总数
  *
  */
 private function t(){
  $this->pstyle[]=$this->cfg['total'];
 }
 /**
  * 取得总页数
  *
  */
 private function tp(){
  $this->pstyle[]=$this->totalpage;
 }
 
 /**
  * 创建完整分页样式
  *
  * @param string $space 各部分合并间隔符号
  * @return string 完整分页字符串
  *
  */
 public function create($space=' '){
  foreach($this->cfg['tpl'] as $arg){
   if(is_array($arg)){
    if(method_exists($this,$func=array_shift($arg))){
     call_user_func_array(array($this,$func),$arg);
    }
    else{
     $this->pstyle[]=$func;
    }
   }
   else{
    if(method_exists($this,$arg)){
     call_user_func(array($this,$arg));
    }
    else{
     $this->pstyle[]=$arg;
    }
   }
   
  }
  return implode($space,$this->pstyle);
 }
 
}


/*
调用方法:

例1:默认调用

$pageination=new pagination(array(total=>200));   //必选参数total
echo $pageination->create();

例2:设置更多参数

$pageination=new pagination(array(total=>200,pagesize=>30,text=>array(|<,<,>,>|),tpl=>array(t,'条/',tp,'页',l,s)));   //必选参数total,tpl内数组对应类中的函数名,如果函数不存在则按顺序原样显示出来
echo $pageination->create();

例3:复杂调用

$pageination=new pagination(array(total=>200,pagesize=>30,text=>array(|<,<,>,>|),tpl=>array(t,'条/',tp,'页',array(l,9,0),s)));  

echo $pageination->create();

例4:ajax 调用

$pageination=new pagination(array(total=>200,ajax=>'loadlist')); //将在页的链接上使用javascript loadlist函数 带有一个参数是页数 即调用如 loadlist(5).

echo $pageination->create();

例5:静态页调用

$pageination=new pagination(array(total=>200,page=>1,htmltpl=>'list{$page}.shtml')); //将生成模板格式静态分页 $pageination->arg[page]=n 来改变当前页

echo $pageination->create();

注:以上方法除了PHP翻页(默认)方式,其他方式均未测试,有问题欢迎与我联系,大家一起探讨完善

*/

?>


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值