页:
[1]
|
与数据库分离的分页类
[php]
<?
///////////////////////////////////////
// FileName: page.class.php
// Last Update: 2006-06-18
///////////////////////////////////////
/*
** 版 本:1.0
** 数 据 库:postgresql
** 制作日期:2006-06-18
** 程序设计:neway lwter 刘伟韬 ([email]lwter@sina.com[/email])
** 如您使用本程序,请保留以上信息。
*/
?>
<?
/**
* 显示效果
*
* << 1 2 [3] 4 5 ... 100 >>
* 上一页 显示前5页 最后一页 下一页
*
* << 1 ... 96 97 98 [99] 100 >>
* 上一页 第一页 显示后5页 下一页
*
* << 1 ... [5] 6 7 8 9 ... 100 >>
* 上一页 第一页 显示中间5页 最后一页 下一页
*
*
*/
class page {
var $numberPerPage = 30; // 每页显示记录
var $prv = '<'; // 上一条记录样式
var $next = '>'; // 下一条记录样式
var $omit = '<span class="break">...</span>';
var $visitedStar = '<span class="this-page">'; // 当前记录不显示链接开始标记
var $visitedEnd = '</span>'; // 当前记录不显示链接结束标记
var $startpage = 0; // 数据记录开始
var $sbar = ''; // 主要用于显示 1 ... [6][7]8[9][10] ... 100 的样式
var $sBarInfo = ''; // 导航信息显示,如 总有1000条记录,有14页。。。
var $url; // 当前页的URL
var $adjustNumber = 2; // 对当前页码进行正负调整, 例: 当前页码是8 , $adjustNumber = 2, 那么显示 [6][7]8[9][10]
var $prvpage = 1; // 前一页码 当前页码 - $adjustNumber
var $nextpage = 1; // 后一页码 当前页码 + $adjustNumber
var $sE = ''; // 显示1
var $sT = ''; // 显示最后页码
/**
* 初始函数
*
* @param int $totalRecord
* @param int $page
* @return page
*/
function pageBar($totalRecord,$page) {
$pages = ceil($totalRecord/$this->numberPerPage);
$page = ($page > $pages) ? $pages:$page;
$this->prvpage = $page - $this->adjustNumber;
$this->nextpage = $page + $this->adjustNumber;
$this->prvpage = ($this->prvpage <=1) ? 1:$this->prvpage;
$this->nextpage = ($this->nextpage >= $pages) ? $pages:$this->nextpage;
$this->prvpage = ($this->nextpage >= $pages) ? $pages - $this->adjustNumber:$this->prvpage;
$this->prvpage = ($this->prvpage <=1) ? 1:$this->prvpage;
for ($i=$this->prvpage;$i<=$this->nextpage;$i++) {
if ($page > 1) {
$prv = '<a href="'.$this->url.'&page='.($page-1).'" title="第 '.($page-1).' 页"><<</a>';
} else {
$prv = '';
}
if ($page < $pages) {
$end = '<a href="'.$this->url.'&page='.($page+1).'" title="第 '.($page+1).' 页">>></a>';
} else {
$end = '';
}
if ($page - $this->adjustNumber <=1 ) {
$this->sT = '';
$this->sE = $this->omit.'<a href="'.$this->url.'&page='.$pages.'" title="第 '.$pages.' 页">'.$pages.'</a>';
} else if ($page + $this->adjustNumber >= $pages) {
$this->sT = '<a href="'.$this->url.'&page=1" title="第 1 页">1</a>'.$this->omit;
$this->sE = '';
} else {
$this->sT = '<a href="'.$this->url.'&page=1" title="第 1 页">1</a>'.$this->omit;
$this->sE = $this->omit.'<a href="'.$this->url.'&page='.$pages.'" title="第 '.$pages.' 页">'.$pages.'</a>';
}
if ($i == $page) {
$this->sbar .= $this->visitedStar.$i.$this->visitedEnd;
} else {
$this->sbar .= '<a href="'.$this->url.'&page='.$i.'" title="第 '.$i.' 页">'.$i.'</a>';
}
}
$this->startpage = ($page-1)*$this->numberPerPage;
$lastrecord = (($this->startpage + $this->numberPerPage) > $totalRecord) ? $totalRecord:($this->startpage + $this->numberPerPage);
$this->sBarInfo = "共 <strong>$totalRecord</strong> 条记录 每页 <strong>$this->numberPerPage</strong> 条记录 共 <strong>$pages</strong> 页 当前显示 <strong>".($this->startpage + 1)."</strong> - <strong>".$lastrecord."</strong> 条记录<br />";
$this->sbar = $prv.$this->sT.$this->sbar.$this->sE.$end;
}
/**
* 取得导航信息
*
* @return string
*/
function getBarInfo() {
return $this->sBarInfo;
}
/**
* 取得导航栏
*
* @return string
*/
function getPageBar() {
return $this->sbar;
}
/**
* 取得开始记录
*
* @return int
*/
function getStartPage() {
return $this->startpage;
}
}
?>
<?
/** 以下调用 */
require_once('config.php'); // 这里页用 define('PAGENO',10); define('BARLEN',2);
require_once('page.class.php');
require_once('db.class.php'); // 这个页面省略
$totalRecord = 1000 // 从数据库获取
$page = (isset($_GET['page']) && ($_GET['page'] > 1)) ? $_GET['page']:1;
$page = &new page() ;
$page->pageBar($totalRecord,$page)
$page->numberPerPage = PAGENO ;
$page->adjustNumber = BARLEN;
注:数据库
$sql = "SELECT * FROM database LIMIT ".$page->getStartPage() .",".PAGENO; // mysql
$sql = "SELECT * FROM database LIMIT ".PAGENO." OFFSET ".$page->getStartPage() ; // postgresql
$page->getBarInfo() ; // 导航信息栏
$page->getPageBar() ; // 数字栏 [1] ... [5][6]7[8][9] ... 1000
?>
[/php]
[[i] 本帖最后由 lwter 于 2006-7-15 01:59 PM 编辑 [/i]] |
|
支持下原创!
分页类一直以来就是个简单的难道。如同大家使用的程序一样,结构与算法要不断改进。
如果一个简单的分页类可以设计成下面这样:
[php]
$page = new page('page');//初始化传递变量
$page->initializtion(1000,20);//计算分页所要生成变量或字符,1000是记录总条数,20是每页条数
$sql = "SELECT * FROM database LIMIT ".$page->star() .",20";
.....
echo $page->page();//输出分页字符
[/php]
让$_GET['page']之类的,放在分页类内部去操作。可选的一些功能如:
$page->number = 10;//分页链接显示个数[数字],控制如果等于4,就显示4个数字,如:[5][6]7[8][9]
$page->style = 1;//选择样式
其余的操作都让分页类来做,这样,分页用起来就很爽! |
| angeljyt | 2006-7-15 11:20 AM |
|
| 分页类与数据库无关,分页类只充当个控制器来控制数据进行查询。以后可以实现自定义分页样式。 |
|
回复 #2 qh663 的帖子
其实$_GET['page']只是一个事件,他不属于分页类,其实应用那里我可能误导了大家,$page 搞成相同的了不好意思,重新说明一下。
[php]
<?
/** 以下调用 */
require_once('config.php'); // 这里页用 define('PAGENO',10); define('BARLEN',2);
require_once('page.class.php');
require_once('db.class.php'); // 这个页面省略
$totalRecord = 1000 // 从数据库获取
$page = (isset($_GET['page']) && ($_GET['page'] > 1)) ? $_GET['page']:1;
$PG = &new page() ;
$PG->url = 'whatyouwant.php' ; // 这里 写掉了 :(
$PG->pageBar($totalRecord,$page);
$PG->numberPerPage = PAGENO ; // 自定义页数 不加这句的就是用类默认的30
$PG->adjustNumber = BARLEN; // 控制正负长度 不加这句的就是用类默认的2
// 重说下这里的作用 当BARLEN=2时 样式如 [5][6]7[8][9]
// 当BARLEN = 3 时 样式如 [4][5][6]7[8][9][10] ,以此类推..,
注:数据库
$sql = "SELECT * FROM database LIMIT ".$PG->getStartPage() .",".PAGENO; // mysql
$sql = "SELECT * FROM database LIMIT ".PAGENO." OFFSET ".$PG->getStartPage() ; // postgresql
$PG->getBarInfo() ; // 导航信息栏
$PG->getPageBar() ; // 数字栏 [1] ... [5][6]7[8][9] ... 1000
// 定义链接的样式可以通过css 定义做出你想要的效果 , 大家看到的 <span class="this-page"> $page </span> ,
?>
[/php]
字符分页,迟点再完善。 欢迎大家提出更好的想法 :) |
| coolhpy | 2006-7-17 01:23 PM |
|
| 呵呵```最近好像兴起一股发分页类的热潮嘛 |
Powered by Discuz! Archiver 6.1.0
© 2001-2006 Comsenz Inc.
Processed in 0.008483 second(s), 2 queries |