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来自动调用不同服务器上的flash
Oct 09 PHP
php 清除网页病毒的方法
Dec 05 PHP
php类常量的使用详解
Jun 08 PHP
ThinkPHP行为扩展Behavior应用实例详解
Jul 22 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
PHP使用header()输出图片缓存实例
Dec 09 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
Jul 09 PHP
php需登录的文件上传管理系统
Mar 21 PHP
浅谈PHP值mysql操作类
Jun 29 PHP
使用ThinkPHP的自动完成实现无限级分类实例详解
Sep 02 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
php类
2006/11/27 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
jQuery实现表头固定效果的实例代码
2013/05/24 Javascript
javascript:void(0)的作用示例介绍
2013/10/28 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
javascript中的undefined和not defined区别示例介绍
2014/02/26 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
JavaScript实现显示函数调用堆栈的方法
2016/04/21 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python模块之StringIO使用示例
2015/04/08 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Python装饰器用法实例总结
2018/05/26 Python
python3实现指定目录下文件sha256及文件大小统计
2019/02/25 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
解决Python设置函数调用超时,进程卡住的问题
2019/08/08 Python
python如何删除文件、目录
2020/06/23 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
html5时钟实现代码
2010/10/22 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
英国现代、当代和设计师家具店:Furntastic
2020/07/18 全球购物
幼儿园中班教学反思
2014/02/10 职场文书
优质服务口号
2014/06/11 职场文书
小学运动会宣传稿
2015/07/23 职场文书
Python语言中的数据类型-序列
2022/02/24 Python
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技