:::
8-2 製作登入、登出功能
- 有了登入認證機制,遍可以製作登入及登出機制
- 首先,懶惰的我一樣可以先問AI,登入登出圖示用什麼好(因為我懶得查)
請推薦font-awesome6的登出、登入圖示 - AI非常熱心的幫了我的忙
<!-- 登入按鈕 --> <a href="login.php" class="btn btn-primary"> <i class="fas fa-right-to-bracket"></i> 登入 </a> <!-- 登出按鈕 --> <a href="logout.php" class="btn btn-secondary"> <i class="fas fa-right-from-bracket"></i> 登出 </a> - 我們先修改
templates/nav.tpl,在工具列做判斷,若是還沒登入,就顯示「登入」選項,若已經登入,就顯示「發布新聞」及「登出」選項 - 在樣板中要直接使用全域變數,可以用「
$smarty.全域變數.變數名稱」,其中「全域變數」需小寫,「變數名稱」則視原先的大小寫需一致 - 「登入」及「發布新聞」其實都是連結到
admin.php,因為只有連到admin.php才需要輸入帳密 - 「登出」則連結到
index.php?op=logout,等一下我們就必須去index.php多加一組流程控制<ul class="navbar-nav me-auto mb-2 mb-lg-0"> ...略... {if isset($smarty.session.is_admin) && $smarty.session.is_admin} <li class="nav-item"> <a class="nav-link" href="admin.php"> <i class="fas fa-newspaper me-1"></i>發布新聞 </a> </li> <li class="nav-item"> <a class="nav-link" href="index.php?op=logout"> <i class="fas fa-right-from-bracket me-1"></i>登出 </a> </li> {else} <li class="nav-item"> <a class="nav-link" href="admin.php"> <i class="fas fa-right-to-bracket me-1"></i>登入 </a> </li> {/if} </ul> - 修改
index.php多加一組流程控制,當$op為logout時,就去執行登出用的logout_admin()函數,登出後轉向至首頁。<?php require 'header.php'; // 過濾外部傳來變數 $op = filter_input_var('op'); $id = filter_input_var('id', 'int'); $start = filter_input_var('start', 'int', 0); switch ($op) { case 'logout': logout_admin(); header("location: index.php"); exit; ...略... } - 微調一下
function.php的logout_admin()函數,將最後的exit刪除,避免無法轉向。function logout_admin() { // 清除 session unset($_SESSION['is_admin']); unset($_SESSION['admin_username']); session_destroy(); // 清除 HTTP 認證 header('WWW-Authenticate: Basic realm="Restricted Area"'); header('HTTP/1.0 401 Unauthorized'); } - 如此,工具列就會隨著登出登入狀態不同,而有所改變

8-1 讓系統記住是否為管理員