1. 學好程式的幾個建議 1-1 安裝PHP運作環境 1-2 安裝 VSCode 開發工具 1-3 安裝 Composer 1-4 關於PHP8 1-5 上課範例及需求 1-6 需要的學習心態 2. PHP基本語法 2-1 註解 2-2 PHP資訊頁 2-3 PHP的資料類型 2-4 關於陣列 2-5 PHP常用運算符(有用到再參閱) 2-6 關於函數(有用到再參閱) 2-7 關於迴圈(有用到再參閱) 2-8 建立專案目錄 3. 從前端界面入手 3-1 安裝 BootStrap5 來製作 RWD 自適應網站 3-2 設計RWD顯示界面 3-2-1 設計導覽列 3-2-2 設計主畫面 3-2-3 設計文章版面 3-2-4 側邊欄的列表 3-2-5 顯示頁面 index.html 初步完成 3-3 設計管理界面 3-3-1 用AI建立發布文章的自適應表單 3-3-2 認識表單元件 3-3-3 用AI來建立資料表 3-3-4 常用資料庫的欄位類型 3-3-5 發布頁面 admin.html 初步完成 4. 用AI來產生表單儲存功能 4-1 接收表單的值 4-2 PDO的資料庫連線 4-3 用PDO寫入資料庫 4-4 檔案上傳與接收 4-5 更新資料(寫入檔案資訊) 4-6 用PDO讀取資料 4-7 讀出資料的過濾 4-8 整併並引入共同執行檔案 header.php 4-9 把設定值也獨立成 config.php 5. 用Smarty樣板引擎將資料與前端結合 5-1 建立主樣板檔 index.tpl 並套用之 5-2 將主樣板檔拆分成小樣板 5-3 顯示所有文章摘要 5-3-1 將所有文章變成二維陣列 5-3-2 讓樣板檔接收二維陣列 5-3-3 加入分頁 5-3-4 自定義分頁工具列 5-4 建立管理樣板 admin.tpl 並套用之 5-5 將程式函式化以便彈性呼叫 5-6 加入 switch 流程控制 5-7 完成顯示單一文章的功能 5-8 加入fancybox燈箱效果 6. 讓導覽列有作用 6-1 只顯示某一分類文章 6-2 該分類沒有文章的處理 6-3 讓搜尋框有作用 6-4 讓側邊欄的年度文章數有作用 6-5 讀出指定年度的文章 7. 後台發布文章界面 7-1 讓前後台統一主樣板 7-2 加入管理者認證 7-3 用session機制讓系統記住管理員 7-4 加入編輯功能 7-5 加入儲存修改(更新)功能 7-6 加入更新點閱數的功能 7-7 讓修改時可以加入圖片 7-8 讓圖片可以刪除 7-9 加入刪除文章功能 11-1 多檔上傳 11-2 安全檔名 11-3 產生圖片縮圖 11-4 上傳影片並產生縮圖
6-4
讓側邊欄的年度文章數有作用
一、資料庫的計數方法
首先,年度應該是從文章的日期去計算出來的
要從資料庫計算數量,最常用的方法就是 count() 搭配 group by 語法,例如:
SELECT COUNT(*), `計數欄位` FROM `資料表` GROUP BY `欲計數欄位`
由於只要判斷年度,所以還會搭配 left() 的用法,也就是只擷取左邊 4 個數字(年度部份)
SELECT LEFT(`日期欄位`, 4) AS Y, COUNT(*) FROM `資料表` GROUP BY Y
或
SELECT YEAR(`日期欄位`) AS Y, COUNT(*) FROM `資料表` GROUP BY Y
二、抓出文章所有年度
由於側邊欄前後臺都會有,所以,我們可以新增一個 function.php,將函式放裡面(順便將 dd() 也移過去):
<?php
// 年度文章數
function year_count()
{
global $pdo;
try {
$stmt = $pdo->prepare("SELECT YEAR(date) AS Y, COUNT(*) FROM news GROUP BY Y ORDER BY Y DESC");
$stmt->execute();
$year_count = $stmt->fetchAll(PDO::FETCH_KEY_PAIR);
} catch (PDOException $e) {
die("取得年度文章數失敗:" . $e->getMessage());
}
return $year_count;
}
利用 COUNT() 搭配 GROUP BY 語法將「年度」及「文章數」都抓出來,並用 YEAR() 來取得日期欄位的年份,並用 AS 命名別名 Y (因為後面都會用到)
重點在於用fetchAll()讀出時,指定了 PDO::FETCH_KEY_PAIR 參數,也就是將取得的兩個值,一個當索引,一個當值,的放入陣列中,更好完全符合我們的需求。
修改前後台都會引入的 header.php,引入 function.php:
<?php
require_once 'config.php';
require_once 'vendor/autoload.php';
require_once 'function.php';
修改 index.php 及 admin.php,執行函式並將其值丟到樣板
$smarty->assign('op', $op);
$smarty->assign('categories', $categories);
$smarty->assign('year_count', year_count());
$smarty->display('index.tpl');
最後修改 templates/index_side.tpl
<div class="list-group">
{foreach $year_count as $year => $counter}
<a href="index.php?year={$year}" class="list-group-item list-group-item-action d-flex justify-content-between align-items-center {if (isset($smarty.get.year) && $smarty.get.year == $year) || (!isset($smarty.get.year) && $smarty.now|date_format:'%Y' == $year)}active{/if}">
{$year}
<span class="badge bg-success badge-pill">{$counter}</span>
</a>
{/foreach}
</div>
將 $year_count 用 foreach() 依序取出,並拆分為將年度 {$year} 及數量 {$counter}
原本是 <ul><li></li></div> 結構,因為想要用連結,故改為 <div><a></a></div> 結構,如此可以方便加入連結
在選項連結上,我們也用 index.php?year={$year} 告知 index.php 要取出 year 為某一年的文章資料
當網址有傳入 $year 參數時可以用 $smarty.get.year 取得,若是和迴圈讀到的的年度一致,就加入 active,使之變成藍底白字。
另一個情況是網址沒有傳入 $year 參數時,就改用 $smarty.now|date_format:'%Y' 取得現在的年份 ,若是和迴圈讀到的的年度一致,也加入 active。
最後看起來像這樣:
1. 學好程式的幾個建議 1-1 安裝PHP運作環境 1-2 安裝 VSCode 開發工具 1-3 安裝 Composer 1-4 關於PHP8 1-5 上課範例及需求 1-6 需要的學習心態 2. PHP基本語法 2-1 註解 2-2 PHP資訊頁 2-3 PHP的資料類型 2-4 關於陣列 2-5 PHP常用運算符(有用到再參閱) 2-6 關於函數(有用到再參閱) 2-7 關於迴圈(有用到再參閱) 2-8 建立專案目錄 3. 從前端界面入手 3-1 安裝 BootStrap5 來製作 RWD 自適應網站 3-2 設計RWD顯示界面 3-2-1 設計導覽列 3-2-2 設計主畫面 3-2-3 設計文章版面 3-2-4 側邊欄的列表 3-2-5 顯示頁面 index.html 初步完成 3-3 設計管理界面 3-3-1 用AI建立發布文章的自適應表單 3-3-2 認識表單元件 3-3-3 用AI來建立資料表 3-3-4 常用資料庫的欄位類型 3-3-5 發布頁面 admin.html 初步完成 4. 用AI來產生表單儲存功能 4-1 接收表單的值 4-2 PDO的資料庫連線 4-3 用PDO寫入資料庫 4-4 檔案上傳與接收 4-5 更新資料(寫入檔案資訊) 4-6 用PDO讀取資料 4-7 讀出資料的過濾 4-8 整併並引入共同執行檔案 header.php 4-9 把設定值也獨立成 config.php 5. 用Smarty樣板引擎將資料與前端結合 5-1 建立主樣板檔 index.tpl 並套用之 5-2 將主樣板檔拆分成小樣板 5-3 顯示所有文章摘要 5-3-1 將所有文章變成二維陣列 5-3-2 讓樣板檔接收二維陣列 5-3-3 加入分頁 5-3-4 自定義分頁工具列 5-4 建立管理樣板 admin.tpl 並套用之 5-5 將程式函式化以便彈性呼叫 5-6 加入 switch 流程控制 5-7 完成顯示單一文章的功能 5-8 加入fancybox燈箱效果 6. 讓導覽列有作用 6-1 只顯示某一分類文章 6-2 該分類沒有文章的處理 6-3 讓搜尋框有作用 6-4 讓側邊欄的年度文章數有作用 6-5 讀出指定年度的文章 7. 後台發布文章界面 7-1 讓前後台統一主樣板 7-2 加入管理者認證 7-3 用session機制讓系統記住管理員 7-4 加入編輯功能 7-5 加入儲存修改(更新)功能 7-6 加入更新點閱數的功能 7-7 讓修改時可以加入圖片 7-8 讓圖片可以刪除 7-9 加入刪除文章功能 11-1 多檔上傳 11-2 安全檔名 11-3 產生圖片縮圖 11-4 上傳影片並產生縮圖