Title1

Title2

Title3

9-4 實做

  1. 複製空白架構,並存檔「admin.php」
    <?php
    require_once 'head.php';
     
    #整理傳入變數
    $op = isset($_REQUEST['op'])?$_REQUEST['op']:"";
     
    #程式流程
    switch($op){
      #----
      case "op_test":
        op_test();
      break;
      #----
      case "op_test1":
        op_test1();
      break;
     
      //預設動作
      default:
        $op="op_list";
      break;
     
    }
     
    #將變數送至樣板引擎
    #op
    $smarty->assign("op", $op);
    #檔案名稱(含副檔),變數在head.php
    $smarty->assign("WEB", $WEB);
     
    #程式結尾
    $smarty->display('theme.html');
     
    #函數
    ########################################
    # op_test
    ########################################
    function op_test()
    {
      return;
    }
     
    ########################################
    # op_test1
    ########################################
    function op_test1()
    {
      return;
    }
    
  2. 流程變數:
    使用 $_SESSION['uname']來判斷是否登入,因為要判斷這個變數,假設它不存在時,則會報錯,所以通常會先定義變數,這裡用三元運算
    #定義變數, $_SESSION['uname']用來判斷是否登入
    $_SESSION['uname']=isset($_SESSION['uname'])?$_SESSION['uname']:"";

    在流程控制加上
     

      //預設動作
      default:
        $op="op_list";
        if($_SESSION['uname']){
          #如果已經登入,則跳轉至後台的首頁
          header("location:admin/index.php");
        }
      break;

    此時,因為還沒登入,所以程式執行結束,而螢幕是空畫面,接下來做一張表單,資料傳送目的地 admin.php 方法 post

  3. 在「templates/default/theme.html」加入表單語法
        {* admin.php *}
        {if $WEB.file_name == "admin.php"}
          <div class="container" style="margin-top:40px;min-height:550px;">
            <div class="row">
              <div class="col-md-4 col-md-offset-4 bg-success" style="padding:20px;">
    
                <form action="admin.php" method="post">
    
                  <div class="form-group">
                    <label>帳號</label>
                    <input type="text" class="form-control" id="uname" name="uname" placeholder="帳號">
                    <p class="help-block">請輸入帳號,最多8個字元</p>
                  </div>
    
                  <div class="form-group">
                    <label>密碼</label>
                    <input type="password" class="form-control" id="pass"  name="pass" placeholder="密碼">
                    <p class="help-block">請輸入密碼,最多8個字元</p>
                  </div>
    
                  <!--用來控制程式流程-->
                  <input type="hidden" name="op" value="check_uname">
                  <button type="submit" class="btn btn-default">送出</button>
    
                </form>
              </div>
            </div>
          </div>
    
        {/if}

    <form action="admin.php" method="post"> 接收表單的程式 admin.php 方法 post
    隱藏一個 $_POST['op'] = check_uname

  4. 表單送出後,由admin.php接收,可以用「print_r($_POST); die();」觀看接收的變數
    在流程加
    
      #登入
      case "check_uname":
        $msg = check_uname();
        if($msg){
          #如果帳號、密碼,驗證ok,則跳轉至,後台首頁
          $_SESSION['uname'] = true;
          header("location:admin/index.php");
          exit;
        }
        //header("location:index.php");
        //exit;
        //$smarty->assign("msg", "請輸入正確帳號、密碼");
      break;
    
    #函數
    ########################################
    # check_uname
    ########################################
    function check_uname()
    {
      #過濾接教變數, 特殊字符轉義
      $_POST['uname'] = addslashes($_POST['uname']);
      $_POST['pass'] = addslashes($_POST['pass']);//
      if($_POST['uname'] == "admin" and $_POST['pass'] == "admin123456")return true;
      return;
    }


     
  5. 登出,請檢查後台的登出連結 「 ../admin.php?op=logout 」
    在流程增加 logout => $_SESSION['uname'] = ""; 即可

  6. 在前台增加一個隱藏的登入點:編輯樣版
    樣板位置:web/templates/default/theme.html
    編輯「theme.html」將語法放在 </body> 之前

    {* 登入用 *}
    <div style='position:fixed;top:1px;left:1px;z-index:10000'>
     <a href="admin.php">&nbsp;&nbsp;</a>
    </div >

    {* 登入用 *}:smarty 的註解
     position:fixed; :固定定位(position: fixed)的元素會相對於瀏覽器視窗來定位,這意味著即便頁面捲動,它還是會固定在相同的位置。
    z-index 可以用來設置元素的 Z 方向位置,z-index 數字越大的在越上面,反之則在越下面。

  7. 後台要驗證 $_SESSION['uname'],假如不真,則跳回前台頁頁
     

    
    #沒有登入,則回到前台首頁
    if(!$_SESSION['uname'])header("location:../index.php");