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();
即可。
但多个页面就会出现问题,例如一个页面中有两个分页,都用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();
即可。
相关文章推荐
- 记录一些PHP7RCC1编译问题
- Yii2配置
- PHP生成静态HTML页面最简单方法示例
- Ubuntu 14.04 配置 LAMP+phpMyAdmin PHP(5.5.9)开发环境
- php 如何获得上传图片的宽和高?
- php SPL学习
- php自带的几个防止sql注入的函数
- php分页实例附代码
- php学习心得二
- vsftp黑白名单设置及问题
- vsftp
- phpMyAdmin的用户名和密码丢了怎么办?
- ftp传输出现问题
- outputStream
- zend studio中建立svn项目
- php的全局变量在函数里头引用--以及常量
- PHP set_error_handler() 函数与 trigger_error() 函数的配合使用
- php-apc为magento加速
- php中$this、static、final、const、self 等几个关键字的用法
- set names解决中文乱码 php&sql