本文中,Hick 先介紹一下 PEAR 的 Pager 包。然后談?wù)劮猪摰乃悸罚俳Y(jié)合實際運用,最后對它的部分方法和屬性作一下介紹。
順便提一下, Smarty 也有分頁插件,比如 Smarty Pager ,不過 Hick 看了一下,初步感覺在把問題搞復(fù)雜化。
[聲明] 轉(zhuǎn)載請保留原文信息:
作者: hick<hick@163.com>出處: http://www.hickwu.com/doc/pearPager.htm
如果已經(jīng)安裝好 PEAR 環(huán)境,常規(guī)的安裝 PEAR 包的方法就可以安裝最新版本:
之所以單獨說一下安裝,其實是想說 Pager 包可以單獨使用,直接到官方下載到壓縮包,解壓縮到某目錄, 并把目錄名修改為 Pager, 最后把其父目錄添加到 inlcude_path 中即可。
注意:由于 linux 等環(huán)境下區(qū)分大小寫,不要修改目錄以及文件名等。
通常以靜態(tài)方法 factory 創(chuàng)建 Pager 類的實例。創(chuàng)建實例時,需要以數(shù)組的形式傳遞參數(shù),每個數(shù)組的元素是一個參數(shù)。默認情況下必須有一個參數(shù): itemData 或者 totalItems,參見下面的實例::
require_once("Pager/Pager.php");// 參數(shù)數(shù)組$params = array(// 分頁模式,有兩種顯示模式,Jumping 和 Sliding‘mode‘ => ‘Jumping‘,// 每頁記錄數(shù)‘perPage‘ => 3,// Jumping 模式下為可選頁數(shù),Sliding 模式下為當(dāng)前頁前后可選頁數(shù)‘delta‘ => 5,‘itemData‘ => array(‘record01‘,‘record02‘,‘record03‘,‘record04‘,‘record05‘,‘record06‘,‘record07‘,‘record08‘,‘record09‘,‘record10‘,‘record11‘,‘record12‘,‘record13‘,‘record14‘,‘record15‘,‘record15‘,‘record15‘,‘record16‘));// 創(chuàng)建 Pager 對象$pager = Pager::factory($params);// 獲得當(dāng)前頁(默認為第一頁)的各種相關(guān)頁鏈接: 前一頁;后一頁;所有頁等等$links = $pager->getLinks();echo $links[‘a(chǎn)ll‘];
其中 itemData 元素是要分頁的數(shù)據(jù),通常它也是一個多元數(shù)組。其他參數(shù)請參考 官方參考文檔
通過上面的 簡單實例 的學(xué)習(xí),會有這么一個想法:使用 PEAR Pager 來對一個新聞列表分頁,可以把所有新聞的基本信息保存成一個二維數(shù)組作為 itemData ,其實還可以把新聞總數(shù)作為 totalItems 傳遞??紤]到當(dāng)前頁一般只需要顯示若干條新聞,而不是全部,所以能夠只查詢出當(dāng)前頁需要顯示的若干條當(dāng)然更高效率。
這里順便說一下兩種分頁的思路,一種是從數(shù)據(jù)庫查詢出所有記錄,然后選擇當(dāng)前需要顯示的若干記錄;另外一種就是先算出當(dāng)前頁需要顯示的記錄范圍,結(jié)合 mysql 的 limit 或者其他數(shù)據(jù)庫的類似語法,查詢出當(dāng)前需要顯示的若干記錄??瓷先ズ笳弑容^快,但是從數(shù)據(jù)庫查詢的角度來說,實現(xiàn)后一種方法往往需要進行兩次查詢數(shù)據(jù)庫,第一次查詢總的記錄數(shù),第二次查詢需要的若干條記錄。第一種查詢方法在處理記錄數(shù)多時,會比較耗資源。一般來說,考慮到數(shù)據(jù)量的增加,用第二種方法會比較好。對查詢兩次數(shù)據(jù)庫的劣勢,可以通過在 URL 傳遞記錄總數(shù)進行一定程度上的彌補(數(shù)據(jù)庫記錄變動快時不太好)。
下面介紹一下應(yīng)用 PEAR Pager 于使用了 Smarty (其實跟 Smarty 也沒什么關(guān)系,嘿嘿)的系統(tǒng)中的方法:
下面的使用比較原始,還可以進一步對 Pager 進行封裝::
// 獲得總的新聞數(shù)$totalItems = $_GET[‘totalItems‘];// 每頁顯示的新聞數(shù)$pageSize = 10;// 當(dāng)前頁編號$pageID = empty($_GET[‘pageID‘]) ? 1 : $_GET[‘pageID‘];// limit 子句$limit = ($pageID - 1) * $pageSize . ", $pageSize";// 獲得新聞列表$newsList = $news->get_list(‘latest‘, $limit, $totalItems);// 再對$_GET[‘totalItems‘]賦值,也是Pager自定義URL GET參數(shù)的方法$_GET[‘totalItems‘] = $totalItems;// 創(chuàng)建 Pager 對象$params = array(‘mode‘ => ‘Sliding‘,‘perPage‘ => $pageSize,‘delta‘ => 2,‘totalItems‘ => $totalItems,);$pager = Pager::factory($params);// 獲得當(dāng)前頁(默認為第一頁)的各種相關(guān)頁鏈接$links = $pager->getLinks();// 模板賦值$tpl->assign("pager", $links);
注意:以上代碼修改自 Hick 在項目中實際應(yīng)用的代碼,跟 Hick 在實際運用中有些不同。
這里說的參數(shù)主要是 Pager::factory 的參數(shù),該函數(shù)的參數(shù)至少是 itemData 和 totalItem 中的一個。append 參數(shù)( 默認為 true)為 false 時,還需要指定 fileName 參數(shù)。
我喜歡總結(jié)自己的學(xué)習(xí)并整理成文檔. 開始也只是想把自己學(xué)習(xí) PEAR Pager 的經(jīng)驗總結(jié)一下, 留作以后備用. 弄完了, 感覺應(yīng)該分享出來. 既然要弄出來給別人看, 讀者就不一樣了, 需要考慮的就多了, 要分享出個東西來也不容易啊, 嘿嘿. 差不多是第一次比較正式的寫這樣的東西, 感覺有點點麻煩, 以后要少考慮一點.