:::
5-3-3 加入分頁
一、安裝分頁物件
- 分頁功能不算難,但有點複雜,因此,建議直接用現成物件來實做即可
- 官網:https://github.com/yidas/php-pagination
- 安裝 php-pagination 物件按 Ctrl+` 開啟終端機,並貼上以下指令執行之 : :
composer require yidas/pagination
二、使用分頁物件
- 修改
index.php,先use該物件,use的目的只是可以用比較簡短的方式來呼叫物件。<?php use yidas\data\Pagination; - 一般來說要用分頁,得知道幾個數據:
$totalCount:資料總筆數,需要自己寫程式去計算(此物件需要totalCount參數,名稱不能改)$perPage:每頁要呈現幾筆,可直接在config.php加個設定(此物件需要perPage參數,名稱不能改)$page:現在在那一頁?此值應該會從網址傳進來,預設應為 1(此物件會自己抓設定,無須我們自行處理)
三、設定每頁要呈現幾筆
- 我們先修改
config.php,多一個「每頁顯示文章數」的設定,方便日後調整,暫時預設為 3 筆// 每頁顯示文章數 $perPage = 3;
四、取得總筆數並產生分頁物件以取得資料
- 修改
index.php,在讀出文章之前,先來處理分頁的部份。首先要抓出文章總數$total,分頁工具才能用它來計算出頁數<?php use yidas\data\Pagination; require_once 'header.php'; // 計算總資料數 try { $stmt = $pdo->prepare('SELECT count(*) FROM `news`'); $stmt->execute(); list($totalCount) = $stmt->fetch(PDO::FETCH_NUM); } catch (PDOException $e) { die("計算總資料數失敗:" . $e->getMessage()); } - 接著利用總筆數,來產生分頁物件
// 產生分頁物件 $pagination = new Pagination(['totalCount' => $totalCount, 'perPage' => $perPage]); - 利用分頁物件取得起始資料數
$pagination->offset及抓取筆數$pagination->limit,便可利用資料庫的LIMIT來取得此範圍內的所有文章try { // 準備SQL語句 $sql = "SELECT * FROM `news` ORDER BY `date` DESC LIMIT ?, ?"; // 預備語句 $stmt = $pdo->prepare($sql); // 綁定參數並執行語句 $stmt->execute([$pagination->offset, $pagination->limit]); $all_news = []; $news = $stmt->fetchAll(); foreach ($news as $row) { $media = $row['media']; unset($row['media']); $row = array_map('htmlspecialchars', $row); $row['files'] = json_decode($media, true); $all_news[] = $row; } $smarty->assign('all_news', $all_news); } catch (PDOException $e) { echo "資料庫連接錯誤:" . $e->getMessage(); }
五、產生分頁工具列
- 分頁工具列需由
yidas\widgets\Pagination的物件來產生。 - 我們只接用該物件的靜態方法
::widget()將分頁物件丟進去即可產生// 計算總資料數 try { $stmt = $pdo->prepare('SELECT count(*) FROM `news`'); $stmt->execute(); list($totalCount) = $stmt->fetch(PDO::FETCH_NUM); // 產生分頁物件 $pagination = new Pagination(['totalCount' => $totalCount, 'perPage' => $perPage]); // 產生分頁工具列 $paginator = yidas\widgets\Pagination::widget(['pagination' => $pagination]); $smarty->assign('paginator', $paginator); } catch (PDOException $e) { die("計算總資料數失敗:" . $e->getMessage()); }最後記得將之送至樣板
- 修改
index_content.tpl,在最下方加入分頁工具列:{foreach $all_news as $news} <div class="row"> <div class="col-md-9"> <h3><a href="index.php?op=show&id={$news.id}">{$news.title}</a></h3> <p>{$news.author}</p> <p>{$news.date} 點閱數:{$news.views}</p> <p>{$news.content|truncate:180:"..."}</p> </div> <div class="col-md-3"> {if is_file(reset($news.files))} <img src="{reset($news.files)}" alt="" class="img-thumbnail" style="object-fit: cover; width: 100%; height: 200px;"> {else} <img src="https://picsum.photos/seed/picsum/400/400" alt="" class="img-thumbnail" style="object-fit: cover; width: 100%; height: 200px;"> {/if} </div> </div> {/foreach} {$paginator} - 最後看起來像這樣(慘不忍睹,但有出現了):

5-3-2 讓樣板檔接收二維陣列