PHP实现可自定义样式的分页类


Posted in PHP onMarch 29, 2016

本文实例为大家分享了PHP实现可自定义样式的分页类,供大家参考,具体内容如下

<?php
 
//namespace Component;
/**
 * 2016-3-27
 * @author ankang
 */
class Page {
 private $ShowPage;
 private $CountPage;
 private $Floorp;
 private $PageUrl;
 private $PageClass;
 private $CurClass;
 
 /**
 * @author ankang
 * @param number $CountNum  数据总数
 * @param string $PageUrl  跳转链接
 * @param string $PageClass  <a>标签 总体样式 
 * @param string $PageUrl  当前页样式
 * @param number $PageSize  每页显示的数据条数
 * @param number $ShowPage  每次显示的页数 
 */
 public function __construct($CountNum, $PageUrl = NULL, $PageClass = NULL,$CurClass = NULL, $PageSize = 20, $ShowPage = 5) {
 $this->ShowPage = $ShowPage;
 $this->CountPage  = ceil ( $CountNum / $PageSize );
 $this->Floorp  = floor ( $ShowPage / 2 ); // 偏移量 
 $this->PageClass  = is_null ( $PageClass ) ? '' : $PageClass;
 $this->CurClass = is_null ( $CurClass ) ? '' : $CurClass;
  
 // $ServerURL  = ( preg_match('/\?/i', $_SERVER['REQUEST_URI']))?preg_replace('/\&p\=[0-9]+/i', "", $_SERVER['REQUEST_URI']) : $_SERVER['REQUEST_URI']."?";
 // if( substr($ButURL,0,2)=='//' ){
  // $ServerURL  = substr($ServerURL,1);
 // }
 // $url   = preg_replace('/p=[\d]*/i', '', $ServerURL);
  $url   = '';
 //推荐自己传url,不传也可以打开上面的代码自动获取
 $this->PageUrl  = is_null ( $PageUrl ) ? $url : $PageUrl;
 }
 
 /**
 *
 * @param number $Page  
 * @param string $ShowToPage
 *  首页,上下页,尾页
 * @param string $Html 标签元素,li,p 
 * @return string
 */
 public function getPage($Page = 1, $ShowToPage = true, $Html = null) {
 $StartPage  = ($Page - $this->Floorp); // 开始页码
 $EndPage  = ($Page + $this->Floorp); // 结束页码
  
 if ($this->CountPage < $this->ShowPage) {
  $StartPage = 1;
  $EndPage = $this->CountPage;
 }
  
 if ($StartPage < 1) {
  $StartPage = 1;
  $EndPage = $this->ShowPage;
 }
  
 if ($EndPage > $this->CountPage) {
  $StartPage = $this->CountPage - $this->ShowPage + 1;
  $EndPage = $this->CountPage;
 }
  
 $PageHtml = '';
  
 if (! is_null ( $Html )) {
  if ($Html == 'li') {
  $Shtml = '<li>';
  $Ehtml = '</li>';
  } else {
  $Shtml = '<p>';
  $Ehtml = '</p>';
  }
 }
  
 if (true == $ShowToPage) {
  $PageHtml  .= "$Shtml<a href='{$this->PageUrl}p=1'>« 首页</a>$Ehtml";
  $PrveUrl   = $this->getPrve($Page);
  $PageHtml  .= "$Shtml<a href='{$PrveUrl}'>« 上一页</a>$Ehtml";
 }
  
 for($i = $StartPage; $i <= $EndPage; $i ++) {
  if ($Page == $i) {
  $PageHtml  .= "$Shtml<a href='{$this->PageUrl}p={$i}' class='{$this->CurClass}'>{$i}</a>$Ehtml";
  } else {
  $PageHtml  .= "$Shtml<a href='{$this->PageUrl}p={$i}' class='{$this->PageClass}'>{$i}</a>$Ehtml";
  }
 }
  
 if (true == $ShowToPage) {
  $NextUrl   = $this->getNext($Page);
  $PageHtml  .= "$Shtml<a href='{$NextUrl}'>下一页 »</a>$Ehtml";
  $PageHtml  .= "$Shtml<a href='{$this->PageUrl}p={$this->CountPage}' >尾页 »</a>$Ehtml";
 }
  
 return $PageHtml;
 }
 
 public function getPrve($Page){
 if ($Page != 1) {
  $Prve  = $Page - 1;
  $PrveUrl  = "{$this->PageUrl}p={$Prve}";
 } else {
  $PrveUrl  = "{$this->PageUrl}p=1";
 }
  
 return $PrveUrl;
 }
 
 public function getNext($Page){
 if ($Page != $this->CountPage) {
  $Next  = $Page + 1;
  $NextUrl  = "{$this->PageUrl}p={$Next}";
 } else {
  $NextUrl  = "{$this->PageUrl}p={$this->CountPage}";
 }
  
 return $NextUrl;
 }
 
 
 
}

再为大家分享一个主要用于新手学习php分页,代码简单实用,主要是注释很完整。

1. Page.class.php

<?php
/**
 * 分页类
 * 
 * 调用方式:
 * $p=new Page(总页数,显示页数,当前页码,每页显示条数,[链接]);
 * print_r($p->getPages()); //生成一个页码数组(键为页码,值为链接)
 * echo $p->showPages(1); //生成一个页码样式(可添加自定义样式)
 * 
 * @author: Dzer <Email:358654744@qq.com Blog:Dzer.me>
 * @version: 2014-12-25 09:09:42
 * @Last Modified time: 2014-12-28 17:37:13
 */
 
/*
思路:
给我一个 总页数,需要显示的页数,当前页,每页显示的条数,连接
写一个方法 生成一个一维数组,键为页码 值为连接
写一个方法 返回一个生成好样式的页码(并且可以根据自己需要添加样式)
默认样式 共45条记录,每页显示10条,当前第1/4页 [首页] [上页] [1] [2] [3] .. [下页] [尾页]
*/
class Page{
 protected $count;  //总条数
 protected $showPages; //需要显示的页数
 protected $countPages; //总页数
 protected $currPage; //当前页
 protected $subPages; //每页显示条数
 protected $href;  //连接
 protected $page_arr=array(); //保存生成的页码 键页码 值为连接
 
 /**
  * __construct 构造函数(获取分页所需参数)
  * @param int $count  总条数
  * @param int $showPages 显示页数
  * @param int $currPage 当前页数
  * @param int $subPages 每页显示数量
  * @param string $href 连接(不设置则获取当前URL)
  */
 public function __construct($count,$showPages,$currPage,$subPages,$href=''){
  $this->count=$count;
  $this->showPages=$showPages;
  $this->currPage=$currPage;
  $this->subPages=$subPages;
   
  //如果链接没有设置则获取当前连接
  if(empty($href)){
   $this->href=htmlentities($_SERVER['PHP_SELF']); 
  }else{
   $this->href=$href;
  }
  $this->construct_Pages();
 }
 
 /**
  * getPages 返回页码数组
  * @return array 一维数组 键为页码 值为链接
  */
 public function getPages(){
  return $this->page_arr;
 }
 
 /**
  * showPages 返回生成好的页码
  * @param int $style 样式
  * @return string  生成好的页码
  */
 public function showPages($style=1){
  $func='pageStyle'.$style;
  return $this->$func();
 }
 
 /**
  * pageStyle1 分页样式(可参照这个添加自定义样式 例如pageStyle2())
  * 样式 共45条记录,每页显示10条,当前第1/4页 [首页] [上页] [1] [2] [3] .. [下页] [尾页] 
  * @return string 
  */
 protected function pageStyle1(){
  /* 构造普通模式的分页 
  共4523条记录,每页显示10条,当前第1/453页 [首页] [上页] [1] [2] [3] .. [下页] [尾页] 
  */
  $pageStr='共'.$this->count.'条记录,每页显示'.$this->subPages.'条';
  $pageStr.='当前第'.$this->currPage.'/'.$this->countPages.'页 ';
 
  $_GET['page'] = 1;
  $pageStr.='<span>[<a href="'.$this->href.'?'.http_build_query($_GET).'">首页</a>] </span>';
  //如果当前页不是第一页就显示上页
  if($this->currPage>1){
   $_GET['page'] = $this->currPage-1;
   $pageStr.='<span>[<a href="'.$this->href.'?'.http_build_query($_GET).'">上页</a>] </span>';
  }
 
  foreach ($this->page_arr as $k => $v) {
   $_GET['page'] = $k;
   $pageStr.='<span>[<a href="'.$v.'">'.$k.'</a>] </span>';
  }
 
  //如果当前页小于总页数就显示下一页
  if($this->currPage<$this->countPages){
   $_GET['page'] = $this->currPage+1;
   $pageStr.='<span>[<a href="'.$this->href.'?'.http_build_query($_GET).'">下页</a>] </span>';
  }
 
  $_GET['page'] = $this->countPages;
  $pageStr.='<span>[<a href="'.$this->href.'?'.http_build_query($_GET).'">尾页</a>] </span>';
 
  return $pageStr;
 }
 
 /**
  * construct_Pages 生成页码数组
  * 键为页码,值为链接
  * $this->page_arr=Array(
  *     [1] => index.php?page=1
  *     [2] => index.php?page=2
  *     [3] => index.php?page=3
  *     ......)
  */
 protected function construct_Pages(){
  //计算总页数
  $this->countPages=ceil($this->count/$this->subPages);
  //根据当前页计算前后页数
  $leftPage_num=floor($this->showPages/2);
  $rightPage_num=$this->showPages-$leftPage_num;
 
  //左边显示数为当前页减左边该显示的数 例如总显示7页 当前页是5 左边最小为5-3 右边为5+3
  $left=$this->currPage-$leftPage_num;
  $left=max($left,1); //左边最小不能小于1
  $right=$left+$this->showPages-1; //左边加显示页数减1就是右边显示数
  $right=min($right,$this->countPages); //右边最大不能大于总页数
  $left=max($right-$this->showPages+1,1); //确定右边再计算左边,必须二次计算
   
  for ($i=$left; $i <= $right; $i++) {
   $_GET['page'] = $i;
   $this->page_arr[$i]=$this->href.'?'.http_build_query($_GET);
  }
 }
}

2. demo.php 

<?php
/**
 * 分页类demo
 * Be the best of whatever you are!
 * 
 * @author: Dzer<358654744@qq.com>
 * @version: 2014-12-28 17:38:23
 * @Last Modified time: 2014-12-28 18:08:28
 */
header("content-type:text/html;charset=utf8");
include('./Page.class.php'); //引入类
 
//$p=new Page(总页数,显示页数,当前页码,每页显示条数,[链接]);
//连接不设置则为当前链接
$page=isset($_GET['page']) ? $_GET['page'] : 1;
$p=new Page(100,7,$page,8);
 
//生成一个页码数组(键为页码,值为链接)
echo "<pre>";
print_r($p->getPages()); 
 
//生成一个页码样式(可添加自定义样式)
//样式 共45条记录,每页显示10条,当前第1/4页 [首页] [上页] [1] [2] [3] .. [下页] [尾页]
echo $p->showPages(1);

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。

PHP 相关文章推荐
PHP的历史和优缺点
Oct 09 PHP
在php MYSQL中插入当前时间
Apr 06 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
PHP制作图形验证码代码分享
Oct 23 PHP
PHP实现货币换算的方法
Nov 29 PHP
php递归遍历多维数组的方法
Apr 18 PHP
抛弃 PHP 代价太高
Apr 26 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
May 05 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PHP实现的无限分类类库定义与用法示例【基于thinkPHP】
Aug 06 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 #PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
Mar 29 #PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 #PHP
php ajax异步读取rss文档数据
Mar 29 #PHP
详解PHP的Yii框架中的Controller控制器
Mar 29 #PHP
详解PHP匿名函数与注意事项
Mar 29 #PHP
php ajax实现文件上传进度条
Mar 29 #PHP
You might like
手把手教你使用DedeCms V3的在线采集图文教程
2007/04/03 PHP
php 引用(&amp;)详解
2009/11/20 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
2010/05/27 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
JavaScript fontcolor方法入门实例(按照指定的颜色来显示字符串)
2014/10/17 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
利用Vue2.x开发实现JSON树的方法
2018/01/04 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[48:46]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第二场 11.19
2020/11/19 DOTA
python异步实现定时任务和周期任务的方法
2019/06/29 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
django ORM之values和annotate使用详解
2020/05/19 Python
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
美国在线面料商店:Fashion Fabrics Club
2020/01/31 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
教师个人自我鉴定
2014/02/08 职场文书
实用的简历自我评价
2014/03/06 职场文书
入党综合考察材料
2014/06/02 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
公司离职证明范本
2014/10/17 职场文书
学术会议邀请函
2015/01/30 职场文书
边城读书笔记
2015/06/29 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby