分頁的思路以及在ZF中的使用

分頁思路:
隻需要得到兩個變量就成功瞭一半:
1. 每頁要顯示的記錄數$pageSize
2. 表中總的數據量 $rowCount
有瞭以上兩個變量,我們就可以得出 共有幾頁瞭$pageCount
然後通過for循環,比如總共有13個頁面,那麼很容易就能通過for循環輸出頁數
$nav='';//用來保存頁數的一個變量
for ($i=1;$i<=13;$i++)
{
  $nav.="<a href='index.php?page=".$i."'>第".$i."頁</a> ";
}
以上的for循環將輸出如
第1頁,第2頁,第3頁,第4頁,第5頁,第6頁,第7頁,第8頁,第9頁,第10頁,第11頁,第12頁,第13頁
如果我們隻想每次隻顯示十個頁面呢?比如1-10頁,11-20頁
很簡單,隻要稍微修改下for循環即可實現
$step= floor(($pageNow-1)/10)*10+1;
for ($i=$step;$i<=$step+10;$i++)
{
  $nav.="<a href='index.php?page=".$i."'>第".$i."頁</a> ";
}
比如,當前頁面$pageNow如何在1~10之間的話,那麼$step=0
當前頁面$pageNow如何在11~20之間的話,那麼$step=10
當前頁面$pageNow如何在21~30之間的話,那麼$step=20
參考具體的實現過程的代碼,我們不難發現,for循環的第二個條件隻需要加上10就可以實現每次隻顯示10也的情況瞭,我們將這一步分裝在fenyePage類中的getLink()方法中
話又說回來,如何才能得到$pageSize和$rowCount兩個變量的值呢?
$pageSize可以又程式員自己指定,$rowCount可以借助一個簡單的執行sql語句的函數就能得到
 
 
 1 <?php
 2 /**
 3  * $sql語句:①獲取數據②獲取總記錄數
 4  */
 5 class fenyePage{
 6     public $pageSize=5;//每頁顯示的數量–>程式員指定的
 7     public $rowCount;//這是從伺服器中獲取的(形如SELECT COUNT(id) FROM TABLE)用來保存總共有多少條記錄
 8     public $pageNow;//通過$_GET['page']獲取的,用來保存當前所在的頁碼
 9     public $pageCount;//計算得到的,用來保存總共有多少頁
10     public $res_arr;//用來保存要顯示到頁面的數據(比如保存SELECT * FROM TABLE LIMIT 0,10 檢索的數據)
11     public $nav;//顯示第幾頁第幾頁的導航條
12    
13     /**
14      * 取得當前頁面的超鏈接
15      *
16      * @author 小飛 2012/5/30
17      */
18     public function getLink()
19     {
20         $this->nav='';
21         $this->pageCount=ceil(($this->rowCount/$this->pageSize));
22         $step= floor(($this->pageNow-1)/10)*10+1;
23         if ($this->pageNow>10)
24         {
25             $this->nav.="   <a href='index.php?page=".($step-1)."'> << </a>  ";//整體每10頁向前翻
26         }
27         if ($this->pageNow!=1)
28         {
29             $this->nav.="<a href='index.php?page=".($this->pageNow-1)."'>  上一頁</a>  ";
30         }
31         if ($this->pageNow!=1)
32         {
33             $this->nav.="<a href='index.php?page=1'>首頁</a>   ";
34         }
35         for ($start=$step;$start<$step+10 && $start<=$this->pageCount;$start++)
36         {
37             $this->nav.="<a href='index.php?page=".$start."'>".$start."</a>  ";
38         }
39         if ($this->pageNow!=$this->pageCount)
40         {
41             $this->nav.="<a href='index.php?page=".$this->pageCount."'>末頁</a>   ";
42         }
43         if ($this->pageNow!=$this->pageCount)
44         {
45             $this->nav.="   <a href='index.php?page=".($this->pageNow+1)."'>下一頁</a>";
46         }
47         if ($this->pageCount>10 && $this->pageNow<$this->pageCount-8){
48             $this->nav.="   <a href='index.php?page=".($step+10)."'> >> </a>";//整體每10頁向後翻
49         }
50         $this->nav.="/共有".$this->pageCount."頁";
51     }
52 }
53 ?>
 
由於zf中操作伺服器的任務由model層來完成,所以,我將獲取$rowCount的值的函數放在瞭對應的表model中
比如:我是操作order表的
那麼當我要顯示所有訂單信息的時候,我通過order類中的showorder()方法取得$rowCount的值,並將其付給分頁類中的$rowCount屬性
同樣,將要顯示在頁面上的數據信息也一並付給瞭分頁類中的$res_arr屬性
這樣,我們就可以很容易的通過實例化一個分頁類(fenyePage),然後將其通過參數傳給showorder()函數,由該函數完成以下動作:
①要顯示在頁面上的信息
②表中總共有多少條記錄
 
 1 /**
 2      * 根據指定的用戶id,查詢該用戶的歷史訂餐記錄
 3      *
 4      * @author 小飛 2012/5/30
 5      * @param $id 用戶id
 6      * @param $fenye 實例化的一個對象,用來處理分頁
 7      * @todo $sql1語句 "select * from table where * limit 0,10" 該sql語句主要用來檢索伺服器中的數據,用以顯示在view層
 8      * @todo $sql2語句 "select count(id) from table" 該sql語句用來得出總的數據量
 9      */
10     public function showorder($id=null,$fenye=null)
11     {
12         $db = $this->getAdapter();
13        
14         $select=$db->select();
15         $select->from(array('o' => 'order'),array('o.id','o.user_id','o.user_name','o.food_name','o.food_price','o.order_time','o.order_state'));
16         if ($id!=null){
17             $select->where('o.user_id=?',$id);   
18         }
19         $select->join(array('d'=>'department'),'o.dep_id = d.id','d.dep_name');
20         if($fenye!=null){
21             $select->limit($fenye->pageSize,($fenye->pageNow-1)*$fenye->pageSize);
22         }
23         $sql1=$select->__toString();
24         //該sql語句主要用來計算總的數據量
25         $sql2="SELECT COUNT(id) FROM `order`";
26         $fenye->res_arr=$db->fetchAll($sql1);//將要顯示的數據存儲到分頁類的$res_arr屬性當中,方便調用
27         $rowCount=$db->fetchAll($sql2);//將表中的總數據量保存到分頁類的rowCount屬性當中
28         $fenye->rowCount=$rowCount[0]['COUNT(id)'];
29         $fenye->getLink();
30         return $fenye->res_arr;
31     }
 
至此,分頁類的功能就已經實現瞭

 

摘自 WEB開發_小飛

You May Also Like