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 22 PHP
织梦模板标记简介
Mar 11 PHP
PHP数组交集的优化代码分析
Mar 06 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
php简单防盗链实现方法
Jul 29 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
PHP中session跨子域的三种实现方法
Jul 25 PHP
thinkPHP实现的省市区三级联动功能示例
May 05 PHP
Eclipse PHPEclipse 配置的具体步骤
Aug 08 PHP
php 处理png图片白色背景色改为透明色的实例代码
Dec 10 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 数组元素快速去重
2017/05/05 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
HR vs CL BO3 第一场 2.13
2021/03/10 DOTA
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
2009/04/10 Javascript
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
初学js 新节点的创建 删除 的步骤
2011/07/04 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
JS中实现简单Formatter函数示例代码
2014/08/19 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
JavaScript检测实例属性, 原型属性
2015/02/04 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
js时间控件只显示年月
2017/01/08 Javascript
React Native 环境搭建的教程
2017/08/19 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
react 移动端实现列表左滑删除的示例代码
2019/07/04 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
2020/08/07 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
Python利用pyHook实现监听用户鼠标与键盘事件
2014/08/21 Python
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
全面了解Nginx, WSGI, Flask之间的关系
2018/01/09 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
2019/10/06 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
银行实习的自我鉴定
2013/12/10 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
高中政治教学反思
2016/02/23 职场文书