最近正在学习php,想拿一些demo来练习一下,想起前段时间自己用.net写的仿aspnetpager控件的分页类,就琢磨着用php来实现仿aspnetpager的分页功能,随便复习下。
基本逻辑思路和.net的一样,就是将通过实体类来进行配置换成了通过数组进行配置,逻辑比较简单,根据条件判断拼接分页html。
有以下几个简单的功能:
1:支持相关按钮的显示与否配置
3:支持url重写过的页面(需自己在配置数组中添加重写规则)
简单吧,还是直接上代码:
核心代码:pager.class.php
view code
php class pager{ //分页的参数配置 private $config=array( //首页按钮的文本文字 first_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_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[]=\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, \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[]=.$this->config['jump_btn_text'].\n; $pager_arr[]=$this->get_jumpscript($url); } $pager_arr[]=
; $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; } /**/ private static function get_a_html($url,$title,$attr=) { return $attr style=\margin-right:5px;\>$title\n; } /**/ private static function get_span_html($num,$classname) { return $classname. \>$num\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 = \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的图片:
由于小弟最近刚刚学习php,代码中出现的不规范,低效率,冗余或者设计问题还请大家多多指教。
demo源码下载