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

作者:袖梨 2022-06-25

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

 代码如下 复制代码

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 = "".$this->config['first'].'';
            $prevPage = "".$this->config['prev'].'';
        }
       
        if($this->page >= $this->pageMax){ //如果已经是末页
            $nextPage = ''.$this->config['next'].'';
            $lastPage = ''.$this->config['last'].'';
        }else{
            $lastPage = "".$this->config['last'].'';
            $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 .= "$i";
            else
                $linkPage .= "$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 :分页主题描述信息,包括了上面所有元素的组合

相关文章

精彩推荐