子分类
  • 无子分类
Paginator类(class Paginator),数据分页(page)类
  • 2014-07-02发布
  • 2014-07-03修改

Paginator类位于 Tun\Paginator\ 目录下,是实现数据分页的主要通道。


在模型层使用分页类示例如下:

<?php
namespace User\Model;
use Tun\Db\Sql\Sql;
use Tun\Db\Sql\Where;
use Tun\Db\Adapter\Adapter;
use Tun\Db\Sql\Expr;
use Tun\Db\Sql\ExprWhere;
use Tun\Paginator\Paginator;
use Tun\Request\Params;
use Tun\Captcha\CaptchaCode;
class Document{
    private $sortReg = '/^[0-9]{0,11}$/';
    
    public function __construct(Adapter $adapter){
        $this->adapter = $adapter;
        $this->table = 'document';
        $this->categoryTable = 'document_cate';
    }
    /**
     *
     * @param int $id
     * @return array
     */
    public function getLists($currentPageNum,$filter= array(),$pagePreCount = 20){
        $params = new Params();
        $login     = $params->getSession('login');
        
        $table = $this->table;
        $sql = new Sql($this->adapter);
        $select = $sql->select();
        $select->from(array('a'=>$table));
        $select->join(array('ac'=>$this->categoryTable),
            'a.document_cate_id=ac.document_cate_id',array('document_cate'));
        $select->columns(array('document_id','document_cate_id',
            'title','keywords','add_time','mod_time'));
        $select->limit($pagePreCount);
        $select->offset(($currentPageNum - 1) * $pagePreCount);
        $select->order(array('a.sort'=>'DESC','a.add_time'=>'DESC',
            'document_id'=>'DESC'));
        if($login['is_admin'] != 1){
            $select->where(array('a.user_id' => $login['user_id']));
        }
        $page = new Paginator($select,$this->adapter);
        $page->setCache('document',60);
        $page->setPagePreCount($pagePreCount);
        $page->setCurrentPageNum($currentPageNum);
        $statement = $select->statement();
        //         echo $result = $statement->prepareToString();
        $result = array();
        $result['records'] = $statement->prepare()->fetchAll();
        $result['paginator'] = $page->getPaginator();
        return $result;
    
    }
}


下面是分页代码:

$page = new Paginator($select,$this->adapter);
$page->setCache('document',0);
$page->setPagePreCount($pagePreCount);
$page->setCurrentPageNum($currentPageNum);
$result['paginator'] = $page->getPaginator();


$page = new Paginator($sqlTotal,Adapter $adapter = null);


$sqlTotal可以是Select对象,上面的例子中就传入了$select对象。这时候需要把$adapter也传进去,Paginator会根据当前的$select对象计算出记录总数,从而实现分页。


$sqlTotal也可以是一个int值,表示传入的记录总数,Paginator根据这个数据总数计算分页数据。这时不需要传$adapter。这种方式一般用于手动书写纯SQL语句,通过$sql->setSql()的形式查询数据的分页计算。


由于有些时候计算记录总数的资源开销很大,所以Paginator支持把$sqlTotal数据总数进行缓存,只需通过:

$page->setCache('document',60);

即可将数据总数缓存起来,下次调用Paginator对象时会优先查找缓存记录,避免又一次查询数据库。

setCache的参数格式为setCache('缓存名称',(int)时间秒数);//注意:这里的setCache()参数与调用缓存类$cache->set()的参数不同。


$page->getPaginator();返回的数据结构如下所示:

object(Tun\Paginator\Paginator)#22 (9) {  
    ["isCache"]=>  bool(true)  
    ["cacheKey"]=>  string(33) "org_bzhi_bzf_paginator_document_5"
    ["cacheExpiration"]=>  int(60)  
    ["currentPageNum"]=>  int(1)  
    ["pageTotal"]=>  float(1)  
    ["recordTotal"]=>  int(9)  
    ["pagePreCount"]=>  int(20)  
    ["pageNumRound"]=>  int(5)  
    ["pageNums"]=>  array(1) {    
        [0]=>    
        int(1)  
     }
}