`

修正FLEA_Helper_Pager,让其支持source为sql时的多数据库操作

阅读更多
<?php
/////////////////////////////////////////////////////////////////////////////
// FleaPHP Framework
//
// Copyright (c) 2005 - 2008 QeeYuan China Inc. (http://www.qeeyuan.com)
//
// 许可协议,请查看源代码中附带的 LICENSE.txt 文件,
// 或者访问 http://www.fleaphp.org/ 获得详细信息。
/////////////////////////////////////////////////////////////////////////////

/**
 * 定义 FLEA_Helper_Pager 类
 *
 * @copyright Copyright (c) 2005 - 2008 QeeYuan China Inc. (http://www.qeeyuan.com)
 * @author 起源科技 (www.qeeyuan.com)
 * @package Core
 * @version $Id: Pager.php 1016 2007-11-21 13:53:59Z qeeyuan $
 */

/**
 * FLEA_Helper_Pager 类提供数据查询分页功能
 *
 * FLEA_Helper_Pager 使用很简单,只需要构造时传入 FLEA_Db_TableDataGateway 实例以及查询条件即可。
 *
 * @package Core
 * @author 起源科技 (www.qeeyuan.com)
 * @version 1.0
 */
class FLEA_Helper_Pager
{
    /**
     * 如果 $this->source 是一个 FLEA_Db_TableDataGateway 对象,则调用
     * $this->source->findAll() 来获取记录集。
     *
     * 否则通过 $this->dbo->selectLimit() 来获取记录集。
     *
     * @var FLEA_Db_TableDataGateway|string
     */
    var $source;

    /**
     * 数据库访问对象,当 $this->source 参数为 SQL 语句时,必须调用
     * $this->setDBO() 设置查询时要使用的数据库访问对象。
     *
     * @var FLEA_Db_Driver_Abstract
     */
    var $dbo;

    /**
     * 查询条件
     *
     * @var mixed
     */
    var $_conditions;

    /**
     * 排序
     *
     * @var string
     */
    var $_sortby;

    /**
     * 计算实际页码时的基数
     *
     * @var int
     */
    var $_basePageIndex = 0;

    /**
     * 每页记录数
     *
     * @var int
     */
    var $pageSize = -1;

    /**
     * 数据表中符合查询条件的记录总数
     *
     * @var int
     */
    var $totalCount = -1;

    /**
     * 数据表中符合查询条件的记录总数
     *
     * @var int
     */
    var $count = -1;

    /**
     * 符合条件的记录页数
     *
     * @var int
     */
    var $pageCount = -1;

    /**
     * 第一页的索引,从 0 开始
     *
     * @var int
     */
    var $firstPage = -1;

    /**
     * 第一页的页码
     *
     * @var int
     */
    var $firstPageNumber = -1;

    /**
     * 最后一页的索引,从 0 开始
     *
     * @var int
     */
    var $lastPage = -1;

    /**
     * 最后一页的页码
     *
     * @var int
     */
    var $lastPageNumber = -1;

    /**
     * 上一页的索引
     *
     * @var int
     */
    var $prevPage = -1;

    /**
     * 上一页的页码
     *
     * @var int
     */
    var $prevPageNumber = -1;

    /**
     * 下一页的索引
     *
     * @var int
     */
    var $nextPage = -1;

    /**
     * 下一页的页码
     *
     * @var int
     */
    var $nextPageNumber = -1;

    /**
     * 当前页的索引
     *
     * @var int
     */
    var $currentPage = -1;

    /**
     * 构造函数中提供的当前页索引,用于 setBasePageIndex() 后重新计算页码
     *
     * @var int
     */
    var $_currentPage = -1;

    /**
     * 当前页的页码
     *
     * @var int
     */
    var $currentPageNumber = -1;

    /**
     * 构造函数
     *
     * 如果 $source 参数是一个 TableDataGateway 对象,则 FLEA_Helper_Pager 会调用
     * 该 TDG 对象的 findCount() 和 findAll() 来确定记录总数并返回记录集。
     *
     * 如果 $source 参数是一个字符串,则假定为 SQL 语句。这时,FLEA_Helper_Pager
     * 不会自动调用计算各项分页参数。必须通过 calcAllCount() 方法来设置作为分页计算
     * 基础的记录总数。
     *
     * 同时,如果 $source 参数为一个字符串,则不需要 $conditions 和 $sortby 参数。
     * 而且可以通过 setDBO() 方法设置要使用的数据库访问对象。否则 FLEA_Helper_Pager
     * 将尝试获取一个默认的数据库访问对象。
     *
     * @param TableDataGateway|string $source
     * @param int $currentPage
     * @param int $pageSize
     * @param mixed $conditions
     * @param string $sortby
     * @param int $basePageIndex
     *
     * @return FLEA_Helper_Pager
     */
    function FLEA_Helper_Pager(& $source, $currentPage, $pageSize = 20, $conditions = null, $sortby = null, $basePageIndex = 0)
    {
        $this->_basePageIndex = $basePageIndex;
        $this->_currentPage = $this->currentPage = $currentPage;
        $this->pageSize = $pageSize;

        if (is_object($source)) {
            $this->source =& $source;
            $this->_conditions = $conditions;
            $this->_sortby = $sortby;
            $this->calcAllCount();
        } elseif (!empty($source)) {
            $this->source = $source;
        }
    }

    /**
     * 设置分页索引第一页的基数
     *
     * @param int $index
     */
    function setBasePageIndex($index)
    {
        $this->_basePageIndex = $index;
        $this->currentPage = $this->_currentPage;
        $this->computingPage();
    }

    /**
     * 设置当前页码,以便用 findAll() 获得其他页的数据
     *
     * @param int $page
     */
    function setPage($page)
    {
        $this->_currentPage = $page;
        $this->currentPage = $page;
        $this->computingPage();
    }

    /**
     * 计算记录总数,从而更新分页参数
     *
     */
    function calcAllCount(){
    	if (is_object($this->source)){    		
    		$this->totalCount = $this->count = (int)$this->source->findCount($this->_conditions);
            $this->computingPage();    		
    	}elseif (!empty($this->source)) {
    		$sql = "SELECT COUNT(*) FROM ( $this->source ) as _count_table";
    		if (is_null($this->dbo)) {
                $this->dbo =& FLEA::getDBO(false);
            }
            $this->totalCount = $this->count = (int)$this->dbo->getOne($sql);
            $this->computingPage();
    	}    	
    }
    
    /**
     * 设置数据库访问对象
     *
     * @param FLEA_Db_Driver_Abstract $dbo
     */
    function setDBO(& $dbo)
    {
        $this->dbo =& $dbo;
    }

    /**
     * 返回当前页对应的记录集
     *
     * @param string $fields
     * @param boolean $queryLinks
     *
     * @return array
     */
    function & findAll($fields = '*', $queryLinks = true)
    {
        if ($this->count == -1) {
            $this->count = 20;
        }

        $offset = ($this->currentPage - $this->_basePageIndex) * $this->pageSize;
        if (is_object($this->source)) {
            $limit = array($this->pageSize, $offset);
            $rowset = $this->source->findAll($this->_conditions, $this->_sortby, $limit, $fields, $queryLinks);
        } else {
            if (is_null($this->dbo)) {
                $this->dbo =& FLEA::getDBO(false);
            }
            $rs = $this->dbo->selectLimit($this->source, $this->pageSize, $offset);
            $rowset = $this->dbo->getAll($rs);
        }
        return $rowset;
    }

    /**
     * 返回分页信息,方便在模版中使用
     *
     * @param boolean $returnPageNumbers
     *
     * @return array
     */
    function getPagerData($returnPageNumbers = true)
    {
        $data = array(
            'pageSize' => $this->pageSize,
            'totalCount' => $this->totalCount,
            'count' => $this->count,
            'pageCount' => $this->pageCount,
            'firstPage' => $this->firstPage,
            'firstPageNumber' => $this->firstPageNumber,
            'lastPage' => $this->lastPage,
            'lastPageNumber' => $this->lastPageNumber,
            'prevPage' => $this->prevPage,
            'prevPageNumber' => $this->prevPageNumber,
            'nextPage' => $this->nextPage,
            'nextPageNumber' => $this->nextPageNumber,
            'currentPage' => $this->currentPage,
            'currentPageNumber' => $this->currentPageNumber,
        );

        if ($returnPageNumbers) {
            $data['pagesNumber'] = array();
            for ($i = 0; $i < $this->pageCount; $i++) {
                $data['pagesNumber'][$i] = $i + 1;
            }
        }

        return $data;
    }

    /**
     * 产生指定范围内的页面索引和页号
     *
     * @param int $currentPage
     * @param int $navbarLen
     *
     * @return array
     */
    function getNavbarIndexs($currentPage = 0, $navbarLen = 8)
    {
        $mid = intval($navbarLen / 2);
        if ($currentPage < $this->firstPage) {
            $currentPage = $this->firstPage;
        }
        if ($currentPage > $this->lastPage) {
            $currentPage = $this->lastPage;
        }

        $begin = $currentPage - $mid;
        if ($begin < $this->firstPage) { $begin = $this->firstPage; }
        $end = $begin + $navbarLen - 1;
        if ($end >= $this->lastPage) {
            $end = $this->lastPage;
            $begin = $end - $navbarLen + 1;
            if ($begin < $this->firstPage) { $begin = $this->firstPage; }
        }

        $data = array();
        for ($i = $begin; $i <= $end; $i++) {
            $data[] = array('index' => $i, 'number' => ($i + 1 - $this->_basePageIndex));
        }
        return $data;
    }

    /**
     * 生成一个页面选择跳转控件
     *
     * @param string $caption
     * @param string $jsfunc
     */
    function renderPageJumper($caption = '%u', $jsfunc = 'fnOnPageChanged')
    {
        $out = "<select name=\"PageJumper\" onchange=\"{$jsfunc}(this.value);\">\n";
        for ($i = $this->firstPage; $i <= $this->lastPage; $i++) {
            $out .= "<option value=\"{$i}\"";
            if ($i == $this->currentPage) {
                $out .= " selected";
            }
            $out .=">";
            $out .= sprintf($caption, $i + 1 - $this->_basePageIndex);
            $out .= "</option>\n";
        }
        $out .= "</select>\n";
        echo $out;
    }

    /**
     * 计算各项分页参数
     */
    function computingPage()
    {
        $this->pageCount = ceil($this->count / $this->pageSize);
        $this->firstPage = $this->_basePageIndex;
        $this->lastPage = $this->pageCount + $this->_basePageIndex - 1;
        if ($this->lastPage < $this->firstPage) { $this->lastPage = $this->firstPage; }

        if ($this->lastPage < $this->_basePageIndex) {
            $this->lastPage = $this->_basePageIndex;
        }

        if ($this->currentPage >= $this->pageCount + $this->_basePageIndex) {
            $this->currentPage = $this->lastPage;
        }

        if ($this->currentPage < $this->_basePageIndex) {
            $this->currentPage = $this->firstPage;
        }

        if ($this->currentPage < $this->lastPage - 1) {
            $this->nextPage = $this->currentPage + 1;
        } else {
            $this->nextPage = $this->lastPage;
        }

        if ($this->currentPage > $this->_basePageIndex) {
            $this->prevPage = $this->currentPage - 1;
        } else {
            $this->prevPage = $this->_basePageIndex;
        }

        $this->firstPageNumber = $this->firstPage + 1 - $this->_basePageIndex;
        $this->lastPageNumber = $this->lastPage + 1 - $this->_basePageIndex;
        $this->nextPageNumber = $this->nextPage + 1 - $this->_basePageIndex;
        $this->prevPageNumber = $this->prevPage + 1 - $this->_basePageIndex;
        $this->currentPageNumber = $this->currentPage + 1 - $this->_basePageIndex;
    }
}

 

<?php
class Application extends FLEA_Controller_Action {
	
	/**
     * 后台首页
     */
    function actionIndex() {
		FLEA::loadHelper('pager');
		$sql = 'select * from nodes';
		$pager = & new FLEA_Helper_Pager($sql,1);
		$pager->calcAllCount();
//		$rows = & $pager->findAll();
		trace($pager);
//		
//		FLEA::loadClass('Nodes');
//		$nodes = & new Nodes();
//		$pager = & new FLEA_Helper_Pager($nodes,1);
//		trace($pager);
    }
	
}
 
0
0
分享到:
评论

相关推荐

    fleaphp常用方法分页之Pager使用方法

    在构造函数中,根据`$source`的类型,`FLEA_Helper_Pager`会执行相应的操作。如果是`TableDataGateway`对象,它会直接计算出总记录数和当前页面的数据;如果是字符串(假设为SQL),则需要我们手动设置总记录数,...

    flea_market-master_个性化购物网站_tide1tv_presseqr_

    【标题】"flea_market-master_个性化购物网站_tide1tv_presseqr_" 指的是一个基于开源项目实现的个性化购物网站系统,特别针对跳蚤市场进行了优化设计。这个项目可能结合了“tide1tv”和“presseqr”两个技术组件,...

    fleamarket_sample_kagawa-a-master.rar

    【标题】"fleamarket_sample_kagawa-a-master.rar" 指的可能是一个开源项目或软件示例,其核心是围绕“fleamarket”(跳蚤市场或二手交易)的应用场景,可能是一个在线市场平台的代码库。"Kagawa-a-master"可能代表...

    fleamarket_7.13.76.5.apk

    fleamarket_7.13.76.5.apk

    FleaMarket.zip

    "FleaMarket.zip" 是一个包含源代码的压缩文件,很可能是一个Android或Java项目的结构。从提供的文件列表来看,我们可以分析出这个项目的一些关键组成部分和开发环境的设置。 1. **gradlew.bat**: 这是一个批处理...

    Fleaphp常见函数功能与用法示例

    在本文中,我们将深入探讨Fleaphp框架中的常见函数,这些函数对于理解和操作数据库至关重要。Fleaphp是一个PHP开发框架,它提供了一系列方便的数据操作接口,使得开发者能够更高效地处理数据。 1. `FLEA_Db_Table...

    FleaPHP 框架学习教程.pdf

    - 使用`FLEA_Db_TableDataGateway`类简化数据库操作。 - 数据通过数组形式存储和传递,避免了每个记录封装为对象导致的性能问题。 3. **最少的配置需求** - 只需少量配置即可运行。 - 所有配置使用PHP数组存储...

    DOJO+FLEA 企业门户网站

    【标题】"DOJO+FLEA 企业门户网站" 涉及到的技术栈主要是DOJO和FLEA,它们在构建企业级网站中扮演着重要角色。DOJO是一个开源JavaScript库,提供了丰富的UI组件和强大的数据处理功能,适用于构建富互联网应用程序。...

    FLEA框架中文API

    最近学了FLEA,觉得还行,但是资料比较少,发现很多朋友找不到FLEA的API,现在把他共享出来,供大家学习参考!

    com.taobao.fleamarket

    com.taobao.fleamarket最新包,用于淘宝二手android客户端应用。

    Fleaphp 常用方法.doc

    这个函数用于获取数据库访问对象,返回一个`FLEA_Db_Driver_Prototype`实例。这个对象提供了统一的数据库访问接口,无论你使用的是哪种数据库系统。`$dsn`参数可以是数组或字符串,用于定义数据库连接信息。例如,...

    Fleaphp框架使用规范收集.pdf

    Fleaphp框架提供了一系列工具类,比如FLEA_Helper_ImgCode帮助生成图片验证码等。这些工具类可以简化开发流程,提高开发速度。 9. 请求和响应处理: Fleaphp框架对HTTP请求和响应处理提供了清晰的接口。通过$_GET、...

    DOJO加FLEA做的信息管理系统

    5. **国际化和本地化支持**:DOJO内置了对多语言和文化环境的支持,有助于全球化的应用开发。 【FLEA组件】 FLEA可能是一个针对特定项目定制的组件或插件库,它扩展了DOJO的基础功能,以满足项目特有的需求。这可能...

    fleamarket_sample_79a

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...FLEAMARKET DB设计用户テーブル柱子类型选项昵称细绳null:假电子邮件细绳...

    php FLEA中二叉树数组的遍历输出

    最近在做一个项目其中涉及到“无限级回复”,FLEA中中有一个关于数组的辅助类:FLEA_Helper_Array,这个类里面有一个非常强大的数组处理方法:array_to_tree,这个方法可以把二维数组转换为二叉树结构

    Point Grey Flea3系列高速VGA超紧凑型相机产品手册.pdf

    从给定的文件信息中,我们...总而言之,Flea3系列高速VGA超紧凑型相机是针对工业视觉应用设计的,其优势在于小型轻量设计、高帧率和高分辨率的图像捕捉能力,同时兼备多种高级功能和接口选项,满足不同的工业应用需求。

    fleamarket_sample_74e

    您可能要讲的内容: Ruby版本系统依赖配置数据库创建数据库初始化如何运行测试套件服务(作业队列,缓存服务器,搜索引擎等) 部署说明...数据库设计ER図用户テーブル柱子类型选项电子邮件细绳null:false,唯一:...

    fleamarket_sample_76b

    数据库创建 数据库初始化 如何运行测试套件 服务(作业队列,缓存服务器,搜索引擎等) 部署说明 ... 用户テーブル 柱子 类型 选项 昵称 细绳 null:假 电子邮件 细绳 null:假,唯一:true 密码 细绳 null:假 ...

Global site tag (gtag.js) - Google Analytics