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 相关文章推荐
第六节--访问属性和方法
Nov 16 PHP
php 静态变量与自定义常量的使用方法
Jan 26 PHP
《PHP编程最快明白》第三讲:php数组
Nov 01 PHP
解析如何屏蔽php中的phpinfo()函数
Jun 06 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
php中运用http调用的GET和POST方法示例
Sep 29 PHP
PHP加密解密类实例分析
Apr 20 PHP
CodeIgniter连贯操作的底层原理分析
May 17 PHP
PHP CURL与java http使用方法详解
Jan 26 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
关于Curl在Swoole协程中的解决方案详析
Sep 12 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 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
php学习笔记 数组的常用函数
2011/06/13 PHP
PHP中使用cURL实现Get和Post请求的方法
2013/03/13 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
如何通过Linux命令行使用和运行PHP脚本
2015/07/29 PHP
javascript 播放器 控制
2007/01/22 Javascript
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
jquery ui resizable bug解决方法
2010/10/26 Javascript
javascript中的注释使用与注意事项小结
2011/09/20 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
js简单工厂模式用法实例
2015/06/30 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
jQuery插件Validate实现自定义校验结果样式
2016/01/18 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
微信小程序 本地数据读取实例
2017/04/27 Javascript
将Sublime Text 3 添加到右键中的简单方法
2017/12/12 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python matplotlib生成图片背景透明的示例代码
2019/08/30 Python
python 公共方法汇总解析
2019/09/16 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python TKinter如何自动关闭主窗口
2020/02/26 Python
Html+Css+Jquery实现左侧滑动拉伸导航菜单栏的示例代码
2020/03/17 HTML / CSS
英国家电直销:Appliances Direct
2016/09/22 全球购物
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
乔迁之喜主持词
2014/03/27 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
承德避暑山庄导游词
2015/02/03 职场文书
2015年采购工作总结
2015/04/10 职场文书
css display table 自适应高度、宽度问题的解决
2021/05/07 HTML / CSS
Python自动操作神器PyAutoGUI的使用教程
2022/06/16 Python