:::

6-7 讓側邊欄的年度文章數有作用

一、資料庫的計數方法

  1. 首先,年度應該是從文章的日期去計算出來的
  2. 要從資料庫計算數量,最常用的方法就是 count() 搭配 group by 語法,例如:
    select count(*), `計數欄位` from `資料表` group by `欲計數欄位`

     

  3. 由於只要判斷年度,所以還會搭配 left() 的用法,也就是只擷取左邊 4 個數字(年度部份)
    select count(*), left(`日期欄位`, 4) from `資料表` group by left(`日期欄位`, 4)

     

二、抓出文章所有年度

  1. 由於側邊欄前後臺都會有,所以,我們可以直接修改前後台都會引入的 header.php
  2. 我們先寫一個 article_count() 函式,利用 count() 搭配 group by 語法將「文章計數」及「年度」都抓出來,並用 as 各命名一個別名,分別為 count year,以便我們等會兒在樣板中使用。
    ...略...
    
    // 年度文章數
    function article_count()
    {
        global $db;
        $sql = "SELECT COUNT(*) as count, LEFT(`date`,4) as year
        FROM `articles`
        GROUP BY year
        ORDER BY year DESC";
        $sth = $db->prepare($sql);
        $sth->execute();
        $data = [];
        while ($count = $sth->fetch(PDO::FETCH_ASSOC)) {
            $data[] = $count;
        }
        return $data;
    }
    

     

  3. 接著我們呼叫 article_count() 函式,並將該函式結果$article_count傳送到樣板檔去。
    ...略...
    
    // 顯示年度文章
    $smarty->assign('article_count', article_count());
    
    // 年度文章數
    function article_count()
    {
        ...略...
    }
    

     

  4. 修改 templates/aside.tpl
    1. $article_count foreach() 依序取出,並重命名為 $yc,然後,將年度 {$yc.year} 及數量 {$yc.count} 依序填上
    2. 在選項連結上,我們也用 index.php?year={$yc.year} 告知 index.php 要取出 year 為某一年的文章資料
      <div class="list-group">
        {foreach $article_count as $yc}
          <a
            href="index.php?year={$yc.year}"
            class="list-group-item list-group-item-action d-flex justify-content-between align-items-center"
            aria-current="true"
          >
            {$yc.year}
            <span class="badge bg-success rounded-pill">{$yc.count}</span>
          </a>
        {/foreach}
      </div>
      

      最後看起來像這樣:

三、僅讓讀取年度顯示藍色

  1. 由於每個選項都有 .active,所以看起來都是藍色的
  2. 我們希望僅讓讀取年度顯示藍色,因此,必須設定一個變數(如:$year),可讓系統知道目前觀看的年度為何
  3. 所以我們再次修改 header.php,加入目前預設年度的設定,預設值設為 0,表示不分年度之意,最後送至樣板供判斷。
    ...略...
    
    // 顯示年度文章
    $smarty->assign('article_count', article_count());
    // 目前預設年度
    $year = isset($_GET['year']) ? (int) $_GET['year'] : 0;
    $smarty->assign('year', $year);
    
    
    // 年度文章數
    function article_count()
    {
        ...略...
    }
    

     

  4. 修改 templates/aside.tpl,判斷欲讀取年度跟迴圈中的年度是否一致,若一致才加上 .active
    <div class="list-group">
      {foreach $article_count as $yc}
        <a
          href="index.php?year={$yc.year}"
          class="list-group-item list-group-item-action d-flex justify-content-between align-items-center {if $year==$yc.year}active{/if}"
          aria-current="true"
        >
          {$yc.year}
          <span class="badge bg-success rounded-pill">{$yc.count}</span>
        </a>
      {/foreach}
    </div>

     

  5. 最後看起來像這樣:

:::

書籍目錄

展開 | 闔起

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

計數器

今天: 4166416641664166
昨天: 5069506950695069
總計: 5134614513461451346145134614513461451346145134614