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分页示例代码
Mar 19 PHP
DedeCMS 核心类TypeLink.class.php摘要笔记
Apr 07 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
php实现把url转换迅雷thunder资源下载地址的方法
Nov 07 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
学习php设计模式 php实现桥梁模式(bridge)
Dec 07 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
laravel中的错误与日志用法详解
Jul 26 PHP
如何通过View::first使用Laravel Blade的动态模板详解
Sep 21 PHP
LNMP部署laravel以及xhprof安装使用教程
Sep 14 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 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和javascript常用正则表达式及用法实例
2014/07/01 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
asp批量修改记录的代码
2008/06/25 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
让图片旋转任意角度及JQuery插件使用介绍
2013/03/20 Javascript
js+css实现上下翻页相册代码分享
2015/08/18 Javascript
js 作用域和变量详解
2017/02/16 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
微信小程序定位当前城市的方法
2018/07/19 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
Vue 微信端扫描二维码苹果端却只能保存图片问题(解决方法)
2020/01/19 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
Python 12306抢火车票脚本
2018/02/07 Python
python构建基础的爬虫教学
2018/12/23 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
Python在字符串中处理html和xml的方法
2020/07/31 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
Merrell美国官网:美国登山运动鞋品牌
2018/02/07 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
美国汽车零部件和配件网站:CarParts
2019/03/13 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
英国比较机场停车场网站:Airport Parking Essentials
2019/12/01 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
SQL Server面试题
2016/10/17 面试题
高级电工工作职责
2013/11/21 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
煤矿班组长竞聘书
2014/03/31 职场文书
正科级干部考察材料
2014/05/29 职场文书
信息技术课教学反思
2016/02/23 职场文书