thinkphp5|thinkPHP 分页写成自己分页类程序代码

时间:2018-02-08  来源:thinkphp  阅读:

我们行来看我自己做的一个实例

 代码如下

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快速入门
相关阅读 猜你喜欢
本类排行 本类最新