码迷,mamicode.com
首页 > Web开发 > 详细

ThinkPHP多个分页的实现

时间:2015-08-29 18:53:25      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:thinkphp   多分页   分页   多个分页   page   

ThinkPHP 3.1.2为我们提供了 Page这个分页类,使用起来非常方便,如果一个页面只有一个分页Page类足够使用。

但多个页面就会出现问题,例如一个页面中有两个分页,都用Page类会造成其中一个的分页变化,另一个分页的页数也会跟着改变。这是由于Page类从GET请求参数中获取用户点击的页数的键值相同造成的。

这里要说明一下这个Page类的实现原理,Page类中会首先从ThinkPHP项目的配置文件中查找VAR_PAGE变量的值,此值作为分页参数的变量名,若不存在,则为p,Page类从GET请求中获取这个键值,如果不存在就认为是页面刚刚载入,显示第一页,否则会从GET请求中把这个键值取出,Page类根据这个值为我们生成我们执行sql需要的limit的参数,例如$page->firstRow , $page->listRows等。


Page类构造函数源码:

public function __construct($totalRows, $listRows='', $parameter='') {
        $this->totalRows = $totalRows;
        $this->parameter = $parameter;
        $this->varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p' ;    //此处先从配置文件中查找VAR_PAGE设置的值,若不存在,$this->varPage即为p,从GET请求中获取该键的值作为当前要显示的第几页
        $this->varPage = $var_page;
        if(!empty($listRows)) {
            $this->listRows = intval($listRows);
        }
        $this->totalPages = ceil($this->totalRows/$this->listRows);     //总页数
        $this->coolPages  = ceil($this->totalPages/$this->rollPage);
        $this->nowPage  = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
        if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
            $this->nowPage = $this->totalPages;
        }
        $this->firstRow = $this->listRows*($this->nowPage-1);
    }


之后我们调用$show = $page->show(); 会为我们生成页面上要显示分页的html代码,$show就是html代码字符串。其中Page类会根据$this->varPage成员构建分页HTML代码中的<a>标签,例如:

//上下翻页字符串
        $upRow   = $this->nowPage-1;
        $downRow = $this->nowPage+1;
        if ($upRow>0){
            $upPage="<a href='".$url."&".$p."=$upRow'>".$this->config['prev']."</a>";
        }else{
            $upPage="";
        }


所以为了在一个页面中显示多个分页,只要将GET请求中表示当前页数的变量的变量名不同即可。因此修改如下:

为了不影响ThinkPHP 内置的Page类的使用,建议将Page类拷贝到可访问路径下,并命名为MyPage.class.php, 在构造函数中添加参数$var_page,用这个参数指定我们当前分页类从GET请求中获取当前页数的变量名,对于不同的分页,使用不同的$var_page即可,修改构造函数如下:

public function __construct($totalRows, $listRows='', $var_page, $parameter='') {
        $this->totalRows = $totalRows;
        $this->parameter = $parameter;
        //$this->varPage = C('VAR_PAGE') ? C('VAR_PAGE') : 'p1' ;
        $this->varPage = $var_page;
        if(!empty($listRows)) {
            $this->listRows = intval($listRows);
        }
        $this->totalPages = ceil($this->totalRows/$this->listRows);     //总页数
        $this->coolPages  = ceil($this->totalPages/$this->rollPage);
        $this->nowPage  = !empty($_GET[$this->varPage])?intval($_GET[$this->varPage]):1;
        if(!empty($this->totalPages) && $this->nowPage>$this->totalPages) {
            $this->nowPage = $this->totalPages;
        }
        $this->firstRow = $this->listRows*($this->nowPage-1);
    }


调用的时候制定$var_page,例如页面中有两个分页, 分页A通过从$_GET["p1"]获取当前页数,分页B通过$_GET["p2"]获取当前页数,

那么,实例化分页类时


分页A:

$pageA = new MyPage(100, 10, "p1");
$show = $pageA->show();

分页B:

$pageB = new MyPage(100, 10, "p2");
$show = $pageB->show();


即可。






版权声明:本文为博主原创文章,未经博主允许不得转载。

ThinkPHP多个分页的实现

标签:thinkphp   多分页   分页   多个分页   page   

原文地址:http://blog.csdn.net/aspnet_lyc/article/details/48088677

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!