ThinkPHP是一款基於MVC開(kāi)發(fā)模式的PHP框架,既然是開(kāi)發(fā)MVC應(yīng)用,就少不了分頁(yè)的功能。那麼,ThinkPHP如何實(shí)現(xiàn)分頁(yè)呢?以下就為大家介紹ThinkPHP如何實(shí)現(xiàn)分頁(yè)。
一、ThinkPHP分頁(yè)的基本概念
分頁(yè)就是將一個(gè)大的資料集合分成N頁(yè),讓使用者只能查看其中的一部分。 ThinkPHP中分頁(yè)分為兩種,一是普通分頁(yè),另一種是AJAX分頁(yè)。
普通分頁(yè),就是每一頁(yè)都需要刷新整個(gè)頁(yè)面,資料透過(guò)PHP程式碼從伺服器端取得出來(lái),再回到客戶端,這種方式的資料互動(dòng)效率低,但編寫(xiě)簡(jiǎn)單。
AJAX分頁(yè),是透過(guò)前端非同步請(qǐng)求數(shù)據(jù),透過(guò)Ajax技術(shù)將資料傳遞到伺服器端,伺服器端從資料庫(kù)取得資料後,將資料傳回前端。這種方式資料互動(dòng)效率高,但是需要使用較為複雜的前端技術(shù)。
二、ThinkPHP分頁(yè)的使用方法
具體來(lái)說(shuō),ThinkPHP中的分頁(yè)使用,主要包括兩個(gè)模組:Model模組和View模組。在Model模組中,我們透過(guò)使用ThinkPHP的Query類別或Db類別從資料庫(kù)中查詢到資料。在View模組中,我們透過(guò)使用ThinkPHP的分頁(yè)類Pagination,以及內(nèi)建的Paginator控件,進(jìn)行資料展示操作。
- 在Model模組中實(shí)作資料查詢操作
在Model模組中,我們首先需要從資料庫(kù)中查詢到數(shù)據(jù),然後根據(jù)分頁(yè)的大小來(lái)設(shè)定資料的查詢偏移量和查詢數(shù)量,只傳回所需的一頁(yè)資料。具體的操作如下:
<?php namespace Home\Model; use Think\Model; class UserModel extends Model{ public function getPageUsers($page=1,$rows=10){ $result = array(); $count = $this->count();?//?獲取總記錄數(shù) ????????$offset?=?($page-1)*$rows;?//?查詢的起始位置 ????????$data?=?$this->limit($offset,$rows)->select();?//?查詢當(dāng)前頁(yè)的記錄 ????????$pagination?=?new?\Think\Paginator($count,$rows);?//?實(shí)例化分頁(yè)對(duì)象 ????????$result['rows']?=?$data; ????????$result['pagination']?=?$pagination->show();?//?獲取分頁(yè)顯示的HTML代碼 ????????return?$result; ????} }
在上述程式碼中,使用了count()方法來(lái)取得總記錄數(shù),limit()方法取得目前頁(yè)的記錄,以及Pagination類別實(shí)例化分頁(yè)物件。值得注意的是,limit()方法支援鍊式操作,可以使用where()方法配合,實(shí)作更為複雜的查詢操作。
- 在View模組中實(shí)作資料展示操作
在View模組中,我們需要使用ThinkPHP內(nèi)建的Paginator控制項(xiàng)來(lái)顯示分頁(yè)訊息,以及使用ThinkPHP的分頁(yè)類Pagination來(lái)生成分頁(yè)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控制項(xiàng)和Pagination類別。在Paginator控制項(xiàng)中,我們可以設(shè)定控制項(xiàng)的佈局、樣式等。在Pagination類別中,我們呼叫了show()方法來(lái)取得分頁(yè)的HTML程式碼,供Paginator控制項(xiàng)使用。同時(shí)在foreach循環(huán)中,我們將從Model層傳輸過(guò)來(lái)的$rows數(shù)組展示到了表格中。
三、ThinkPHP分頁(yè)的常見(jiàn)問(wèn)題
- 怎麼設(shè)定每頁(yè)顯示的記錄數(shù)?
在Model層的getPageUsers方法中,我們可以設(shè)定預(yù)設(shè)的每頁(yè)記錄數(shù),如下:
public?function?getPageUsers($page=1,$rows=10){ ????... }
其中,$rows表示預(yù)設(shè)每頁(yè)記錄數(shù),我們也可以在View層直接傳入?yún)?shù)來(lái)改變每頁(yè)記錄數(shù)。
- 如何顯示第一頁(yè)?
在View層中,當(dāng)使用者點(diǎn)選第一頁(yè)時(shí),$page參數(shù)的值為1,我們需要相應(yīng)地改變資料的查詢範(fàn)圍。具體操作如下:
public?function?getPageUsers($page=1,$rows=10){ ????$result?=?array(); ????$count?=?$this->count();?//?獲取總記錄數(shù) ????$offset?=?($page-1)*$rows;?//?查詢的起始位置 ????$data?=?$this->limit($offset,$rows)->select();?//?查詢當(dāng)前頁(yè)的記錄 ???? ????//?如果是第一頁(yè),直接返回第一頁(yè)的數(shù)據(jù) ????if($page?==?1){ ????????$pagination?=?new?\Think\Paginator($count,$rows); ????????$result['rows']?=?$data; ????????$result['pagination']?=?$pagination->show(); ????????return?$result; ????} ???? ????//?如果不是第一頁(yè),則查詢第一頁(yè)的數(shù)據(jù),獲取分頁(yè)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; }
在上面的程式碼中,當(dāng)$page等於1時(shí),我們直接傳回第一頁(yè)的資料。當(dāng)$page大於1時(shí),我們重新查詢第一頁(yè)數(shù)據(jù),取得分頁(yè)HTML程式碼,並將其替換到目前頁(yè)的「第一頁(yè)」。這樣就可以實(shí)現(xiàn)在任一頁(yè)點(diǎn)選「第一頁(yè)」按鈕,都可以傳回第一頁(yè)資料。
- 怎麼樣使用AJAX分頁(yè)?
對(duì)於普通分頁(yè),每次翻頁(yè)都需要重新要求整個(gè)頁(yè)面,這對(duì)於大型資料集顯然是低效的,所以我們常常使用AJAX技術(shù)來(lái)實(shí)現(xiàn)無(wú)刷新分頁(yè)。
使用AJAX分頁(yè)需要注意以下幾點(diǎn):
(1)在View層中,需要加入類似上方的jQuery程式碼,來(lái)監(jiān)聽(tīng)分頁(yè)按鈕:
$(function?()?{?//?加載頁(yè)面時(shí),注冊(cè)分頁(yè)事件 ????$("#page").on('click','a',function(){ ????????var?url?=?$(this).attr('href'); ????????$("#table").load(url); ????????return?false; ????}); });
在上面的程式碼中,我們?cè)诜猪?yè)按鈕上新增了一個(gè)click事件監(jiān)聽(tīng)器,點(diǎn)擊按鈕的時(shí)候,發(fā)送一個(gè)AJAX請(qǐng)求,將資料放回填入對(duì)應(yīng)的位置。
(2)在Model層中,需要在getPageUsers方法中傳回JSON格式的數(shù)據(jù),如下:
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()函數(shù)來(lái)將資料格式化為JSON格式傳回。這樣在View層就可以很方便解析資料。
以上是thinkphp如何實(shí)作分頁(yè)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)