仿Aspnetpager的一个PHP分页类代码 附源码下载


Posted in PHP onOctober 08, 2012

基本逻辑思路和.net的一样,就是将通过实体类来进行配置换成了通过数组进行配置,逻辑比较简单,根据条件判断拼接分页html。

有以下几个简单的功能:

1:支持相关按钮的显示与否配置
2:支持每页数目,文本名称,html标签类名称的自由配置
3:支持url重写过的页面(需自己在配置数组中添加重写规则)

简单吧,还是直接上代码:

核心代码:pager.class.php

<?php 
class pager{ 
//分页的参数配置 
private $config=array( 
//首页按钮的文本文字 
"first_btn_text"=>"首页", 
//上一页按钮的文本文字, 
"pre_btn_text"=>"上一页", 
//下一页的文本文字 
"next_btn_text"=>"下一页", 
//最后一页的文本文字, 
"last_btn_text"=>"末页", 
//总记录数 *必需 
"record_count"=>0, 
//每页分页尺寸 
"pager_size"=>10, 
//当前页码 *必需 
"pager_index"=>1, 
//每页显示的最大数量按钮 
"max_show_page_size"=>10, 
//页码在浏览器中传值的名称 默认为page 
"querystring_name"=>"page", 
//URL是否重写 默认为flase 
"enable_urlrewriting"=>false, 
//url重写规则 例如page/{page} 其中{page}就是代表页数 
"urlrewrite_pattern"=>"", 
//分页容器的css名称 
"classname"=>"paginator", 
//当前页按钮的class名称 
"current_btn_class"=>"cpb", 
//分页文字描述span标签的css 
"span_text_class"=>"stc", 
/*跳转的详细文本 
*totle代表总页数, 
*size代表每页数目 
* goto代表要跳转的输入框 
* record代表总记录数 
* index代表当前的页码 
*/ 
"jump_info_text"=>"共{totle}页,每页{size}条记录,跳转到{goto}页", 
//跳转按钮的文本 
"jump_btn_text"=>"确定", 
//是否显示跳转 
"show_jump"=>false, 
//是否展示前面的按钮 首页&上一页 
"show_front_btn"=>true, 
//是否展示后面的按钮 下一页&末页 
"show_last_btn"=>true 
); 
/* 
* 类的构造函数 
* $config:该分页类的配置 
*/ 
public function __construct($config) 
{ 
$this->init_config($config); 
} 
function __destruct() 
{ 
unset($this->config); 
} 
/* 
* 构造分页主函数 
*/ 
public function builder_pager() 
{ 
//分页的字符串 
$pager_arr=array(); 
//每页的尺寸 
$pager_size=$this->config["pager_size"]; 
//得到一共的分页数目 
$pager_num=$this->config["record_count"]%$pager_size==0?$this->config["record_count"]/$pager_size:floor($this->config["record_count"]/$pager_size)+1; 
//当前的页码序号 如果是0,则置为1 
$pager_index=round($this->config["pager_index"])==0?1:round($this->config["pager_index"]); 
//如果当前的页码大于等于最后一页,则当前的页码置为最后一页 
$pager_index=$pager_index>=$pager_num?$pager_num:$pager_index; 
//下一页的页码 
$pager_next=$pager_index>=$pager_num?$pager_num:($pager_index+1); 
//获取需要跳转 的url 
$url=$this->get_url(); 
//添加开头的div 
$classname=$this->config["classname"]; 
$pager_arr[]="<div class=\"$classname\">\n"; 
//添加前面两个按钮的html 
if($this->config["show_front_btn"]) 
{ 
//如果当前的页码为1 则front这两个按钮则会被禁用 
$attr=$pager_index==1?"disabled=disabled":""; 
$pager_arr[]=$this->get_a_html(self::format_url($url,1),$this->config["first_btn_text"],$attr); 
$pager_arr[]=$this->get_a_html(self::format_url($url,$pager_index-1),$this->config["pre_btn_text"],$attr); 
} 
//当前显示页码的起始 1~10 1 11~20 11 
$current_pager_start=$pager_index%$pager_size==0?($pager_index/$pager_size-1)*$pager_size+1:floor($pager_index/$pager_size)*$pager_size+1; 
//当前显示页码的结束 
$current_pager_end=($current_pager_start+$pager_size-1)>=$pager_num?$pager_num:($current_pager_start+$pager_size-1); 
//添加跳转到上一层的html 
if($pager_index>$pager_size) 
{ 
$pager_arr[]=$this->get_a_html(self::format_url($url,$current_pager_start-1),"..."); 
} 
//主体页码部分 
for($i=$current_pager_start;$i<=$current_pager_end;$i++) 
{ 
if($i!=$pager_index) 
{ 
$pager_arr[]=$this->get_a_html(self::format_url($url,$i),$i); 
}else{ 
//如果这个是当前页 
$pager_arr[]=$this->get_span_html($i,$this->config["current_btn_class"]); 
} 
} 
//添加下一层的html 
if($pager_index<=($pager_num-$pager_num%$pager_size)) 
{ 
$pager_arr[]=$this->get_a_html(self::format_url($url,$current_pager_end+1),"..."); 
} 
//添加后面两个按钮的html 
if($this->config["show_last_btn"]) 
{ 
//如果当前的页码为最后一页 则last这两个按钮则会被禁用 
$attr=$pager_index>=$pager_num?"disabled=disabled":""; 
$pager_arr[]=$this->get_a_html(self::format_url($url,$pager_next),$this->config["next_btn_text"],$attr); 
$pager_arr[]=$this->get_a_html(self::format_url($url,$pager_num),$this->config["last_btn_text"],$attr); 
} 
//添加跳转的html 
if($this->config["show_jump"]) 
{ 
$patterns=array("/\{totle\}/","/\{size\}/","/\{goto\}/","/\{record\}/","/\{index\}/",); 
$replacements=array( 
$pager_num, 
$pager_size, 
"<input type=\"input\" id=\"jumpNum\" style=\"width:20px;\" name=\"jump\" value=\"".$pager_next."\" />\n", 
$this->config["record_count"], 
$this->config["pager_index"] 
); 
//替换特定的标签组成跳转 
$pager_arr[]=preg_replace($patterns,$replacements,$this->config["jump_info_text"]); 
$btn_text=$this->config['jump_btn_text']; 
$pager_arr[]="<a href=\"javascript:void(0);\" style=\"float:none;\" onclick=\"javascript:jump();\">".$this->config['jump_btn_text']."</a></span>\n"; 
$pager_arr[]=$this->get_jumpscript($url); 
} 
$pager_arr[]="</div>"; 
$this->config["pager_index"]=$pager_index; 
return implode($pager_arr); 
} 
/* 
*获取需要处理的url,支持重写配置,各种参数的url 
*/ 
private function get_url() 
{ 
//如果设置了允许url重写 
if($this->config["enable_urlrewriting"]) 
{ 
//得到调用文件所在的url 
$file_path="http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"]; 
//得到调用url所在的网络目录 
$file_path=substr($file_path,0,strripos($file_path,"/"))."/"; 
//直接将目录附加重写规则 形成新的url 
$url=$file_path.$this->config["urlrewrite_pattern"]; 
}else{ 
//得到当前调用页面的绝对url 
$url="http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"]; 
//分页参数在浏览器中传递的名称 
$querystring_name=$this->config['querystring_name']; 
//如果该url中包含php?的字符串 则需要将分页参数替换 
if(strpos($url,"php?")) 
{ 
//如果存在page=xxx的字样 
$pattern="/$querystring_name=[0-9]*/"; 
if(preg_match($pattern,$url)) 
{ 
//将含page=***的字样中的数字替换成{0} 
$url=preg_replace($pattern,"$querystring_name={page}",$url); 
}else{ 
$url.="&$querystring_name={page}"; 
} 
}else{ 
//直接附加参数形成分页的完整url 
$url.="?$querystring_name={page}"; 
} 
} 
return $url; 
} 
/* 
* 得到a标签的html 
*$url:a标签所要导向的html 
*$title:a标签的标题 
**$attr:a标签上的附加属性 可以不写 
*/ 
private static function get_a_html($url,$title,$attr="") 
{ 
return "<a href='$url' $attr style=\"margin-right:5px;\">$title</a>\n"; 
} 
/* 
* 获得span标签的html 
* $num:span中的文本,即页序号 
* $classname:span标签的class名称 
*/ 
private static function get_span_html($num,$classname) 
{ 
return "<span class=\"" .$classname. "\">$num</span>\n"; 
} 
/* 
* 格式化url 
* $url 原url 
* $page 页码 
*/ 
private static function format_url($url,$page) 
{ 
return preg_replace("/\{page\}$/",$page,$url); 
} 
/* 
*初始化分页的配置文件 
*如果在参数中不含该键值,则默认使用申明的值 
*/ 
private function init_config($config) 
{ 
//判断该值是否存在、是否是数组、是否含有记录 
if(isset($config)&&is_array($config)&&count($config)>0){ 
foreach($config as $key=>$val) 
{ 
$this->config[$key]=$val; 
} 
} 
} 
/* 
* 构造跳转功能脚本的方法 
*$url:需要跳转的额那个url 
*/ 
private function get_jumpscript($url) 
{ 
$scriptstr = "<script type=\"text/javascript\">\n". 
"function jump(){\n". 
"var jnum=document.getElementById(\"jumpNum\").value;\n". 
"if(isNaN(jnum)){\n". 
"alert(\"在跳转框中请输入数字!\");\n". 
"}\n". 
"else{\n". 
"var re=/\{page\}/\n". 
"location.href='$url'.replace(re,jnum);\n". 
"}\n". 
"}\n". 
"</script>\n"; 
return $scriptstr; 
} 
/* 
* php中构造类似.net中format方法的函数 
* 用法:format("hello,{0},{1},{2}", 'x0','x1','x2') 
*/ 
private function format() { 
$args = func_get_args(); 
if (count($args) == 0) { return;} 
if (count($args) == 1) { return $args[0]; } 
$str = array_shift($args); 
$str = preg_replace_callback('/\\{(0|[1-9]\\d*)\\}/', create_function('$match', '$args = '.var_export($args, true).'; return isset($args[$match[1]]) ? $args[$match[1]] : $match[0];'), $str); 
return $str; 
} 
} 
?>

直接用数组参数的方式调用
<?php 
$config1=array( 
"record_count"=>703, 
"pager_size"=>10, 
"show_jump"=>true, 
"pager_index"=>$_GET["page"] 
); 
$pager_simple=new pager($config1); 
echo $pager_simple->builder_pager(); 
?>

最后来看下demo的图片:
仿Aspnetpager的一个PHP分页类代码 附源码下载
由于小弟最近刚刚学习php,代码中出现的不规范,低效率,冗余或者设计问题还请大家多多指教。

demo源码下载

PHP 相关文章推荐
PHP安装全攻略:APACHE
Oct 09 PHP
main.php
Dec 09 PHP
用PHP连接MySQL代码的参数说明
Jun 07 PHP
php入门学习知识点七 PHP函数的基本应用
Jul 14 PHP
php中DOMElement操作xml文档实例演示
Mar 26 PHP
使用PHP curl模拟浏览器抓取网站信息
Oct 28 PHP
php格式输出文件var_export函数实例
Nov 15 PHP
浅析php-fpm静态和动态执行方式的比较
Nov 09 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
Dec 28 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
PHP7 整型处理机制修改
Mar 09 PHP
php随机输出名人名言的代码
Oct 07 #PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 #PHP
PHP面向对象学习笔记之一 基础概念
Oct 06 #PHP
php生成局部唯一识别码LUID的代码
Oct 06 #PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 #PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 #PHP
PHP中的生成XML文件的4种方法分享
Oct 06 #PHP
You might like
桌面中心(四)数据显示
2006/10/09 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
jQuery+.net实现浏览更多内容(改编php版本)
2013/03/28 Javascript
浅析JS刷新框架中的其他页面 &amp;&amp; JS刷新窗口方法汇总
2013/07/08 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
Bootstrap模仿起筷首页效果
2016/05/09 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
2016/05/16 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
jQuery实现文字超过1行、2行或规定的行数时自动加省略号的方法
2018/03/28 jQuery
Angular HMR(热模块替换)功能实现方法
2018/04/04 Javascript
[49:12]完美世界DOTA2联赛PWL S2 Magma vs GXR 第二场 11.29
2020/12/02 DOTA
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
PyQt Qt Designer工具的布局管理详解
2019/08/07 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
python 如何调用 dubbo 接口
2020/09/24 Python
html5使用Drag事件编辑器拖拽上传图片的示例代码
2017/08/22 HTML / CSS
Cotton On南非:澳洲时尚平价品牌
2018/06/28 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
小学教师寄语大全
2014/04/03 职场文书
工地宣传标语
2014/06/18 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
优秀班主任申报材料
2014/12/16 职场文书
Python实战之疫苗研发情况可视化
2021/05/18 Python
python基础入门之普通操作与函数(三)
2021/06/13 Python
MySQL优化及索引解析
2022/03/17 MySQL