PHP中模板分页的处理

PHP普通开发中php代码和html代码夹杂的情况中处理分页是比较简单的,也可以构建成函数的形式。最近开发中使用 Pear::DB + Smarty 的结构,于是考虑如果对模板进行分页,因为不能直接操作页面,所以就考虑生成分页字符串的形式。

因为是三层结构,类库-->PHP调用-->模板的形式,所有的数据处理是在类库里的,那么分页控制就在PHP调用中进行的,模板就复杂解析调用的结果。先直接看我们PHP调用中的分页代码:

--------------------------------------------------------------------------------

 1   
 2/**   
 3* 文件:Type.php   
 4* 功能:显示类别下的书籍   
 5* 作者:heiyeluren   
 6**/ 
 7
 8//包含公共文件,包括类库等   
 9require_once("include.php"); 
10
11//实例化操作对象   
12$Type = new CTypes(); 
13
14//每页记录数   
15define("PAGE_SIZE", 10); 
16
17//获取GET提交的变量   
18$TypeID = $tid ? $tid : intval($_REQUEST['tid']); 
19
20//书籍总数   
21$BookTotal = $Type->getBookTotal($TypeID); 
22
23/* 分页显示核心 */   
24//获取总页数   
25$pageCount = ($BookTotal/PAGE_SIZE);   
26//当前页数   
27if (isset($_GET[page]) && !empty($_GET[page])) {   
28$page = intval($_GET[page]);   
29} else {   
30$page = 1;   
31}   
32if ($page==1) {   
33$startNum = 0;   
34} else {   
35$startNum = ($page-1) * PAGE_SIZE;   
36}   
37//生成分页链接字符串   
38if ($page==1 && $pageCount>1) {   
39$pageStr = "上一页 |

<a href='/Type.php?tid=".$TypeID."&amp;page=".($page+1)."'>下一页</a>

1";   
2} elseif ($page==$pageCount && $pageCount>1) {   
3$pageStr = "

<a href='/Type.php?tid=".$TypeID."&amp;page=".($page-1)."'>上一页</a>

1| 下一页";   
2} elseif ($page>1 && $page<=$pageCount) {   
3$pageStr = "

<a href='/Type.php?tid=".$TypeID."&amp;page=".($page-1)."'>上一页</a>

1|

<a href='/Type.php?tid=".$TypeID."&amp;page=".($page+1)."'>下一页</a>

 1";   
 2} else {   
 3$pageStr = "上一页 | 下一页";   
 4} 
 5
 6//按照页数获取当前记录   
 7$allBook = $Type->getBookFromType($TypeID, $start=$startNum, $offset=PAGE_SIZE); 
 8
 9//Smarty变量赋值   
10$tpl->assign('BookTotal', $BookTotal);   
11$tpl->assign('allBook', $allBook);   
12$tpl->assign('pageStr', $pageStr); 
13
14$tpl->display('Type.html'); 
15
16unset($Type); 

--------------------------------------------------------------------------------

为了更清晰的认识,下面简单的描述一下类库中的基本内容:(代码不完整)

--------------------------------------------------------------------------------

 1   
 2/**   
 3* 文件:Type.class.php   
 4* 功能:Type处理类   
 5* www.knowsky.com   
 6* 作者:heiyeluren   
 7**/ 
 8
 9class Type   
10{   
11var $mDsn;   
12var $mTableName;   
13var $hPearDB; 
14
15//构造函数   
16function Type()   
17{   
18//...   
19}   
20  
21//获得pear DB类的句柄方法   
22function _getDBClass($fetchMode = DB_FETCHMODE_ASSOC)   
23{   
24if(!is_object($this->hPearDB)){   
25$this->hPearDB = DB::connect($this->mDsn);   
26$this->hPearDB->query("set names 'utf8'");   
27$this->hPearDB->setFetchMode($fetchMode);   
28if(DB::IsError($this->hPearDB)){   
29return false;   
30}   
31}   
32return $this->hPearDB;   
33} 
34
35//获取书籍总数   
36function getBookTotal($TypeId)   
37{   
38$db = $this->_getDBClass();   
39$sql = "SELECT COUNT(*) AS total FROM ...";   
40$rs = $db->getOne($sql);   
41if (DB::isError($rs))   
42return $rs->getMessage();   
43else   
44return $rs;   
45} 
46
47//获取所有书籍   
48function getBookFromType($TypeId, $start, $offset)   
49{   
50$db = $this->_getDBClass();   
51$sql = "SELECT * FROM ... LIMIT $start,$offset";   
52$rs = $db->getAll($sql);   
53if (DB::isError($rs))   
54return $rs->getMessage();   
55else   
56return $rs;   
57} 
58
59}   

--------------------------------------------------------------------------------

最后再让我们看一下这个Type.html模板是如何处理的:

--------------------------------------------------------------------------------
{* 插入头部文件 *}
{include file="Cendar/head.html"}

1<div id="side">
2<ul>
3<li>书籍总数:{$BookTotal}</li>
4</ul>
5</div>
 1<div id="Book">
 2<h2 class="cata">书籍具体内容</h2>
 3<ul>   
 4{section name=Book loop=$allBook}   
 5<li><a href="show_Book.php?tid={$allBook[Book].id}">{$allBook[Book].title}</a></li>   
 6{sectionelse}   
 7<li class="warning">目前没有书籍</li>   
 8{/section}   
 9</ul>
10</div>

{* 分页字符串显示 *}

1<div align="right">   
2{"GBK"|iconv:"utf-8":$pageStr}   
3</div>

{* 插入底部文件 *}
{include file="Cendar/foot.html"}
--------------------------------------------------------------------------------

那么我们抓住重点就知道,我们从PHP程序里能够控制$pagStr就是我们的分页字符串,最后它将替换到模板文件里来达到效果。

基本到这里就明白了如何再模板里进行分页处理了,当然,你也可以把分页功能写成函数,或者封装成一个类,那么就方便四处调用了。呵呵~~~

(未经授权,请勿转载以上代码)

Author:heiyeluren
Date:2005-8-2

Published At
Categories with Web编程
Tagged with
comments powered by Disqus