分页类的源码分析
From:http://www.im286.com/viewthread.php?tid=1188679&extra=page%3D1
一个分页类的源码分析,添加了注释,帮助学习,添加的不好的地方欢迎指教
<?
/*
$pagebar=new pagebar(
array('URLGet'=> //URLGET附属参数
'PageVar'=> //Page的GET变量
'PageTemplate'=> //翻页栏模板
'PageMax'=> //每页最大行数
'NoPageHidden'=> //无内容时是否分页栏
'P_Length'=> //当前页之前显示的页码数目
'N_Length'=> //当前页之后显示的页码数目
'DisableButtonHidden'=> //隐藏失效的翻页链接
),$startno //返回的当前页起始行
);
*/
class pagebar {
var $pagedata;
//初始化Pagebar
function pagebar($data,&$startno) {
//获取用户提交的Pagebar参数(数组),参数保存到$this->pagedata
$this->pagedata=$data;
//根据参数返回给用户当前记录的起始行,用来执行Select的SQL语句
$startno=$_GET[$this->pagedata[PageVar]]*$this->pagedata[PageMax]+0;
}
//处理Pagebar
function process_pagebar($AllCount) {
//从参数中获取需要的变量
$PageNum=$this->pagedata[PageMax];
$url=$this->pagedata[URLGet];if ($url!='') $url.='&';
$url.="{$this->pagedata[PageVar]}=";
$p=$_GET[$this->pagedata[PageVar]];
$Content=$this->pagedata[Template];
//没有记录返回空
if ($AllCount==0 or $PageNum==0) {return '';}
//返回总页数
$count=$AllCount/$PageNum;
//如果总页数就一行
if ($count<=1) {
//如果不存在翻页则隐藏([NoPageHidden])参数存在那么返回空
if ($this->pagedata[NoPageHidden]) return "";
else return "<span title='当前共有".$AllCount."条记录'>[$AllCount]</span>";
}
//设置分页栏<select>元素
$psel="<select class=tplinp onchange="location.href='?{$url}'+this.value">";
for ($i=0;$i<$count;$i++) {
$psel.="<option value='$i' ";
if ($p==$i) {$psel.="selected";}
$psel.=">".($i+1)."</option>";
}$psel.="</select>";
//前页、下页,页号
$pp=$p-1;$np=$p+1;
//设置首页、前页、后页、尾页的链接头
$ppstr1="<a href='?{$url}0'>";if ($pp<0) {$ppstr1='';}
$ppstr="<a href='?{$url}$pp'>";if ($pp<0) {$ppstr='';}
$npstr="<a href='?{$url}$np'>";if ($np>=$count) {$npstr='';}
$npstr1="<a href='?{$url}".($i-1)."'>";if ($np>=$count) {$npstr1='';};
//获取分页栏,当前页页码显示的前后数
$j_s0=$this->pagedata[P_Length];$j_e0=$this->pagedata[N_Length];
//获取分页栏模板中的 页码链接子模板(<page_num>)
preg_match ("#<page_num>.+?</page_num>#s", $Content, $pndata);$pndata=$pndata[1];
$e_pndata=explode("|",$pndata);
//设置分页栏 页码链接 起始和终止页号
$j_s=$p-$j_s0;$j_e=$p+$j_e0;
if ($j_s<0) $j_s=0;
if ($j_e>$i) $j_e=$i;
//按照 页码链接子模版 内容设置 分页栏页码链接
for ($j=$j_s;$j<$j_e;$j++) {
if ($p==$j) {
$epn=$e_pndata[0];
$epn=str_replace ("#<num>#", ($j+1), $epn);
}
else {
$epn=$e_pndata[1];
$epn=str_replace ("<num>", ($j+1), $epn);
$epn=str_replace ("<numlink>", "<a href='?$url$j'>", $epn);
$epn=str_replace ("</numlink>", "</a>", $epn);
}
$pnstr.=$epn;
}
//把设置好的分页栏页码链接写回模板
$Content=preg_replace ("#<page_num>(.+?)</page_num>#s", $pnstr, $Content);
//无效链接如果设置了隐藏([DisableButtonHidden])那么进行隐藏
if ($this->pagedata[DisableButtonHidden]) {
if ($ppstr1=='') $Content=preg_replace ("#<page_first>.+?</page_first>#s", "", $Content);
if ($ppstr=='') $Content=preg_replace ("#<page_prev>.+?</page_prev>#s", "", $Content);
if ($npstr=='') $Content=preg_replace ("#<page_next>.+?</page_next>#s", "", $Content);
if ($npstr1=='') $Content=preg_replace ("#<page_last>.+?</page_last>#s", "", $Content);
}
//替换模板中首页、前页、后页、尾页为页码链接
$Content=preg_replace ("#<page_first>(.+?)</page_first>#s", "$ppstr11</a>", $Content);
$Content=preg_replace ("#<page_prev>(.+?)</page_prev>#s", "$ppstr1</a>", $Content);
$Content=preg_replace ("#<page_next>(.+?)</page_next>#s", "$npstr1</a>", $Content);
$Content=preg_replace ("#<page_last>(.+?)</page_last>#s", "$npstr11</a>", $Content);
//替换模板中<select>,总记录数,总页数
$Content=str_replace ("<page_select>", $psel, $Content);
$Content=str_replace ("<recordcount>", $AllCount, $Content);
$Content=str_replace ("<pagecount>", $i, $Content);
return $Content;
}
//编译Pagebar
function compile_pagebar($AllCount) {
//使用PHPSoMVC的模板类打开分页栏模板
$pagebar_tpl=new template($this->pagedata[PageTemplate]);
//编译分页栏模板
$this->pagedata[Template]=$pagebar_tpl->compile_template();
//分页栏模板未编译的部分,用处理Pagebar的函数进行处理
$page=$this->process_pagebar($AllCount);
return $page;
}
}