标题: PHP编程:一个分页导航类 [打印本页] 作者: 乐观 时间: 2015-2-16 00:28 标题: PHP编程:一个分页导航类 基础这个东西是个比较笼统的概念,如果你之前学习过c语言, c语言被认为是分页 <?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 |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Authors: Richard Heyes <richard@phpguru.org> |
// +----------------------------------------------------------------------+
/**
* 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;
/**
* 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;
/**
* 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();
}
/**
* 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();
}
/**
* 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);
/**
* 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;
/**
* 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));
/**
* 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 = '';
}