我們已經(jīng)了解了如何進(jìn)行數(shù)據(jù)查詢,今天我們來學(xué)習(xí)下如何對(duì)數(shù)據(jù)進(jìn)行分頁以及顯示。
獲取分頁類
ThinkPHP提供了數(shù)據(jù)分頁的擴(kuò)展類庫Page,可以在http://www.thinkphp.cn/extend/241.html下載,或者下載官方的完整擴(kuò)展包(http://www.thinkphp.cn/down/253.html)里面也已經(jīng)包含分頁擴(kuò)展類了。把解壓后的Page.class.php放入ThinkPHP/Extend/Library/ORG/Util/(如果沒有請(qǐng)手動(dòng)創(chuàng)建)目錄下面。
當(dāng)然,擴(kuò)展類庫的位置其實(shí)比較隨意,你也可以放入項(xiàng)目的類庫目錄下面,區(qū)別只是在于你導(dǎo)入路徑的不同而已。分頁查詢
分頁類需要和查詢相結(jié)合,我們可以使用ThinkPHP自帶的limit方法或者page方法,目的就是為了獲取當(dāng)前分頁的數(shù)據(jù)(也有先獲取完整數(shù)據(jù)然后前端分頁顯示的方法,不在本文描述內(nèi)容中,也不建議)。使用limit方法或者page方法是和數(shù)據(jù)庫類型無關(guān)的。
我們首先在數(shù)據(jù)庫里面創(chuàng)建一個(gè)think_data數(shù)據(jù)表用于測(cè)試:
CREATE TABLE IF NOT EXISTS `think_data` (
`id` smallint(4) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`content` varchar(255) NOT NULL,
`create_time` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
要使用分頁查詢,一般來說需要進(jìn)行兩次查詢,即第一次查詢得到滿足條件的總數(shù)據(jù)量,然后第二次查詢當(dāng)前分頁的數(shù)據(jù),這樣做的作用是告訴分頁類當(dāng)前的數(shù)據(jù)總數(shù),以便計(jì)算生成的總頁數(shù)(如果你的顯示只是需要上下翻頁的話,其實(shí)總數(shù)查詢可以省略或者進(jìn)行緩存)。
一個(gè)標(biāo)準(zhǔn)的分頁使用示例如下:
$Data = M('Data'); // 實(shí)例化Data數(shù)據(jù)對(duì)象
import('ORG.Util.Page');// 導(dǎo)入分頁類
$count = $Data->where($map)->count();// 查詢滿足要求的總記錄數(shù) $map表示查詢條件
$Page = new Page($count);// 實(shí)例化分頁類 傳入總記錄數(shù)
$show = $Page->show();// 分頁顯示輸出
// 進(jìn)行分頁數(shù)據(jù)查詢
$list = $Data->where($map)->order('create_time')->limit($Page->firstRow.','.$Page->listRows)->select();
$this->assign('list',$list);// 賦值數(shù)據(jù)集
$this->assign('page',$show);// 賦值分頁輸出
$this->display(); // 輸出模板
如果沒有任何數(shù)據(jù)的話,分頁顯示為空白。所以在進(jìn)行測(cè)試之前,請(qǐng)確保你的數(shù)據(jù)表里面有一定的數(shù)據(jù),否則可能看不到分頁的效果。如果使用page方法查詢的話,則可以改成:
$Data = M('Data'); // 實(shí)例化Data數(shù)據(jù)對(duì)象
import('ORG.Util.Page');// 導(dǎo)入分頁類
$count = $Data->where($map)->count();// 查詢滿足要求的總記錄數(shù)
$Page = new Page($count);// 實(shí)例化分頁類 傳入總記錄數(shù)
// 進(jìn)行分頁數(shù)據(jù)查詢 注意page方法的參數(shù)的前面部分是當(dāng)前的頁數(shù)使用 $_GET[p]獲取
$nowPage = isset($_GET['p'])?$_GET['p']:1;
$list = $Data->where($map)->order('create_time')->page($nowPage.','.$Page->listRows)->select();
$show = $Page->show();// 分頁顯示輸出
$this->assign('page',$show);// 賦值分頁輸出
$this->assign('list',$list);// 賦值數(shù)據(jù)集
$this->display(); // 輸出模板
然后,我們?cè)谀0逯刑砑臃猪撦敵鲎兞考纯桑?div id="ezpw09d6" class="w_dama2"><table cellpadding=3 cellspacing=5>
<volist name="list" id="vo">
<tr>
<td >[ {$vo.create_time|date='Y-m-d H:i:s',###} ] {$vo.title} </td>
</tr>
</volist>
<tr>
</tr>
</table>
<div class="result page">{$page}</div>
可以看到分頁輸出只需要采用{$page}變量在模板中輸出即可。
分頁設(shè)置
設(shè)置分頁變量
默認(rèn)情況下,分頁傳值的變量是p,生成的分頁跳轉(zhuǎn)地址可能類似于:
http://serverName/index.php/Data/index/p/1
http://serverName/index.php/Data/index/p/2
我們可以配置VAR_PAGE配置參數(shù)來改變:
'VAR_PAGE'=>'page'
則分頁地址變成:
http://serverName/index.php/Data/index/page/1
http://serverName/index.php/Data/index/page/1
設(shè)置每頁記錄數(shù)
默認(rèn)的情況下,分頁顯示每頁會(huì)顯示20條數(shù)據(jù),如果你希望改變每頁顯示的數(shù)據(jù)量的話,實(shí)例化分頁類的時(shí)候可以傳人第二個(gè)參數(shù)即可:
$Page = new Page($count,5);// 實(shí)例化分頁類 傳入總記錄數(shù)并且每頁顯示5條記錄
由于查詢方法中我們使用了$Page->listRows屬性,所以無需更改,但如果你是直接在查詢方法中使用數(shù)字請(qǐng)記得一起更改。
下面是官方的分頁示例的顯示效果:

傳入分頁條件
默認(rèn)情況下,分頁類會(huì)自動(dòng)獲取當(dāng)前頁面的POST(優(yōu)先)或者GET變量作為分頁跳轉(zhuǎn)的傳值,如果需要指定傳入當(dāng)前分頁跳轉(zhuǎn)的參數(shù),就可以通過設(shè)置parameter屬性,parameter屬性支持2種方式傳值:字符串和數(shù)組。字符串采用var1=val1&var2=val2...的格式,例如:
foreach($map as $key=>$val) {
$Page->parameter .= "$key=".urlencode($val).'&';
}
或者直接傳入數(shù)組:
$Page->parameter = array_map('urlencode',$map);
由于內(nèi)部調(diào)用了U函數(shù),分頁類最終生成的分頁跳轉(zhuǎn)鏈接會(huì)根據(jù)當(dāng)前的URL設(shè)置自動(dòng)生成和當(dāng)前URL模式一致的地址,所以無需擔(dān)心分頁鏈接的參數(shù)影響URL地址。
分頁路由支持
如果你的分頁跳轉(zhuǎn)鏈接地址采用了路由,那么可以通過設(shè)置url參數(shù),例如,假設(shè)我們的分頁URL地址格式是:
http://serverName/data/index/1
http://serverName/data/index/2
http://serverName/data/index/3
這樣的URL路由地址,那么我們就可以設(shè)置
$Page->url = 'data/index';
設(shè)置后,分頁類的鏈接地址會(huì)自動(dòng)生成上面的URL格式地址。
注意,url參數(shù)和parameter 同時(shí)使用的話,后者無效。設(shè)置顯示的頁數(shù)
可以在實(shí)例化分頁類之后,進(jìn)行相關(guān)屬性的設(shè)置。默認(rèn)情況下,頁面顯示的頁數(shù)是5,我們可以修改:
$Page->rollPage = 3;
這樣,頁面上只能同時(shí)看到3個(gè)分頁
分頁顯示定制
上面講的是分頁的參數(shù)設(shè)置,下面講下如何對(duì)分頁顯示效果(包括樣式)進(jìn)行設(shè)置。默認(rèn)的分頁效果可能不能滿足所有的要求,分頁類提供了一個(gè)setConfig方法來修改默認(rèn)的一些設(shè)置。例如:
$page->setConfig('header','個(gè)會(huì)員');
setConfig方法支持的屬性包括:
header | 頭部描述信息,默認(rèn)值 “條記錄” |
prev | 上一頁描述信息,默認(rèn)值是“上一頁” |
next | 下一頁描述信息,默認(rèn)值是“下一頁” |
first | 第一頁描述信息,默認(rèn)值是“第一頁” |
last | 最后一頁描述信息,默認(rèn)值是“最后一頁” |
theme | 分頁主題描述信息,包括了上面所有元素的組合 ,設(shè)置該屬性可以改變分頁的各個(gè)單元的顯示位置,默認(rèn)值是 "%totalRow% %header% %nowPage%/%totalPage% 頁 %upPage% %downPage% %first% %prePage% %linkPage% %nextPage% %end%" |
通過setConfig設(shè)置以上屬性可以完美的定制出你的分頁顯示風(fēng)格。