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 相关文章推荐
建立文件交换功能的脚本(二)
Oct 09 PHP
dedecms模版制作使用方法
Apr 03 PHP
dedecms系统常用术语汇总
Apr 03 PHP
php初始化对象和析构函数的简单实例
Mar 11 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php无限极分类递归排序实现方法
Nov 11 PHP
php新浪微博登录接口用法实例
Dec 23 PHP
php对象和数组相互转换的方法
May 12 PHP
使用PHP如何实现高效安全的ftp服务器(一)
Dec 20 PHP
php中namespace use用法实例分析
Jan 22 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
laravel 事件/监听器实例代码
Apr 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
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
直接生成打开窗口代码,不必下载
2008/05/14 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
js使用DOM操作实现简单留言板的方法
2015/04/10 Javascript
JS中Eval解析JSON字符串的一个小问题
2016/02/21 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
vue组件父与子通信详解(一)
2017/11/07 Javascript
JsChart组件使用详解
2018/03/04 Javascript
vue基础之使用get、post、jsonp实现交互功能示例
2019/03/12 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
2019/05/30 Javascript
使用p5.js临摹动态图片
2019/11/04 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[01:20:37]FNATIC vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python图书管理系统
2020/04/05 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
使用Python+wxpy 找出微信里把你删除的好友实例
2019/02/21 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
大专应届生个人的自我评价
2013/11/21 职场文书
中青班党性分析材料
2014/02/16 职场文书
颁奖典礼主持词
2014/03/25 职场文书
大学生社团活动总结
2014/04/26 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
敬老模范事迹
2014/05/21 职场文书
广播体操口号
2014/06/18 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
公司催款律师函
2015/05/27 职场文书
贫困证明怎么写
2015/06/16 职场文书
班干部学习委员竞选稿
2015/11/20 职场文书
python读取并查看npz/npy文件数据以及数据显示方法
2022/04/14 Python
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技