我们行来看我自己做的一个实例
代码如下CREATE TABLE IF NOT EXISTS `think_form` (
`id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` varchar(255) NOT NULL,
`create_time` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
修改项目配置文件中的数据库连接信息,打开示例页面后显示
如果没有看到数据的话,请首先往该数据表里面手动添加一些数据来测试分页效果。
新版的分页类可以自动根据当前的URL模式配置生成分页链接,可以更改配置文件中的URL_MODEL和URL_PATHINFO_DEPR参数查看分页链接的区别。
示例中使用的分页类在扩展中心可以单独下载,本示例为了演示方便,直接把分页类放入了项目类库目录下面,实际应用中,需要根据你的实际位置引入分页类库。
关键代码:
import("@.ORG.Page"); //导入分页类
$Form = M("Form");
$count = $Form->count(); //计算总数
$Page = new Page($count, 5);
$list = $Form->limit($Page->firstRow. "," . $Page->listRows)->order("id desc")->select();
// 模拟设置分页额外传入的参数
$Page->parameter = "search=key&name=thinkphp";
// 设置分页显示
$Page->setConfig("header", "条数据");
$Page->setConfig("first", "<<");
$Page->setConfig("last", ">>");
$page = $Page->show();
下面我把它结合起来
代码如下
// +----------------------------------------------------------------------
// | 参考 ThinkPHP 分页类改变而来
// +----------------------------------------------------------------------
// | 有两种样式:1、当面页码始终在中间。 2、当点到分页条两边的页码时,自动翻页(默认)。
// +----------------------------------------------------------------------
// | Author: zbseoag
// +----------------------------------------------------------------------
// $Id: page.class.php 2013-05-26 00:08:49
session_start(); //由于要记录用户是向前,还是向后翻页,故启用了session
class Page{
public $page; //当前页
public $nextPage; //上一页
public $prevPage; //下一页
public $pageMax; //最大页
public $startPage; //分页条起码
public $endPage; // 分页条止码
public $style; //样式:$style = mid
public $parameter;//页数跳转时要带的参数
public $varPage;//默认分页变量
public $url = null; //指定url地址
protected $config = array(
"header"=>"条记录","prev"=>"上一页","next"=>"下一页","first"=>"首页","last"=>"尾页",
"theme" => "%records% %header% %page%/%pageMax% 页 %firstPage%%prevPage%%linkPage%%nextPage%%lastPage%"
);
/**
+----------------------------------------------------------
* 架造函数
+----------------------------------------------------------
* @param $records 总的记录数
* @param $pageSize 每页显示记录数
* @param $pageVal 分页跳转的参数
* @param $parameter 附加参数
+----------------------------------------------------------
*/
function __construct($records, $pageSize, $pageVal = "p", $parameter = null){
$this->records = $records;
$this->pageMax = ceil($records/$pageSize);
$this->page= max(intval($_GET[$pageVal]), 1); //最小为1
$this->page = min($this->page, $this->pageMax); //最大为末页
$this->nextPage = $this->page + 1;
$this->prevPage = $this->page - 1;
$this->varPage = $pageVal; //默认分页变量名
$this->parameter = $parameter; //附加 url 参数
}
/**
+----------------------------------------------------------
* 设置样式
+----------------------------------------------------------
* @param $name 内置参数名
* @param $value 给定参数值
+----------------------------------------------------------
*/
function setConfig($name, $value){
if(isset($this->config[$name])){
$this->config[$name] = $value;
}
}
/**
+----------------------------------------------------------
* 分页显示输出
+----------------------------------------------------------
* @param $length 分页条长度
+----------------------------------------------------------
* @param $hide 是否适时隐藏上、下一页,比如:当前是第一页,则隐藏上一页
+----------------------------------------------------------
*/
function show($length, $hide = false){
if(0 == $this->records) return "";
empty($this->url)? $this->url = $_SERVER["REQUEST_URI"] : null;
$url = $this->url.(strpos($this->url,"?")?"":"?").$this->parameter;
$parse = parse_url($url);
if(isset($parse["query"])){
parse_str($parse["query"],$params);
unset($params[$this->varPage]);
$url = $parse["path"]."?".http_build_query($params);
}
if("mid" == $this->style){ //当前页居中
if($length % 2 != 0 ){
$midder = ceil($length / 2);
$big_repair = $midder - 1 ;//当上面以进一法取整,则这里为减1,反之为加1
}else{
$big_repair = $midder = $length / 2;
}
$sml_repair = $midder- 1; //这是小补丁
$this->startPage = ($this->page + $midder) > $this->pageMax ? $this->pageMax - $length : $this->page - $sml_repair;
$this->endPage = ($this->page < $midder)? $length : $this->page + $big_repair;
}else{ //最后一页翻页
$this->startPage = ($this->page >= $length)? $_SESSION["startPage"] : 1;
$this->endPage = $this->startPage + $length - 1;
$this->lastPage = isset($_SESSION["lastPage"])? $_SESSION["lastPage"] : 1; //上次的页码
$_SESSION["lastPage"] = $this->page; //保存当前页
if($this->lastPage < $this->page){ //后翻页
if($this->page >= $this->endPage){
$this->startPage = $_SESSION["startPage"] = $this->page;
$this->endPage = $this->startPage + $length -1;
}
}elseif($this->lastPage == $this->page){//切换
if($this->page == $this->endPage){
$this->startPage = $_SESSION["startPage"] = $this->page;
$this->endPage = $this->startPage + $length -1;
}else{
$this->startPage = $_SESSION["startPage"] = $this->page - $length + 1;
$this->endPage = $this->startPage + $length -1;
}
}else{//前翻页
if($this->page == $this->startPage ){
$this->startPage = $_SESSION["startPage"] = $this->page - $length + 1;
$this->endPage = $this->startPage + $length -1;
}
}
//echo "开始页码:". $this->startPage."
";
//echo "上次页码:". $this->lastPage."
";
}
//修正一下
$this->startPage = min($this->pageMax - $length + 1, $this->startPage); //最大
$this->startPage = max($this->startPage, 1);//最小为第一页(先求最大,再求最小)
$this->endPage = $this->startPage + $length -1;
$this->endPage = min($this->pageMax, $this->endPage); //最大为末页
$_SESSION["startPage"] = $this->startPage; //修正之后,重新保存
//echo "开始页码:". $this->startPage."
";
//echo "上次页码:". $this->lastPage."
";
if($this->page <= 1){//如果已经是首页
$firstPage = "".$this->config["first"]."";
$prevPage = "".$this->config["prev"]."";
}else{
$firstPage = "varPage=1">".$this->config["first"]."";
$prevPage = "varPage=$this->prevPage">".$this->config["prev"]."";
}
if($this->page >= $this->pageMax){ //如果已经是末页
$nextPage = "".$this->config["next"]."";
$lastPage = "".$this->config["last"]."";
}else{
$lastPage = "varPage=$this->pageMax">".$this->config["last"]."";
$nextPage = "varPage=$this->nextPage">".$this->config["next"]."";
}
if($hide){ //如果是隐藏模式
($this->nextPage >= $this->pageMax)? $nextPage = "" : null;
($this->prevPage < 1)? $prevPage = "" : null;
}
for($i = $this->startPage; $i <= $this->endPage; $i++){
if ($this->page == $i)
$linkPage .= "varPage=$i">$i";
else
$linkPage .= "varPage=$i">$i";
}
$search = array("%records%","%header%","%page%","%pageMax%","%firstPage%","%prevPage%","%linkPage%","%nextPage%","%lastPage%");
$replace = array($this->records,$this->config["header"],$this->page,$this->pageMax,$firstPage,$prevPage,$linkPage,$nextPage,$lastPage);
$pageStr = str_replace($search, $replace, $this->config["theme"]);
return $pageStr;
}
}
$page = new Page(340, 10);
$theme = "%records% %header% %page%/%pageMax% 页 %firstPage%%prevPage%%linkPage%%nextPage%%lastPage%";
$page->setConfig("theme",$theme); //可以修改样式,比如:当不要末页是,可以删除 %lastPage%,或者改变位置次序
$page->setConfig("last","末页"); //可自定义文字 : "header"="条记录","prev"="上一页","next"="下一页","first"="首页","last"="尾页"
$page->url = "http://localhost/test.php";
echo $page->show(10);
?>
下面介绍官网的提供几处分页类效果代码
分页类位于扩展类库下面,需要先导入才能使用,下面是数据分页的两种示例。
第一种:利用Page类和limit方法
代码如下1.$User = M("User"); // 实例化User对象
2.import("ORG.Util.Page");// 导入分页类
3.$count = $User->where("status=1")->count();// 查询满足要求的总记录数
4.$Page = new Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数
5.$show = $Page->show();// 分页显示输出
6.// 进行分页数据查询 注意limit方法的参数要使用Page类的属性
7.$list = $User->where("status=1")->order("create_time")->limit($Page->firstRow.",".$Page->listRows)->select();
8.$this->assign("list",$list);// 赋值数据集
9.$this->assign("page",$show);// 赋值分页输出
10.$this->display(); // 输出模板
2第二种:分页类和page方法的实现
代码如下 1.$User = M("User"); // 实例化User对象
2.// 进行分页数据查询 注意page方法的参数的前面部分是当前的页数使用 $_GET[p]获取
3.$list = $User->where("status=1")->order("create_time")->page($_GET["p"].",25")->select();
4.$this->assign("list",$list);// 赋值数据集
5.import(“ORG.Util.Page”);// 导入分页类
6.$count = $User->where("status=1")->count();// 查询满足要求的总记录数
7.$Page = new Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数
8.$show = $Page->show();// 分页显示输出
9.$this->assign("page",$show);// 赋值分页输出
10.$this->display(); // 输出模板
2带入查询条件
如果是POST方式查询,如何确保分页之后能够保持原先的查询条件呢,我们可以给分页类传入参数,方法是给分页类的parameter属性赋值:
代码如下 1.import("ORG.Util.Page");// 导入分页类2.$mapcount = $User->where($map)->count();// 查询满足要求的总记录数
3.$Page = new Page($count,25);// 实例化分页类 传入总记录数和每页显示的记录数
4.//分页跳转的时候保证查询条件
5.foreach($map as $key=>$val) {
6. $Page->parameter .= "$key=".urlencode($val)."&";
7.}
8.$show = $Page->show();// 分页显示输出
1分页样式定制
默认的分页输出效果是
我们可以对输出的分页样式进行定制,分页类Page提供了一个setConfig方法来修改默认的一些设置。例如:
1.$page->setConfig("header","个会员");
setConfig方法支持的属性包括:
header:头部描述信息,默认值 “条记录”
prev:上一页描述信息,默认值是“上一页”
next:下一页描述信息,默认值是“下一页”
first:第一页描述信息,默认值是“第一页”
last:最后一页描述信息,默认值是“最后一页”
theme :分页主题描述信息,包括了上面所有元素的组合
thinkphp5|thinkPHP 分页写成自己分页类程序代码
http://m.bbyears.com/jiaocheng/39113.html
推荐访问:thinkphp快速入门