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 smarty的预保留变量总结
Dec 04 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
ThinkPHP CURD方法之page方法详解
Jun 18 PHP
php中实现用数组妩媚地生成要执行的sql语句
Jul 10 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 PHP
php+MySQL实现登录时验证登录名和密码是否正确
May 10 PHP
PHP与JavaScript针对Cookie的读写、交互操作方法详解
Aug 07 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 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
BBS(php &amp; mysql)完整版(五)
2006/10/09 PHP
php用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
2014/07/02 PHP
PHP的mysqli_query参数MYSQLI_STORE_RESULT和MYSQLI_USE_RESULT的区别
2014/09/29 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
网页编辑器ckeditor和ckfinder配置步骤分享
2012/05/24 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
2017/04/19 Javascript
使用vue-router完成简单导航功能【推荐】
2018/06/28 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
[53:10]完美世界DOTA2联赛决赛日 FTD vs GXR 第二场 11.08
2020/11/11 DOTA
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
2019/06/19 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
python实现的分层随机抽样案例
2020/02/25 Python
python 基于opencv实现图像增强
2020/12/23 Python
塔吉特百货公司官网:Target
2017/04/27 全球购物
武汉世纪畅想数字传播有限公司 .NET笔试题
2015/06/13 面试题
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
咖啡厅创业计划书范本
2014/01/22 职场文书
老公爱的承诺书
2014/03/31 职场文书
网络优化专员求职信
2014/05/04 职场文书
我心目中的好老师活动方案
2014/08/19 职场文书
研修心得体会
2014/09/04 职场文书
一次性工伤赔偿协议书范本
2014/11/25 职场文书
《叶问2》观后感
2015/06/15 职场文书
开学典礼致辞
2015/07/29 职场文书
gateway网关接口请求的校验方式
2021/07/15 Java/Android
详解MySQL的内连接和外连接
2023/05/08 MySQL
什么是clearfix (一文搞清楚css清除浮动clearfix)
2023/05/21 HTML / CSS