PHP通用分页类(支持php,ajax,html) v1.1.20100329修正版
来源:互联网 发布:开心网域名被抢注案例 编辑:程序博客网 时间:2024/05/29 16:57
<?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翻页 $onclick="\" onclick=\"{$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" onkeydown="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" onchange="'.($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)); //必选参数totalecho $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翻页(默认)方式,其他方式均未测试,有问题欢迎与我联系,大家一起探讨完善*/?>
- PHP通用分页类(支持php,ajax,html) v1.1.20100329修正版
- php通用分页类
- php通用分页类
- PHP通用分页类
- php通用分页类
- PHP通用分页类
- “PHP通用检测函数集合”修正版
- php通用分页类“升级”
- php通用分页类代码
- php页面分页类通用
- PHP通用分页类-page.php
- 【PHP分页】Zebra_Pagination - 通用分页类
- PHP通用分页组件
- PHP ajax 分页类代码
- PHP通用分页(Pager)类
- PHP通用分页(Pager)类
- Ajax+PHP分页演示
- PHP ajax分页
- Table Name Fixer
- 我刚玩上了 穿越火线 有谁能告诉我开透视么····
- 一元多项式运算
- 藏地密码1: 阅读完毕 用时1天
- 进制转换(十进制转n进制)
- PHP通用分页类(支持php,ajax,html) v1.1.20100329修正版
- 精简ASP购物车类(Session+XML)
- ubuntu + emacs + fcitx 中文输入解决方案
- JDK6中系统托盘(tray)的使用方法
- Javascript 脚本的调试经验
- 研究字符串转Unicode额外2个字节的来源
- 简化事件和委托
- C#接口基础
- Silverlight Beta 2 與 RC