ThinkPHP是一款基於MVC開發模式的PHP框架,既然是開發MVC應用,就少不了分頁的功能。那麼,ThinkPHP如何實現分頁呢?以下就為大家介紹ThinkPHP如何實現分頁。
一、ThinkPHP分頁的基本概念
分頁就是將一個大的資料集合分成N頁,讓使用者只能查看其中的一部分。 ThinkPHP中分頁分為兩種,一是普通分頁,另一種是AJAX分頁。
普通分頁,就是每一頁都需要刷新整個頁面,資料透過PHP程式碼從伺服器端取得出來,再回到客戶端,這種方式的資料互動效率低,但編寫簡單。
AJAX分頁,是透過前端非同步請求數據,透過Ajax技術將資料傳遞到伺服器端,伺服器端從資料庫取得資料後,將資料傳回前端。這種方式資料互動效率高,但是需要使用較為複雜的前端技術。
二、ThinkPHP分頁的使用方法
具體來說,ThinkPHP中的分頁使用,主要包括兩個模組:Model模組和View模組。在Model模組中,我們透過使用ThinkPHP的Query類別或Db類別從資料庫中查詢到資料。在View模組中,我們透過使用ThinkPHP的分頁類Pagination,以及內建的Paginator控件,進行資料展示操作。
在Model模組中,我們首先需要從資料庫中查詢到數據,然後根據分頁的大小來設定資料的查詢偏移量和查詢數量,只傳回所需的一頁資料。具體的操作如下:
<?php namespace Home\Model; use Think\Model; class UserModel extends Model{ public function getPageUsers($page=1,$rows=10){ $result = array(); $count = $this->count(); // 获取总记录数 $offset = ($page-1)*$rows; // 查询的起始位置 $data = $this->limit($offset,$rows)->select(); // 查询当前页的记录 $pagination = new \Think\Paginator($count,$rows); // 实例化分页对象 $result['rows'] = $data; $result['pagination'] = $pagination->show(); // 获取分页显示的HTML代码 return $result; } }
在上述程式碼中,使用了count()方法來取得總記錄數,limit()方法取得目前頁的記錄,以及Pagination類別實例化分頁物件。值得注意的是,limit()方法支援鍊式操作,可以使用where()方法配合,實作更為複雜的查詢操作。
在View模組中,我們需要使用ThinkPHP內建的Paginator控制項來顯示分頁訊息,以及使用ThinkPHP的分頁類Pagination來生成分頁HTML代碼。具體操作如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户信息管理</title> <link rel="stylesheet" type="text/css" href="__PUBLIC__/bootstrap/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="panel panel-default"> <div class="panel-heading">用户信息管理</div> <div class="panel-body"> <table class="table table-striped"> <thead> <tr> <th>ID</th> <th>用户名</th> <th>年龄</th> <th>电话</th> <th>邮箱</th> </tr> </thead> <tbody> <?php foreach($users['rows'] as $user):?> <tr> <td><?php echo $user['id'];?></td> <td><?php echo $user['name'];?></td> <td><?php echo $user['age'];?></td> <td><?php echo $user['phone'];?></td> <td><?php echo $user['email'];?></td> </tr> <?php endforeach;?> </tbody> </table> <nav aria-label="Page navigation"> <?php echo $users['pagination'];?> </nav> </div> </div> </div> </body> </html>
在上面的程式碼中,我們主要使用了Paginator控制項和Pagination類別。在Paginator控制項中,我們可以設定控制項的佈局、樣式等。在Pagination類別中,我們呼叫了show()方法來取得分頁的HTML程式碼,供Paginator控制項使用。同時在foreach循環中,我們將從Model層傳輸過來的$rows數組展示到了表格中。
三、ThinkPHP分頁的常見問題
在Model層的getPageUsers方法中,我們可以設定預設的每頁記錄數,如下:
public function getPageUsers($page=1,$rows=10){ ... }
其中,$rows表示預設每頁記錄數,我們也可以在View層直接傳入參數來改變每頁記錄數。
在View層中,當使用者點選第一頁時,$page參數的值為1,我們需要相應地改變資料的查詢範圍。具體操作如下:
public function getPageUsers($page=1,$rows=10){ $result = array(); $count = $this->count(); // 获取总记录数 $offset = ($page-1)*$rows; // 查询的起始位置 $data = $this->limit($offset,$rows)->select(); // 查询当前页的记录 // 如果是第一页,直接返回第一页的数据 if($page == 1){ $pagination = new \Think\Paginator($count,$rows); $result['rows'] = $data; $result['pagination'] = $pagination->show(); return $result; } // 如果不是第一页,则查询第一页的数据,获取分页HTML代码 $firstPageData = $this->limit(0,$rows)->select(); $pagination = new \Think\Paginator($count,$rows); $result['rows'] = $data; $result['pagination'] = str_replace("1</a>",$firstPageData."</a>",$pagination->show()); return $result; }
在上面的程式碼中,當$page等於1時,我們直接傳回第一頁的資料。當$page大於1時,我們重新查詢第一頁數據,取得分頁HTML程式碼,並將其替換到目前頁的「第一頁」。這樣就可以實現在任一頁點選「第一頁」按鈕,都可以傳回第一頁資料。
對於普通分頁,每次翻頁都需要重新要求整個頁面,這對於大型資料集顯然是低效的,所以我們常常使用AJAX技術來實現無刷新分頁。
使用AJAX分頁需要注意以下幾點:
(1)在View層中,需要加入類似上方的jQuery程式碼,來監聽分頁按鈕:
$(function () { // 加载页面时,注册分页事件 $("#page").on('click','a',function(){ var url = $(this).attr('href'); $("#table").load(url); return false; }); });
在上面的程式碼中,我們在分頁按鈕上新增了一個click事件監聽器,點擊按鈕的時候,發送一個AJAX請求,將資料放回填入對應的位置。
(2)在Model層中,需要在getPageUsers方法中傳回JSON格式的數據,如下:
public function getPageUsers($page=1,$rows=10){ ... $result = array(); $pagination = new \Think\Paginator($count,$rows); $result['rows'] = $data; $result['pagination'] = $pagination->show(); return json_encode($result); }
這裡使用了json_encode()函數來將資料格式化為JSON格式傳回。這樣在View層就可以很方便解析資料。
以上是thinkphp如何實作分頁的詳細內容。更多資訊請關注PHP中文網其他相關文章!