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();

下面我把它结合起来

 

 代码如下 复制代码

<?php
// +----------------------------------------------------------------------
// | 参考  ThinkPHP 分页类改变而来
// +----------------------------------------------------------------------
// | 有两种样式:1、当面页码始终在中间。 2、当点到分页条两边的页码时,自动翻页(默认)。
// +----------------------------------------------------------------------
// | Author: zbseoag <zbsoeagy@qq.com>
// +----------------------------------------------------------------------
// $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.'<br/>';
            //echo '上次页码:'. $this->lastPage.'<br/>';
        }
        //修正一下
        $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.'<br/>';
        //echo '上次页码:'. $this->lastPage.'<br/>';
        
        if($this->page <= 1){//如果已经是首页
            $firstPage = '<span>'.$this->config['first'].'</span>';
            $prevPage = '<span>'.$this->config['prev'].'</span>';
        }else{
            $firstPage = "<span><a href='$url&$this->varPage=1'>".$this->config['first'].'</a>';
            $prevPage = "<span><a href='$url&$this->varPage=$this->prevPage'>".$this->config['prev'].'</a>';
        }
       
        if($this->page >= $this->pageMax){ //如果已经是末页
            $nextPage = '<span>'.$this->config['next'].'</span>';
            $lastPage = '<span>'.$this->config['last'].'</span>';
        }else{
            $lastPage = "<a href='$url&$this->varPage=$this->pageMax'>".$this->config['last'].'</a>';
            $nextPage = "<a href='$url&$this->varPage=$this->nextPage'>".$this->config['next'].'</a>';
        }
       
        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 .= "<a class='current' href='$url&$this->varPage=$i'>$i</a>";
            else
                $linkPage .= "<a href='$url&$this->varPage=$i'>$i</a>";
        }
        $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);

?>
 <style>
a,span{ margin:2px 5px;}
.current{ color:red;}
</style>

下面介绍官网的提供几处分页类效果代码

分页类位于扩展类库下面,需要先导入才能使用,下面是数据分页的两种示例。

第一种:利用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 :分页主题描述信息,包括了上面所有元素的组合

时间: 2024-09-21 00:20:07

thinkPHP 分页写成自己分页类程序代码的相关文章

也写一个Ajax.Request类附代码_AJAX相关

目的:因为blog程序里的某些模块需要用到ajax,直接使用prototype.js体积比较大(40多k),而且仅仅用到其中的ajax功能,因此为了减轻下载的负担,又不能改动已经在prototype.js框架下写好的代码,只能是按照prototype的风格,自己写一个ajax类,达到零成本移植框架. 新的ajax类如下: var Ajax = {xmlhttp:function(){ try{ return new ActiveXObject('Msxml2.XMLHTTP'); }catch(

一个无限分类的处理类程序代码

 代码如下 复制代码 <?php /* 名称: 对分类操作的业务逻辑封装 * * 作者: 帅的像人渣 QQ: 1191391 E-mail: netcat2@21cn.com * * 完成日期: 2003-12-18 13:33 * * 说明: 本类中引用的其它类(DB.Table.Item)均未提供,所以本类只能做个参考,不能直接应用 * 不是本人小气不提供其它类,实在是因为那些都是一两年前写的类,很烂.怕大家看后对大 * 造成误导. 在此发表这个类,只希望大家能从中学到一些程序设计的方法.

二款php数据库备份类程序代码

下面看下使用方法:  代码如下 复制代码 <?php error_reporting(0);//消灭万恶的php报警提示 //设定邮箱 $options = array('email' => array('email1', 'email2'), 'folder' => './backup/', 'mysql' => array('localhost', 'user', 'password', 'db'));   $b = new Backup($options);     // 提

Php Aes加密类程序代码分享

AES加密算法 – 算法原理 AES 算法基于排列和置换运算.排列是对数据重新进行安排,置换是将一个数据单元替换为另一个.AES 使用几种不同的方法来执行排列和置换运算. AES 是一个迭代的.对称密钥分组的密码,它可以使用128.192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据.与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据.通过分组密码返回的加密数据的位数与输入数据相同.迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据.  代码如

php文件上传类程序代码

 代码如下 复制代码 <?php  /**   * 文件上传类   */  class uploadFile {       public $max_size = '1000000';//设置上传文件大小     public $file_name = 'date';//重命名方式代表以时间命名,其他则使用给予的名称     public $allow_types;//允许上传的文件扩展名,不同文件类型用"|"隔开     public $errmsg = '';//错误信息  

asp.net cookie类程序代码

 代码如下 复制代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Web.Security; using System.Web.UI;

asp 缓存类程序代码

class Cache  private obj   'cache内容  private expireTime  '过期时间  private expireTimeName '过期时间application名  private cacheName  'cache内容application名  private path   'uri  private sub class_initialize()   path=request.servervariables("url")   path=l

php 3des加密解密类程序代码

3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法.  代码如下 复制代码 <?php class Crypt3Des { var $key; function Cry

js判断undefined类程序代码

没有给变量赋值,如:var tmp:如果这是用typeof去判断这个变量的类型的话肯定是undefined类型. 如果用var 声明了某变量之后我们可以直接用  代码如下 复制代码 if( tmp == undefined )或者if( tmp != undefined ) 去判断,这个是没有问题的,不过这边也容易出现一个陷阱,如果一个变量没有用var声明过,而直接用  代码如下 复制代码 if( tmp == undefined )或者if( tmp != undefined ) 去判断的话是