ThinkPHP官方的文档对分页功能的介绍不是特别多,只是简单聊了几句,这主要还是因为ThinkPHP是开放源码的,所以很多东西都是可以自己去查看的,而且这样我们可以从查看别人的源码中学习到一些别人写程序的技巧。
一、创建分页对象(Think\Page)
在ThinkPHP 3.1及之前,分页功能可能是放在/Lib/Org/Util中的,到了ThinkPHP 3.2后,分页功能已经整合到了Library/Think中了。而且ThinkPHP 3.2已经采用了命名机制,所以创建一个分页对象可以有两种方法:
$pageNav = new \Think\Page(); |
分页对象Page可以接收三个参数,有两个必要的参数,其定义如下:
new Page($totalRows, $listRows, $parameter = array())
第一个参数是总的记录数据,及总共有多少条数据;
第二个参数是每页显示的数据量;
第三个参数是一个数组,Page类会检测这个数组中是否还有页码数据,如果有,则将当前页面定义到这个页码数据中,不会检测其他设置。
二、配置分页对象
1、配置传递参数
这个参数指的是在URL中传递的页码数据的变量名称,默认的是p=pageid,可以通过在config.php配置文件中设置一个返回变量VAR_PAGE,比如我想将这个变量名称改为page,则如下设置:
‘VAR_PAGE’ => ‘page’
2、配置显示模式
设置分页功能的显示模式是通过setConfig()方法来完成的,可以设置的内容如下:
'header' => '<span class="rows">共 %TOTAL_ROW% 条记录</span>' , |
'last' => '...%TOTAL_PAGE%' , |
'theme' => '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%' , |
上面内容是直接从Page类中拷贝过来的,具体意义非常明确,其中theme就是定义页面导航的显示内容格式。
setConfig()不接收数组内容,所以只能一条一条设置。
3、页面导航内容块的CSS样式定制
另外一个设置就是分页导航内容的块定义了,默认情况下是包含在一个<div></div>中的,这个不是很方便我们为分页导航内容设置CSS样式,所以需要改一改。但这个Page类没有提供公共的方法,所以只好自己更改Page类的源码了。
打开ThinkPHP目录\Library\Think\Page.class.php
然后找到show()方法后找到这个方法的内容的最后一句,将
return “<div{$page_str}</div>”;
改为
return “<div class=\”pageNav\”>{$page_str}</div>”;
这样我们就可以在CSS中定义一个pageNav块的样式了。
三、显示分页到网页中
这部分就比较简单了,通过分页对象的show()方法就可以输出分页导航的内容了。然后通过Controller的assign方法将内容分发到模板中就可以了。下面是我的设置:
$pageNav = new \Think\Page( $articleCount , 10); |
$pageNav ->setConfig( 'prev' , '上一页' ); |
$pageNav ->setConfig( 'next' , '下一页' ); |
$pageNav ->setConfig( 'theme' , '%HEADER% %FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%' ); |
$this ->assign( 'pageNav' , $pageNav ->show()); |
运行后的结果为:
<span class = "rows" >共 25 条记录</span> |
<a class = "prev" href= "/~admin/ehander/index.php/Home/Index/index/p/2/page/2.html" >上一页</a> |
<a class = "num" href= "/~admin/ehander/index.php/Home/Index/index/p/2/page/1.html" >1</a> |
<a class = "num" href= "/~admin/ehander/index.php/Home/Index/index/p/2/page/2.html" >2</a> |
<span class = "current" >3</span> |
四、结合数据库完成分页功能对象创建
前面所说的都是分页对象的使用,在实现中通常还是需要配合数据库来完成的。
1、获取内容数据总量
不管是通过new Model()方法、大D()方法还是大M()方法实现的数据库操作模型,我们都可以通过count()方法来获取一个表的数据总量。如果一个表不是所有数据都需要显示出来,那么我们可以通过连贯方法来设置条件语句,如where()方法。
$articleCount = $m ->where( 'publish=true' )-> count (); |
2、结合数据库,完成分页实现
首先要做的是我得要知道当前URL地址传递页面参数已经到第几页了,对于不合法的参数传递需要给屏蔽掉,所以通过下面一条语句先确定传递了页面参数,其次是页面参数合法则获取页面参数,不合法则将页面参数设置为1。
$_GET [C( 'VAR_PAGE' )] = (isset( $_GET [C( 'VAR_PAGE' )]) && (int) $_GET [C( 'VAR_PAGE' )] > 0)?(int) $_GET [ 'page' ]:1; |
这里同样将判断结果返回给$_GET[C(‘VAR_PAGE’)]是因为我们在创建Page分页对象时没有给第三个当前页面参数,所以Page对象在创建时会自动查询$_GET数组。
然后就是在查询数据库的时候,同样使用分页功能,这个分页功能我们有两种实现:
一是通过连贯操作limit()来实现,接收两个参数,第一个参数为第几页,第二个参数为每页显示数据。
二是通过连贯操作page()来实现,参数与limit()方法一样的,大致如下:
$articles = $m ->page( $_GET [C( 'VAR_PAGE' )], 10)->select(); |
这样就完全实现了我们的分页功能。
|