php分页类程序源
class Page {
// public param
public $pageName = 'page'; // 默认 page 标签,即 filename.php?pageName=4 中的 pageName
public $prevPage = '<'; // 上一页
public $nextPage = '>'; // 下一页
public $prevBar = '<<'; // 上一分页条
public $nextBar = '>>'; // 下一分页条
// private param
private $_totalNums = 1; // 总记录数
private $_barNum = 10; // 分页条显示分页个数
private $_totalPage = 0; // 总页数
private $_nowPage = 1; // 当前页
private $_perPage = 10; // 每页显示记录数
private $_preUrl = ''; // url 前缀
private $_preNow = 0; // 当前页前显示分页个数 (范围应该是 0 至 $_barNum-1)
private $_fromPage = 0; // 分页条起点
private $_toPage = 0; // 分页条末端
private $_offset = 0; // sql 查询记录偏移量
// public functions -----------------------------------------------------------------
// 构造函数 初始化分页变量
// @param $nums int 总记录数
// @param $per int 每页显示记录数
// @param $now int 当前页数
// @param $url string url前缀 默认为空
public function __construct($nums, $per = '', $preNow = '', $barNum = '', $now = '', $url = '') {
// 初始化
$this->_set($nums, $per, $preNow, $barNum, $now, $url);
$this->_totalPage = ceil($this->_totalNums/$this->_perPage);
$this->_offset = ($this->_nowPage - 1) * $this->_perPage;
}
// 上一页
public function getPrevPage() {
// 当前页不是第一页
if($this->_nowPage > 1) {
return $this->_setLink($this->_setUrl($this->_nowPage - 1), $this->prevPage, 'prevpage');
}
}
// 下一页
public function getNextPage() {
// 当前页小于总页数
if($this->_nowPage < $this->_totalPage) {
return $this->_setLink($this->_setUrl($this->_nowPage + 1), $this->nextPage, 'nextpage');
}
}
// 第一页
public function getFirstPage() {
// 起点不是第一页
if(($this->_nowPage - $this->_preNow) > 1) {
return $this->_setLink($this->_setUrl(1), '1...', 'firstpage');
}
}
// 最后一页
public function getLastPage() {
// 末端不大于总页数
if(($this->_nowPage - $this->_preNow + $this->_barNum) <= $this->_totalPage) {
return $this->_setLink($this->_setUrl($this->_totalPage), '...' . $this->_totalPage, 'lastpage');
}
}
// 上一分页条
public function getPrevBar() {
// 起点大于一个分页条数
if(($this->_nowPage - $this->_preNow) > $this->_barNum) {
return $this->_setLink($this->_setUrl(($this->_nowPage - $this->_preNow) - $this->_barNum), $this->prevBar, 'prevbar');
}
}
// 下一分页条
public function getNextBar() {
// 末端不大于总页数
if(($this->_nowPage - $this->_preNow + $this->_barNum) <= $this->_totalPage) {
return $this->_setLink($this->_setUrl($this->_fromPage + $this->_barNum), $this->nextBar, 'nextbar');
}
}
// 分页条
public function pageBar() {
// 初始化分页条的始末端点
$this->_toPage = $this->_nowPage + ($this->_barNum - $this->_preNow - 1);
if($this->_toPage > $this->_totalPage) {
$this->_preNow = $this->_barNum - ($this->_totalPage - $this->_nowPage + 1);
$this->_toPage = $this->_totalPage;
}
if($this->_toPage < $this->_barNum) {
$this->_toPage = $this->_barNum;
}
$this->_fromPage = $this->_nowPage - $this->_preNow;
if($this->_fromPage < 1) {
$this->_fromPage = 1;
}
// 初始化分页条
$return = '';
for($i = $this->_fromPage; $i <= $this->_toPage; $i++) {
if($i != $this->_nowPage) {
$return .= $this->_setLink($this->_setUrl($i), $i, 'page');
} else {
$return .= '<span class="nowpage">' . $i . '</span>';
}
}
return $return;
}
// 返回偏移量 用于 sql 查询
public function getOffset() {
return $this->_offset;
}
// 返回总记录数
public function getTotalNums() {
return '<span class="totalnums">' . $this->_totalNums . '</span>';
}
// 显示分页
public function showPage() {
return $this->getTotalNums() . $this->getFirstPage() . $this->getPrevBar() . $this->getPrevPage() . $this->pageBar() . $this->getNextPage() . $this->getNextBar() . $this->getLastPage();
}
// private functions ----------------------------------------------------------------
//
private function _set($nums, $per, $preNow, $barNum, $now, $url) {
// 设置总记录数
if($nums > 0) {
$this->_totalNums = $nums;
}
// 设置每页显示记录数
if($per > 0) {
$this->_perPage = $per;
}
// 设置当前页前显示分页个数
if($preNow > 0) {
$this->_preNow = $preNow;
}
// 设置分页条链接个数
if($barNum > 0) {
$this->_barNum = $barNum;
}
// 设置当前页
if(empty($now)) {
// 自动获取
if(isset($_GET[$this->pageName])) {
$this->_nowPage = intval($_GET[$this->pageName]);
}
} else {
// $now 已手动处理
$this->_nowPage = intval($now); //
}
// 设置 url 前缀
if(!empty($url)) {
// $url 已手动处理
$this->_preUrl = $url . (stristr($url, '?') ? '&' : '?') . $this->pageName . '=';
} else {
// 自动获取
if(empty($_SERVER['QUERY_STRING'])) {
// url 中不存在查询
$this->_preUrl = $_SERVER['REQUEST_URI'] . '?' . $this->pageName . '=';
} else {
if(stristr($_SERVER['QUERY_STRING'], $this->pageName . '=')) {
// 查询中有 page=n(2,3...)
$this->_preUrl = str_replace($this->pageName . '=' . $this->_nowPage, '', $_SERVER['REQUEST_URI']);
$lastCharacter = $this->_preUrl[strlen($this->_preUrl) - 1];
if($lastCharacter == '?' || $lastCharacter == '&') {
// page=n(2,3...) 在原 url 的末尾
$this->_preUrl .= $this->pageName . '=';
} else {
// page=n(2,3...) 不在原 url 的末尾
$this->_preUrl .= '&' . $this->pageName . '=';
}
} else {
// 查询中没有 page=n(2,3...)
$this->preUrl = $_SERVER['REQUEST_URI'] . '&' . $this->pageName . '=';
}
}
}
}
// 设置链接地址
private function _setUrl($pageNo) {
return $this->_preUrl . $pageNo;
}
// 设置链接
private function _setLink($url, $link, $style = '') {
$style = 'class="' . $style . '"';
return '<a href="' . $url . '" ' . $style . '>' . $link . '</a>';
}
}
//
使用方法
$total = 1245;
//class Page($nums, $per = '', $preNow = '', $barNum = '', $now = '', $url = '')
$page = new Page($total);
$pager = $page->showPage();
$smarty->assign('pager', $pager);
$smarty->display('index.tpl');