首页 » PHP » PHP分页类的代码实现

PHP分页类的代码实现

 

一个网站中,需要很多地方需要用到分页,所以我们把分页功能封装成一个类,方便调用。

新建一个类文件命名为Page.class.php,创建一个类。

要想分页,首先需要获取总记录数,在类里面创建一个私有字段 $total,用来保存总记录数。然后写一个构造方法,初始化用,参数为$_total(实例化时传进来的总记录数)。

然后写个拦截器,用来返回私有字段的值。

接下来设置每页显示条数,创建一个私有字段$limit,用来控制从数据库取的数据为当前页需要显示的记录(在后面使用时说明这个字段怎么用),再创建一个私有字段$pagesize,用来设置每页显示条数,这个值需要用全局变量设置,所以在实例化分页类时用构造方法传进来。

创建一个公共方法showPage(),用来返回分页信息。

创建$page字段,用来保存当前页码。再创建一个获取当前的页码的方法setPage()(其过程见注释)。

创建一个私有字段$pagenum,用来保存总页码,然后在构造方法中给$pagenum赋值,总页码数的值为“总记录 / 分页数”,余数进一(用ceil()方法)。

在获取当前页码的方法中还需要做一个判断,在$_GET['page']大于0时,如果$_GET['page']还大于总的页码数,这样也是不对的。以下是完整的获取当前页码的方法。

然后在构造方法中为$page赋值。

修改$limit,前面的$limit暂时设置为“'LIMIT 0, '.$this->pagesize;”,现在需要把0替换为当前页码显示的第一条记录在总记录中的位置,也就是当前页的前几页已经显示过条数加一,就是当前页的第一条。

接下来做首页、上一页、下一页、尾页的按钮
先做首页,创建一个first()方法,现在还没做获取当前地址的方法,暂时用一个地址表示,只需要返回当前页就可以。

再创建一个last()方法,用来跳转尾页,只需要将url中的参数page设置为最大页码就可以了,也就是$pagenum

创建一个prev()方法,用来跳转上一页,跳转上一页也就是当前页码减一。

下一页按钮同理,是当前页码加一,创建next()方法。

然后在showPage()方法里使用$_page变量来保存分页的字符串,分别依次执行首页、上一页、下一页和尾页方法,返回值保存在$_page变量里,然后返回$_page

因为这个分页类需要不同的页面调用,所以需要自动获取当前页的地址。创建一个获取地址的方法setUrl(),再创一个私有字段$url,用来保存地址。
首先使用系统环境变量把获取到的当前url赋值给$_url,然后返回$_url

在构造方法里用$url取得setUrl()的返回值,然后再把首页、上一页、下一页和尾页的地址替换成$url

这么做完后会发现有问题,因为每个页面的地址不同, 而且page=n每次点击都会累计, 所以, 每次都应该清除掉。
setUrl()方法里,使用parse_url()方法把获取到的当前地址解析成数组,保存到$_par变量,parse_url()方法会把地址解析成一个数组,其中‘path’键对应的是地址中问号前面的部分,不带任何参数,‘query’键对应的是地址中问号后面的部分,是一个字符串,也就是我们需要进行操作的部分。
首先判断一下是否存在‘query’键,如果存在的话进行下一步操作。
再使用parse_str()方法把$_par['query']字符串解析成数组,保存到$_query变量,这时会把地址中参数转换成数组,也就是说$_query['page']存放的就是地址中问号后面的page参数的值,只需要把这个变量删掉就可以了。
然后需要把地址重新组成一下,这里用到了http_bulid_query()方法,这个方法就是把一个数组生成一个url-encoded 请求字符串,数组中的键转换成参数,数组中的值转换成参数的值。然后把重组后的地址赋值给$_url,再返回。完整的setUrl()方法如下。

创建一个数字目录的方法pageList(),用来显示数字分页,在方法里用一个for循环,从一循环到最大页码,然后再循环里赋值给url里的参数page,然后返回,代码如下。

接下来我们需要优化一下分页,让它更符合使用习惯。
点击上一页时,如果现在为第一页,那么就不需要上一页按钮了,这时我们把它的超链接去掉,然后返回。

同理,如果到了最后一页,同样不需要下一页的按钮。

在真正使用分页时,可能会遇到几十上百页,这时候数字分页就不能全部显示出来,所以需要控制要现实的分页,通用的做法是,显示首页和尾页,中间的页码显示当前页码的前后几条,其余用省略号代替。这样当前的数字分页就没办法使用了,需要重新写一下数字分页方法。
首先创建一个私有字段$bothnum用来控制当前页码前后显示的页码条数,在构造方法里赋初值,这里赋值为2,前后显示两条。

然后重写pageList()方法,逻辑见注释。

这里同样需要修改首页和尾页,把文字改成数字,然后判断什么时候显示,什时候不显示,见注释。

做完这些后,修改方法showPage(),在“$_page .= $this->first()”之后加上数字分页的返回值,完整showPage()方法代码如下。

然后我们加一下css样式,如以下代码。

接下来说一下如何使用。

在配置文件里设置PZGE_SIZE全局变量。

在控制类里需要显示分页的地方实例化分页类,参数为总记录数和每页显示的记录数。

同过拦截器取出里面的私有字段$limit的值,赋给模型类里的私有字段$limit,然后在模型类的sql的最后加上$this->limit,就能控制从数据库取出当前页需要显示的数据。

在控制类执行$_page->showPage()方法,然后注入到前台。

然后在前段每个需要显示分页的地方在模版页添加分页显示变量。(这里是用自己开发的TPL模板,根据自己实际情况进行显示)

最终显示样式如下图。

到这里分页类就写完了,下面贴上完整的分页类代码

 

注:此分页类是通过学习李炎恢老师的《PHP第二季教程》所整理。

原文链接:PHP分页类的代码实现,转载请注明来源!

1