当前位置:Linux教程 - Php - 一个分页导航类

一个分页导航类

一个分页导航类
xiaocon 2004-03-01 15


<?php
// +----------------------------------------------------------------------+
// │ PHP Version 4                                                        │
// +----------------------------------------------------------------------+
// │ Copyright (c) 1997-2002 The PHP Group                                │
// +----------------------------------------------------------------------+
// │ This source file is subject to version 2.02 of the PHP license,      │
// │ that is bundled with this package in the file LICENSE, and is        │
// │ available at through the world-wide-web at                           │
// │ http://www.php.net/license/2_02.txt.                                 │
// │ If you did not receive a copy of the PHP license and are unable to   │
// │ obtain it through the world-wide-web, please send a note to          │
// │ [email protected] so we can mail you a copy immediately.               │
// +----------------------------------------------------------------------+
// │ Authors: Richard Heyes <[email protected]>                         │
// +----------------------------------------------------------------------+

/**
* Pager class
*
* Handles paging a set of data. For usage see the example.php provided.
*
*/

class Pager {

    
/**
    * Current page
    * @var integer
    */
    
var $_currentPage;

    
/**
    * Items per page
    * @var integer
    */
    
var $_perPage;

    
/**
    * Total number of pages
    * @var integer
    */
    
var $_totalPages;

    
/**
    * Item data. Numerically indexed array...
    * @var array
    */
    
var $_itemData;

    
/**
    * Total number of items in the data
    * @var integer
    */
    
var $_totalItems;

    
/**
    * Page data generated by this class
    * @var array
    */
    
var $_pageData;

    
/**
    * Constructor
    *
    * Sets up the object and calculates the total number of items.
    *
    * @param $params An associative array of parameters This can contain:
    *                  currentPage   Current Page number (optional)
    *                  perPage       Items per page (optional)
    *                  itemData      Data to page
    */
    
function pager($params = array())
    {
        global
$HTTP_GET_VARS;

        
$this->_currentPage = max((int)@$HTTP_GET_VARS['pageID'], 1);
        
$this->_perPage     = 8;
        
$this->_itemData    = array();

        foreach (
$params as $name => $value) {
            
$this->{'_' . $name} = $value;
        }

        
$this->_totalItems = count($this->_itemData);
    }

    
/**
    * Returns an array of current pages data
    *
    * @param $pageID Desired page ID (optional)
    * @return array Page data
    */
    
function getPageData($pageID = null)
    {
        if (isset(
$pageID)) {
            if (!empty(
$this->_pageData[$pageID])) {
                return
$this->_pageData[$pageID];
            } else {
                return
FALSE;
            }
        }

        if (!isset(
$this->_pageData)) {
            
$this->_generatePageData();
        }

        return
$this->getPageData($this->_currentPage);
    }

    
/**
    * Returns pageID for given offset
    *
    * @param $index Offset to get pageID for
    * @return int PageID for given offset
    */
    
function getPageIdByOffset($index)
    {
        if (!isset(
$this->_pageData)) {
            
$this->_generatePageData();
        }

        if ((
$index % $this->_perPage) > 0) {
            
$pageID = ceil((float)$index / (float)$this->_perPage);
        } else {
            
$pageID = $index / $this->_perPage;
        }

        return
$pageID;
    }

    
/**
    * Returns offsets for given pageID. Eg, if you
    * pass it pageID one and your perPage limit is 10
    * it will return you 1 and 10. PageID of 2 would
    * give you 11 and 20.
    *
    * @params pageID PageID to get offsets for
    * @return array  First and last offsets
    */
    
function getOffsetByPageId($pageid = null)
    {
        
$pageid = isset($pageid) ? $pageid : $this->_currentPage;
        if (!isset(
$this->_pageData)) {
            
$this->_generatePageData();
        }

        if (isset(
$this->_pageData[$pageid])) {
            return array((
$this->_perPage * ($pageid - 1)) + 1, min($this->_totalItems, $this->_perPage * $pageid));
        } else {
            return array(
0,0);
        }
    }

    
/**
    * Returns back/next and page links
    *
    * @param  $back_html HTML to put inside the back link
    * @param  $next_html HTML to put inside the next link
    * @return array Back/pages/next links
    */
    
function getLinks($back_html = '<< Back', $next_html = 'Next >>')
    {
        
$url   = $this->_getLinksUrl();
        
$back  = $this->_getBackLink($url, $back_html);
        
$pages = $this->_getPageLinks($url);
        
$next  = $this->_getNextLink($url, $next_html);

        return array(
$back, $pages, $next, 'back' => $back, 'pages' => $pages, 'next' => $next);
    }

    
/**
    * Returns number of pages
    *
    * @return int Number of pages
    */
    
function numPages()
    {
        return
$this->_totalPages;
    }

    
/**
    * Returns whether current page is first page
    *
    * @return bool First page or not
    */
    
function isFirstPage()
    {
        return (
$this->_currentPage == 1);
    }

    
/**
    * Returns whether current page is last page
    *
    * @return bool Last page or not
    */
    
function isLastPage()
    {
        return (
$this->_currentPage == $this->_totalPages);
    }

    
/**
    * Returns whether last page is complete
    *
    * @return bool Last age complete or not
    */
    
function isLastPageComplete()
    {
        return !(
$this->_totalItems % $this->_perPage);
    }

    
/**
    * Calculates all page data
    */
    
function _generatePageData()
    {
        
$this->_totalItems = count($this->_itemData);
        
$this->_totalPages = ceil((float)$this->_totalItems / (float)$this->_perPage);
        
$i = 1;
        if (!empty(
$this->_itemData)) {
            foreach (
$this->_itemData as $value) {
                
$this->_pageData[$i][] = $value;
                if (
count($this->_pageData[$i]) >= $this->_perPage) {
                    
$i++;
                }
            }
        } else {
            
$this->_pageData = array();
        }
    }

    
/**
    * Returns the correct link for the back/pages/next links
    *
    * @return string Url
    */
    
function _getLinksUrl()
    {
        global
$HTTP_SERVER_VARS;

        
// Sort out query string to prevent messy urls
        
$querystring = array();
        if (!empty(
$HTTP_SERVER_VARS['QUERY_STRING'])) {
            
$qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']);            
            for (
$i = 0, $cnt = count($qs); $i < $cnt; $i++) {
                list(
$name, $value) = explode('=', $qs[$i]);
                if (
$name != 'pageID') {
                    
$qs[$name] = $value;
                }
                unset(
$qs[$i]);
            }
        }
    if(
is_array($qs)){
            foreach (
$qs as $name => $value) {
                
$querystring[] = $name . '=' . $value;
            }    
    }
        return
$HTTP_SERVER_VARS['SCRIPT_NAME'] . '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . 'pageID=';
    }

    
/**
    * Returns back link
    *
    * @param $url  URL to use in the link
    * @param $link HTML to use as the link
    * @return string The link
    */
    
function _getBackLink($url, $link = '<< Back')
    {
        
// Back link
        
if ($this->_currentPage > 1) {
            
$back = '<a href="' . $url . ($this->_currentPage - 1) . '">' . $link . '</a>';
        } else {
            
$back = '';
        }
        
        return
$back;
    }

    
/**
    * Returns pages link
    *
    * @param $url  URL to use in the link
    * @return string Links
    */
    
function _getPageLinks($url)
    {
        
// Create the range
        
$params['itemData'] = range(1, max(1, $this->_totalPages));
        
$pager =& new Pager($params);
        
$links =  $pager->getPageData($pager->getPageIdByOffset($this->_currentPage));

        for (
$i=0; $i<count($links); $i++) {
            if (
$links[$i] != $this->_currentPage) {
                
$links[$i] = '<a href="' . $this->_getLinksUrl() . $links[$i] . '">' . $links[$i] . '</a>';
            }
        }

        return
implode(' ', $links);
    }

    
/**
    * Returns next link
    *
    * @param $url  URL to use in the link
    * @param $link HTML to use as the link
    * @return string The link
    */
    
function _getNextLink($url, $link = 'Next >>')
    {
        if (
$this->_currentPage < $this->_totalPages) {
            
$next = '<a href="' . $url . ($this->_currentPage + 1) . '">' . $link . '</a>';
        } else {
            
$next = '';
        }

        return
$next;
    }
}

?>







相关帖子

一个分页导航类 - xiaocon 2002-4-7 16:17:28 [ID:1310532 点击:10] (9098 Bytes) (1)  
示例 - xiaocon 2002-4-7 16:17:55 [ID:1310533 点击:8] (849 Bytes) (0)  
示例
xiaocon 发表于 2002-4-7 16:17 PHP编程 ←返回版面     


<?php
//if(!$pageID)$pageID=1;
include('Pager.php');

$params['itemData'] = range(1, 180);

$pager =& new Pager($params);
$data  = $pager->getPageData();
$links = $pager->getLinks("<<上页","下页>>");
list(
$from, $to) = $pager->getOffsetByPageId();

?>
<html>
<body>

<table border="0" width="100%">
    <tr>
        <td colspan="3" align="center">
            显示 [<?=$from?> - <?=$to?>] 条记录,共<?=$pager->_totalItems?>条记录 <br />
            <?=$links['pages']?>
        </td>
    </tr>

    <tr>
        <td><nobr><?=$links['back']?></nobr></td>
        <td align="center" width="100%"> </td>
        <td align="right"><nobr><?=$links['next']?></nobr></td>
    </tr>

    <tr>
        <td colspan="3">
            <pre><?print_r($data)?></pre>

        </td>
    </tr>
</table>

</body>
</html>