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();
$pageB = new MyPage(100, 10, "p2"); $show = $pageB->show();
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/aspnet_lyc/article/details/48088677