您的位置:首页 > 编程语言 > PHP开发

ThinkPHP多个分页的实现

2015-08-29 17:28 585 查看
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();

即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: