原先TP 3.2框架中的Page类是蛮好用的,但是最近有一个比较坑的地方就是我没有办法获取全部满足条件的记录数,但是又需要分页的效果,没有办法,只好自己写了下面这个类,还需要完善,但是基本测试是没有问题的:
<?php
/**
* Created by PhpStorm.
* User: root
* Date: 17-8-10
* Time: 上午11:08
*/
namespace Vendor\GetPage;
class GetPage{
const FRONT_HREF_NUMBER=2;
const BACK_HREF_NUMBER=2;
const FIRST_PAGE_NAME="首页";
const LAST_PAGE_NAME="尾页";
const FRONT_PAGE_NAME="上一页";
const BACK_PAGE_NAME="下一页";
// const CURRENT_PAGE_NAME="";
private $page_size;
public function __construct($page_size)
{
$this->page_size=$page_size;
}
/**
* 根据传入值计算出超链接数量
*
* @param $baseUrl string
* @param $dataInfoCount int|string
* @param $p int|string
* @return string
*/
public function show($baseUrl,$dataInfoCount,$p){
$p=intval($p);
$dataInfoCount=intval($dataInfoCount);
$href=$this->getRange($dataInfoCount,$p);
$show="";
foreach ($href as $k=>$v){
$temp=$baseUrl."/p/".$v;
if($v==$p){
$a="<span><a href='{$temp}' class='current'>{$v}</a></span>";
}else{
$a="<span><a href='{$temp}'>{$v}</a></span>";
}
$show.=$a;
}
return $show;
}
/**
* 根据传入值计算出可用超链接的区间
*
* @param $dataInfo array
* @param $p int
* @return mixed
*/
private function getRange($dataCount,$p){
// 该页信息数量没有达一页显示的最大值,则表示该页是最后一页
if($dataCount<$this->page_size){
$end=$p;
// 总共需要显示的超链接数量
$hrefCount=self::BACK_HREF_NUMBER+self::FRONT_HREF_NUMBER+1;
// 现有分页数量能否满足显示全部超链接
$test=$p-$hrefCount;
// 如果不能的话,则显示最多超链接数量
if($test<0){
$start=1;
}
// 如果可以,则显示全部超链接数量
else{
$start=$test;
}
}
// 如果不是最后一页,则计算前后共需要多少超链接
else{
$test=$p-self::FRONT_HREF_NUMBER;
// 表明当前页前面无法放置2个超链接(该值可以修改),所以直接从首页开始显示
if($test<=0){
$start=1;
$end=$p+self::BACK_HREF_NUMBER;
}else{
$start=$test;
$end=$p+self::BACK_HREF_NUMBER;
}
}
for (;$start<=$end;$start++){
$href[$start]=$start;
}
return $href;
}
}
不可否认的是这个类生成的超链接有数据显示为空的情况,甚至如果增大BACK_HREF_NUMBER
的值,有的页面还会出现错误的情况,但是对于不能提前确定数量,又想模拟分页的要求来说,预测未来本就需要一点代价不是吗?