最近正在學習php,想拿一些demo來練習一下,想起前段時間自己用.net寫的仿Aspnetpager控件的分頁類,就琢磨着用PHP來實現仿aspnetpager的分頁功能,隨便復習下。
基本邏輯思路和.net的一樣,就是將通過實體類來進行配置換成了通過數組進行配置,邏輯比較簡單,根據條件判斷拼接分頁html。
有以下幾個簡單的功能:
1:支持相關按鈕的顯示與否配置
2:支持每頁數目,文本名稱,html標簽類名稱的自由配置
3:支持url重寫過的頁面(需自己在配置數組中添加重寫規則)
簡單吧,還是直接上代碼:
核心代碼:pager.class.php
View Code
<?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的圖片:

由於小弟最近剛剛學習php,代碼中出現的不規范,低效率,冗余或者設計問題還請大家多多指教。
