仿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运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
php中一个完整表单处理实现代码
Nov 10 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
使用CodeIgniter的类库做图片上传
Jun 12 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
ThinkPHP开发框架函数详解:C方法
Aug 14 PHP
Smarty模板引擎缓存机制详解
May 23 PHP
php UNIX时间戳用法详解
Feb 16 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 PHP
php/JS实现的生成随机密码(验证码)功能示例
Jun 06 PHP
浅谈laravel-admin的sortable和orderby使用问题
Oct 03 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
颠覆常识!无色透明的咖啡诞生了(中日双语)
2021/03/03 咖啡文化
Zend Framework自定义Helper类相关注意事项总结
2016/03/14 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
jQuery 性能优化指南(2)
2009/05/21 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
pm2发布node配置文件ecosystem.json详解
2019/05/15 Javascript
微信小程序实现搜索历史功能
2020/03/26 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
Python中对列表排序实例
2015/01/04 Python
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
Python日期的加减等操作的示例
2017/08/15 Python
PyQt5实现拖放功能
2018/04/25 Python
python复制文件到指定目录的实例
2018/04/27 Python
python版本五子棋的实现代码
2018/12/11 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
pygame实现五子棋游戏
2019/10/29 Python
python能做哪方面的工作
2020/06/15 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
深入剖析webstorage[html5的本地数据处理]
2016/07/11 HTML / CSS
业务员岗位职责范本
2013/12/15 职场文书
环保建议书
2014/03/12 职场文书
就业协议书的作用
2014/04/11 职场文书
律师授权委托书范本
2014/10/07 职场文书
委托书格式范文
2015/01/28 职场文书
六一儿童节开幕词
2015/01/29 职场文书
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js