ThinkPHP实现分页功能


Posted in PHP onApril 28, 2017

前几篇(上传,缩略图,验证码,自动验证表单)文章介绍的功能实现都是基于ThinkPHP框架封装好的类进行实现的,所以这次自己写一个分页类在框架中使用。

首先在根目录建一个Tools文件夹,在Tools文件夹下建Page.class.php类文件,这样以后自定义的工具类都可放在Tools文件夹下。

此类封装有以下函数:获取请求地址,开始页,从哪一条显示,结束页 从哪一条结束,页码列表(首页超链接,上一页,页码数字列表超链接,下一页,尾页,跳转),对于分页足够使用!

下面是Page.class.php代码

<?php
//命名空间的名称与上级目录tools一致
//原因:当前Page.class.php类文件会被自动加载机制引入
//   在引入的同时会把"tools"变为文件的上级目录,进而获得该Page类文件
namespace Tools;

class Page {
  private $total; //数据表中总记录数
  private $listRows; //每页显示行数
  private $limit;
  private $uri;  //当前链接URL
  private $pageNum; //页数
  private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页");
  private $listNum=8; //限制页码列表数目
  
  /*
   * $total 总记录数
   * $listRows 每页显示行数
   */
  public function __construct($total, $listRows=10, $pa=""){
    $this->total=$total;  //数据表中总记录数
    $this->listRows=$listRows; //设置每页显示行数
    $this->uri=$this->getUri($pa); //请求地址
    $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1; //当前页
    $this->pageNum=ceil($this->total/$this->listRows); //总页数
    $this->limit=$this->setLimit(); //限制每页长度
  }

  private function setLimit(){
    return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
  }

  //请求地址
  private function getUri($pa){
    $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa;
    $parse=parse_url($url);

  

    if(isset($parse["query"])){
      parse_str($parse['query'],$params);
      unset($params["page"]);
      $url=$parse['path'].'?'.http_build_query($params);
      
    }

    return $url;
  }

  function __get($args){
    if($args=="limit")
      return $this->limit;
    else
      return null;
  }

  //开始页,从哪一条显示
  private function start(){
    if($this->total==0)
      return 0;
    else
      return ($this->page-1)*$this->listRows+1;
  }

  //从哪一条结束
  private function end(){
    return min($this->page*$this->listRows,$this->total);
  }

  //首页超链接
  private function first(){
    $html = "";
    if($this->page==1)
      $html.='';
    else
      $html.="  <a href='{$this->uri}&page=1'>{$this->config["first"]}</a>  ";

    return $html;
  }

  //上一页
  private function prev(){
    $html = "";
    if($this->page==1)
      $html.='';
    else
      $html.="  <a href='{$this->uri}&page=".($this->page-1)."'>{$this->config["prev"]}</a>  ";

    return $html;
  }

  //页码数字列表超链接
  private function pageList(){
    $linkPage="";
    
    $inum=floor($this->listNum/2);
  
    for($i=$inum; $i>=1; $i--){
      $page=$this->page-$i;

      if($page<1)
        continue;

      $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> ";

    }
  
    $linkPage.=" {$this->page} ";
    

    for($i=1; $i<=$inum; $i++){
      $page=$this->page+$i;
      if($page<=$this->pageNum)
        $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> ";
      else
        break;
    }

    return $linkPage;
  }

  //下一页
  private function next(){
    $html = "";
    if($this->page==$this->pageNum)
      $html.='';
    else
      $html.="  <a href='{$this->uri}&page=".($this->page+1)."'>{$this->config["next"]}</a>  ";

    return $html;
  }

  //尾页
  private function last(){
    $html = "";
    if($this->page==$this->pageNum)
      $html.='';
    else
      $html.="  <a href='{$this->uri}&page=".($this->pageNum)."'>{$this->config["last"]}</a>  ";

    return $html;
  }

  //跳转
  private function goPage(){
    return '  <input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'&page=\'+page+\'\'}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'&page=\'+page+\'\'">  ';
  }

  //页码列表
  function fpage($display=array(0,1,2,3,4,5,6,7,8)){
    $html[0]="  共有<b>{$this->total}</b>{$this->config["header"]}  ";
    $html[1]="  每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条  ";
    $html[2]="  <b>{$this->page}/{$this->pageNum}</b>页  ";
    
    $html[3]=$this->first();
    $html[4]=$this->prev();
    $html[5]=$this->pageList();
    $html[6]=$this->next();
    $html[7]=$this->last();
    $html[8]=$this->goPage();
    $fpage='';
    foreach($display as $index){
      $fpage.=$html[$index];
    }

    return $fpage;

  }


}

控制器代码:

//商品列表
  function showlist(){

   //实现分页效果
   $goods = D('goods');

   //① 获得数据的总记录条数
   $total = $goods -> count(); //select count(*) from sw_goods;
   $per = 7; //每页显示7条记录

   //②实例化分页类
   $page_obj = new \Tools\Page($total, $per);

   //③自定义sql语句,获取每页信息
   $sql = "select * from sw_goods order by goods_id desc ".$page_obj->limit;
   $info = $goods->query($sql);

   //④获取页码列表
   $pagelist = $page_obj->fpage(array(3,4,5,6,7,8));

   //分配
   $this->assign('pagelist',$pagelist);
   $this->assign('info',$info);
   $this->display();
  }

前台显示代码

<{$pagelist}>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
从手册去理解分析PHP session机制
Jul 17 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
Nov 12 PHP
php 不使用js实现页面跳转
Feb 11 PHP
PHP彩蛋信息介绍和阻止泄漏的方法(隐藏功能)
Aug 06 PHP
PHP图片处理之图片旋转和图片翻转实例
Nov 19 PHP
php数组去除空值函数分享
Feb 02 PHP
php实现图片缩略图的方法
Mar 29 PHP
PHP函数rtrim()使用中的怪异现象分析
Feb 24 PHP
老生常谈文本文件和二进制文件的区别
Feb 27 PHP
PHP解析url并得到url参数方法总结
Oct 11 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
ThinkPHP实现附件上传功能
Apr 27 #PHP
使用ThinkPHP生成缩略图及显示
Apr 27 #PHP
php实现头像上传预览功能
Apr 27 #PHP
php文件上传及下载附带显示文件及目录功能
Apr 27 #PHP
phpMyAdmin无法登陆的解决方法
Apr 27 #PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 #PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
Apr 27 #PHP
You might like
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
php max_execution_time执行时间问题
2011/07/17 PHP
php读取qqwry.dat ip地址定位文件的类实例代码
2016/11/15 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
用JavaScript显示浏览器客户端信息的超相近教程
2015/06/18 Javascript
JS实现统计复选框选中个数并提示确定与取消的方法
2015/07/01 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
js小数计算小数点后显示多位小数的实现方法
2016/05/30 Javascript
js入门之Function函数的使用方法【新手必看】
2016/11/22 Javascript
Node.js用readline模块实现输入输出
2016/12/16 Javascript
JS实现的简单轮播图运动效果示例
2016/12/22 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
微信小程序自定义弹窗实现详解(可通用)
2019/07/04 Javascript
详解ES6 Promise的生命周期和创建
2019/08/18 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
python处理圆角图片、圆形图片的例子
2014/04/25 Python
python刷投票的脚本实现代码
2014/11/08 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
教大家使用Python SqlAlchemy
2016/02/12 Python
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
梯度下降法介绍及利用Python实现的方法示例
2017/07/12 Python
Python判断telnet通不通的实例
2019/01/26 Python
Python continue语句实例用法
2020/02/06 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
医院护士见习期自我鉴定
2014/04/10 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
一年级语文教学随笔
2015/08/14 职场文书
基于Go Int转string几种方式性能测试
2021/04/28 Golang
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript