仿Aspnetpager的一個PHP分頁類代碼 附源碼下載
更新時間:2012年10月08日 20:11:16 作者:
最近正在學(xué)習(xí)php,想拿一些demo來練習(xí)一下,想起前段時間自己用.net寫的仿Aspnetpager控件的分頁類,就琢磨著用PHP來實現(xiàn)仿aspnetpager的分頁功能,隨便復(fù)習(xí)下
基本邏輯思路和.net的一樣,就是將通過實體類來進行配置換成了通過數(shù)組進行配置,邏輯比較簡單,根據(jù)條件判斷拼接分頁html。
有以下幾個簡單的功能:
1:支持相關(guān)按鈕的顯示與否配置
2:支持每頁數(shù)目,文本名稱,html標(biāo)簽類名稱的自由配置
3:支持url重寫過的頁面(需自己在配置數(shù)組中添加重寫規(guī)則)
簡單吧,還是直接上代碼:
核心代碼:pager.class.php
<?php
class pager{
//分頁的參數(shù)配置
private $config=array(
//首頁按鈕的文本文字
"first_btn_text"=>"首頁",
//上一頁按鈕的文本文字,
"pre_btn_text"=>"上一頁",
//下一頁的文本文字
"next_btn_text"=>"下一頁",
//最后一頁的文本文字,
"last_btn_text"=>"末頁",
//總記錄數(shù) *必需
"record_count"=>0,
//每頁分頁尺寸
"pager_size"=>10,
//當(dāng)前頁碼 *必需
"pager_index"=>1,
//每頁顯示的最大數(shù)量按鈕
"max_show_page_size"=>10,
//頁碼在瀏覽器中傳值的名稱 默認為page
"querystring_name"=>"page",
//URL是否重寫 默認為flase
"enable_urlrewriting"=>false,
//url重寫規(guī)則 例如page/{page} 其中{page}就是代表頁數(shù)
"urlrewrite_pattern"=>"",
//分頁容器的css名稱
"classname"=>"paginator",
//當(dāng)前頁按鈕的class名稱
"current_btn_class"=>"cpb",
//分頁文字描述span標(biāo)簽的css
"span_text_class"=>"stc",
/*跳轉(zhuǎn)的詳細文本
*totle代表總頁數(shù),
*size代表每頁數(shù)目
* goto代表要跳轉(zhuǎn)的輸入框
* record代表總記錄數(shù)
* index代表當(dāng)前的頁碼
*/
"jump_info_text"=>"共{totle}頁,每頁{size}條記錄,跳轉(zhuǎn)到{goto}頁",
//跳轉(zhuǎn)按鈕的文本
"jump_btn_text"=>"確定",
//是否顯示跳轉(zhuǎn)
"show_jump"=>false,
//是否展示前面的按鈕 首頁&上一頁
"show_front_btn"=>true,
//是否展示后面的按鈕 下一頁&末頁
"show_last_btn"=>true
);
/*
* 類的構(gòu)造函數(shù)
* $config:該分頁類的配置
*/
public function __construct($config)
{
$this->init_config($config);
}
function __destruct()
{
unset($this->config);
}
/*
* 構(gòu)造分頁主函數(shù)
*/
public function builder_pager()
{
//分頁的字符串
$pager_arr=array();
//每頁的尺寸
$pager_size=$this->config["pager_size"];
//得到一共的分頁數(shù)目
$pager_num=$this->config["record_count"]%$pager_size==0?$this->config["record_count"]/$pager_size:floor($this->config["record_count"]/$pager_size)+1;
//當(dāng)前的頁碼序號 如果是0,則置為1
$pager_index=round($this->config["pager_index"])==0?1:round($this->config["pager_index"]);
//如果當(dāng)前的頁碼大于等于最后一頁,則當(dāng)前的頁碼置為最后一頁
$pager_index=$pager_index>=$pager_num?$pager_num:$pager_index;
//下一頁的頁碼
$pager_next=$pager_index>=$pager_num?$pager_num:($pager_index+1);
//獲取需要跳轉(zhuǎn) 的url
$url=$this->get_url();
//添加開頭的div
$classname=$this->config["classname"];
$pager_arr[]="<div class=\"$classname\">\n";
//添加前面兩個按鈕的html
if($this->config["show_front_btn"])
{
//如果當(dāng)前的頁碼為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);
}
//當(dāng)前顯示頁碼的起始 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;
//當(dāng)前顯示頁碼的結(jié)束
$current_pager_end=($current_pager_start+$pager_size-1)>=$pager_num?$pager_num:($current_pager_start+$pager_size-1);
//添加跳轉(zhuǎn)到上一層的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{
//如果這個是當(dāng)前頁
$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"])
{
//如果當(dāng)前的頁碼為最后一頁 則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);
}
//添加跳轉(zhuǎn)的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"]
);
//替換特定的標(biāo)簽組成跳轉(zhuǎn)
$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,支持重寫配置,各種參數(shù)的url
*/
private function get_url()
{
//如果設(shè)置了允許url重寫
if($this->config["enable_urlrewriting"])
{
//得到調(diào)用文件所在的url
$file_path="http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"];
//得到調(diào)用url所在的網(wǎng)絡(luò)目錄
$file_path=substr($file_path,0,strripos($file_path,"/"))."/";
//直接將目錄附加重寫規(guī)則 形成新的url
$url=$file_path.$this->config["urlrewrite_pattern"];
}else{
//得到當(dāng)前調(diào)用頁面的絕對url
$url="http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
//分頁參數(shù)在瀏覽器中傳遞的名稱
$querystring_name=$this->config['querystring_name'];
//如果該url中包含php?的字符串 則需要將分頁參數(shù)替換
if(strpos($url,"php?"))
{
//如果存在page=xxx的字樣
$pattern="/$querystring_name=[0-9]*/";
if(preg_match($pattern,$url))
{
//將含page=***的字樣中的數(shù)字替換成{0}
$url=preg_replace($pattern,"$querystring_name={page}",$url);
}else{
$url.="&$querystring_name={page}";
}
}else{
//直接附加參數(shù)形成分頁的完整url
$url.="?$querystring_name={page}";
}
}
return $url;
}
/*
* 得到a標(biāo)簽的html
*$url:a標(biāo)簽所要導(dǎo)向的html
*$title:a標(biāo)簽的標(biāo)題
**$attr:a標(biāo)簽上的附加屬性 可以不寫
*/
private static function get_a_html($url,$title,$attr="")
{
return "<a href='$url' $attr style=\"margin-right:5px;\">$title</a>\n";
}
/*
* 獲得span標(biāo)簽的html
* $num:span中的文本,即頁序號
* $classname:span標(biāo)簽的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);
}
/*
*初始化分頁的配置文件
*如果在參數(shù)中不含該鍵值,則默認使用申明的值
*/
private function init_config($config)
{
//判斷該值是否存在、是否是數(shù)組、是否含有記錄
if(isset($config)&&is_array($config)&&count($config)>0){
foreach($config as $key=>$val)
{
$this->config[$key]=$val;
}
}
}
/*
* 構(gòu)造跳轉(zhuǎn)功能腳本的方法
*$url:需要跳轉(zhuǎn)的額那個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(\"在跳轉(zhuǎn)框中請輸入數(shù)字!\");\n".
"}\n".
"else{\n".
"var re=/\{page\}/\n".
"location.href='$url'.replace(re,jnum);\n".
"}\n".
"}\n".
"</script>\n";
return $scriptstr;
}
/*
* php中構(gòu)造類似.net中format方法的函數(shù)
* 用法: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;
}
}
?>
直接用數(shù)組參數(shù)的方式調(diào)用
<?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的圖片:

由于小弟最近剛剛學(xué)習(xí)php,代碼中出現(xiàn)的不規(guī)范,低效率,冗余或者設(shè)計問題還請大家多多指教。
demo源碼下載
有以下幾個簡單的功能:
1:支持相關(guān)按鈕的顯示與否配置
2:支持每頁數(shù)目,文本名稱,html標(biāo)簽類名稱的自由配置
3:支持url重寫過的頁面(需自己在配置數(shù)組中添加重寫規(guī)則)
簡單吧,還是直接上代碼:
核心代碼:pager.class.php
復(fù)制代碼 代碼如下:
<?php
class pager{
//分頁的參數(shù)配置
private $config=array(
//首頁按鈕的文本文字
"first_btn_text"=>"首頁",
//上一頁按鈕的文本文字,
"pre_btn_text"=>"上一頁",
//下一頁的文本文字
"next_btn_text"=>"下一頁",
//最后一頁的文本文字,
"last_btn_text"=>"末頁",
//總記錄數(shù) *必需
"record_count"=>0,
//每頁分頁尺寸
"pager_size"=>10,
//當(dāng)前頁碼 *必需
"pager_index"=>1,
//每頁顯示的最大數(shù)量按鈕
"max_show_page_size"=>10,
//頁碼在瀏覽器中傳值的名稱 默認為page
"querystring_name"=>"page",
//URL是否重寫 默認為flase
"enable_urlrewriting"=>false,
//url重寫規(guī)則 例如page/{page} 其中{page}就是代表頁數(shù)
"urlrewrite_pattern"=>"",
//分頁容器的css名稱
"classname"=>"paginator",
//當(dāng)前頁按鈕的class名稱
"current_btn_class"=>"cpb",
//分頁文字描述span標(biāo)簽的css
"span_text_class"=>"stc",
/*跳轉(zhuǎn)的詳細文本
*totle代表總頁數(shù),
*size代表每頁數(shù)目
* goto代表要跳轉(zhuǎn)的輸入框
* record代表總記錄數(shù)
* index代表當(dāng)前的頁碼
*/
"jump_info_text"=>"共{totle}頁,每頁{size}條記錄,跳轉(zhuǎn)到{goto}頁",
//跳轉(zhuǎn)按鈕的文本
"jump_btn_text"=>"確定",
//是否顯示跳轉(zhuǎn)
"show_jump"=>false,
//是否展示前面的按鈕 首頁&上一頁
"show_front_btn"=>true,
//是否展示后面的按鈕 下一頁&末頁
"show_last_btn"=>true
);
/*
* 類的構(gòu)造函數(shù)
* $config:該分頁類的配置
*/
public function __construct($config)
{
$this->init_config($config);
}
function __destruct()
{
unset($this->config);
}
/*
* 構(gòu)造分頁主函數(shù)
*/
public function builder_pager()
{
//分頁的字符串
$pager_arr=array();
//每頁的尺寸
$pager_size=$this->config["pager_size"];
//得到一共的分頁數(shù)目
$pager_num=$this->config["record_count"]%$pager_size==0?$this->config["record_count"]/$pager_size:floor($this->config["record_count"]/$pager_size)+1;
//當(dāng)前的頁碼序號 如果是0,則置為1
$pager_index=round($this->config["pager_index"])==0?1:round($this->config["pager_index"]);
//如果當(dāng)前的頁碼大于等于最后一頁,則當(dāng)前的頁碼置為最后一頁
$pager_index=$pager_index>=$pager_num?$pager_num:$pager_index;
//下一頁的頁碼
$pager_next=$pager_index>=$pager_num?$pager_num:($pager_index+1);
//獲取需要跳轉(zhuǎn) 的url
$url=$this->get_url();
//添加開頭的div
$classname=$this->config["classname"];
$pager_arr[]="<div class=\"$classname\">\n";
//添加前面兩個按鈕的html
if($this->config["show_front_btn"])
{
//如果當(dāng)前的頁碼為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);
}
//當(dāng)前顯示頁碼的起始 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;
//當(dāng)前顯示頁碼的結(jié)束
$current_pager_end=($current_pager_start+$pager_size-1)>=$pager_num?$pager_num:($current_pager_start+$pager_size-1);
//添加跳轉(zhuǎn)到上一層的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{
//如果這個是當(dāng)前頁
$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"])
{
//如果當(dāng)前的頁碼為最后一頁 則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);
}
//添加跳轉(zhuǎn)的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"]
);
//替換特定的標(biāo)簽組成跳轉(zhuǎn)
$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,支持重寫配置,各種參數(shù)的url
*/
private function get_url()
{
//如果設(shè)置了允許url重寫
if($this->config["enable_urlrewriting"])
{
//得到調(diào)用文件所在的url
$file_path="http://".$_SERVER["HTTP_HOST"].$_SERVER["PHP_SELF"];
//得到調(diào)用url所在的網(wǎng)絡(luò)目錄
$file_path=substr($file_path,0,strripos($file_path,"/"))."/";
//直接將目錄附加重寫規(guī)則 形成新的url
$url=$file_path.$this->config["urlrewrite_pattern"];
}else{
//得到當(dāng)前調(diào)用頁面的絕對url
$url="http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];
//分頁參數(shù)在瀏覽器中傳遞的名稱
$querystring_name=$this->config['querystring_name'];
//如果該url中包含php?的字符串 則需要將分頁參數(shù)替換
if(strpos($url,"php?"))
{
//如果存在page=xxx的字樣
$pattern="/$querystring_name=[0-9]*/";
if(preg_match($pattern,$url))
{
//將含page=***的字樣中的數(shù)字替換成{0}
$url=preg_replace($pattern,"$querystring_name={page}",$url);
}else{
$url.="&$querystring_name={page}";
}
}else{
//直接附加參數(shù)形成分頁的完整url
$url.="?$querystring_name={page}";
}
}
return $url;
}
/*
* 得到a標(biāo)簽的html
*$url:a標(biāo)簽所要導(dǎo)向的html
*$title:a標(biāo)簽的標(biāo)題
**$attr:a標(biāo)簽上的附加屬性 可以不寫
*/
private static function get_a_html($url,$title,$attr="")
{
return "<a href='$url' $attr style=\"margin-right:5px;\">$title</a>\n";
}
/*
* 獲得span標(biāo)簽的html
* $num:span中的文本,即頁序號
* $classname:span標(biāo)簽的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);
}
/*
*初始化分頁的配置文件
*如果在參數(shù)中不含該鍵值,則默認使用申明的值
*/
private function init_config($config)
{
//判斷該值是否存在、是否是數(shù)組、是否含有記錄
if(isset($config)&&is_array($config)&&count($config)>0){
foreach($config as $key=>$val)
{
$this->config[$key]=$val;
}
}
}
/*
* 構(gòu)造跳轉(zhuǎn)功能腳本的方法
*$url:需要跳轉(zhuǎn)的額那個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(\"在跳轉(zhuǎn)框中請輸入數(shù)字!\");\n".
"}\n".
"else{\n".
"var re=/\{page\}/\n".
"location.href='$url'.replace(re,jnum);\n".
"}\n".
"}\n".
"</script>\n";
return $scriptstr;
}
/*
* php中構(gòu)造類似.net中format方法的函數(shù)
* 用法: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;
}
}
?>
直接用數(shù)組參數(shù)的方式調(diào)用
復(fù)制代碼 代碼如下:
<?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的圖片:

由于小弟最近剛剛學(xué)習(xí)php,代碼中出現(xiàn)的不規(guī)范,低效率,冗余或者設(shè)計問題還請大家多多指教。
demo源碼下載
相關(guān)文章
ThinkPHP結(jié)合ajax、Mysql實現(xiàn)的客戶端通信功能代碼示例
這篇文章主要介紹了ThinkPHP結(jié)合ajax、Mysql實現(xiàn)的客戶端通信功能,需要的朋友可以參考下2014-06-06PHP與jquery實時顯示網(wǎng)站在線人數(shù)實例詳解
在線人數(shù)最簡單的就是直接利用js調(diào)用php了,這樣可以顯示出有多少人訪問了本站,如果要在用戶未刷新頁面的狀態(tài)實時顯示用戶在線人數(shù),我們可以利用jquery ajax來實現(xiàn),需要的朋友可以參考下2016-12-12php版微信開發(fā)之接收消息,自動判斷及回復(fù)相應(yīng)消息的方法
這篇文章主要介紹了php版微信開發(fā)之接收消息,自動判斷及回復(fù)相應(yīng)消息的方法,涉及基于微信消息處理接口的調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2016-09-09PHP隱藏手機號碼、銀行卡號、真實姓名部分內(nèi)容的方法
這篇文章主要介紹了PHP隱藏手機號碼、銀行卡號、真實姓名部分內(nèi)容的方法的實現(xiàn)代碼,有時候我們需要將部分內(nèi)容隱藏那么就可能需要下面的代碼了,需要的朋友可以參考下2023-11-11PHPMailer發(fā)送HTML內(nèi)容、帶附件的郵件實例
這篇文章主要介紹了PHPMailer發(fā)送HTML內(nèi)容、帶附件的郵件實例,發(fā)送的內(nèi)容包含圖片和文字,附件則發(fā)送的一個EXCEL表,需要的朋友可以參考下2014-07-07