:::

5-3-3 加入分頁

一、安裝分頁物件

  1. 分頁功能不算難,但有點複雜,因此,建議直接用現成物件來實做即可
  2. 官網:https://github.com/yidas/php-pagination
  3. 安裝 php-pagination 物件按 Ctrl+` 開啟終端機,並貼上以下指令執行之 : :
    composer require yidas/pagination

     

二、使用分頁物件

  1. 修改 index.php,先 use 該物件,use 的目的只是可以用比較簡短的方式來呼叫物件。
    <?php
    use yidas\data\Pagination;

     

  2. 一般來說要用分頁,得知道幾個數據:
    1. $totalCount:資料總筆數,需要自己寫程式去計算(此物件需要 totalCount 參數,名稱不能改)
    2. $perPage:每頁要呈現幾筆,可直接在 config.php 加個設定(此物件需要 perPage 參數,名稱不能改)
    3. $page:現在在那一頁?此值應該會從網址傳進來,預設應為 1(此物件會自己抓設定,無須我們自行處理)

三、設定每頁要呈現幾筆

  1. 我們先修改 config.php,多一個「每頁顯示文章數」的設定,方便日後調整,暫時預設為 3 筆
    // 每頁顯示文章數
    $perPage = 3;
    

     

四、取得總筆數並產生分頁物件以取得資料

  1. 修改 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());
    }

     

  2. 接著利用總筆數,來產生分頁物件
    // 產生分頁物件
    $pagination = new Pagination(['totalCount' => $totalCount, 'perPage' => $perPage]);

     

  3. 利用分頁物件取得起始資料數 $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();
    }

     

五、產生分頁工具列

  1. 分頁工具列需由 yidas\widgets\Pagination 的物件來產生。
  2. 我們只接用該物件的靜態方法 ::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());
    }

    最後記得將之送至樣板

  3. 修改 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}

     

  4. 最後看起來像這樣(慘不忍睹,但有出現了):

 


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbsn%3D52%26tbdsn%3D1837

計數器

今天: 2311231123112311
昨天: 4745474547454745
總計: 7712272771227277122727712272771227277122727712272