ThinkPHP实现分页功能

5年以前  |  阅读数:411 次  |  编程语言:PHP 

前几篇(上传,缩略图,验证码,自动验证表单)文章介绍的功能实现都是基于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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例