:::

8-2 報名過後的界面改變

  1. 其實,我們已經悄悄的內建報名過後,就不可再報功能了!為什麼?因為我們當初設計資料表時,就把「uid」和「action_id」組合成主索引,主索引只能有一組,所以絕對不會讓您有機會出現第二筆重複資料。若硬是要報名就會出現「Duplicate entry '2-1' for key 'PRIMARY'」的訊息。
  2. 「那為何還要提出來修改?」因為,您覺得使用者看得懂「Duplicate entry '2-1' for key 'PRIMARY'」是啥意思嗎?更別說當使用者明明報完活動了,卻還在該活動頁面看到「我要報名」的按鈕,這時心裡會如何評價這位開發者呢?
  3. 所以,請修改一下列處,以及活動頁面裡面,偵測,若使用者已經報名,就不顯示「我要報名」的按鈕。
  4. 思考一下,作法有那些?

一、建議作法

  1. 連到此模組時就撈出該使用者所有已經參加的資料,存成陣列,並放入session
  2. 列出活動時,只要利用in_array()判斷該活動有無在陣列中即可。
  3. 優點,只多做了一次SQL請求就可以搞定。

二、修改 interface_menu.php

  1.  interface_menu.php 是讀取模組一定會動到的,所以,可以在裡面判斷有$xoopsUser之後就後撈取該使用者所有已報名的活動編號
    if ($xoopsUser) {
        $module_id = $xoopsModule->getVar('mid');
        $isAdmin   = $xoopsUser->isAdmin($module_id);
    
        //抓取該使用者已報名的活動編號
        if (!isset($_SESSION['uid_signup'])) {
            $tbl                    = $xoopsDB->prefix('signups');
            $uid                    = $xoopsUser->uid();
            $sql                    = "SELECT action_id FROM `{$tbl}` where `uid`='{$uid}'";
            $result                 = $xoopsDB->query($sql) or web_error($sql);
            $_SESSION['uid_signup'] = [];
            while (list($action_id) = $xoopsDB->fetchRow($result)) {
                $_SESSION['uid_signup'][] = $action_id;
            }
        }
    }
  2. 我們將活動編號都放入 $_SESSION['uid_signup'] 陣列中

  3. 由於迴圈只抓了一個欄位,故改用 $xoopsDB->fetchRow($result) 來抓,並利用 list() 做指派,把值放到 $action_id 中。

三、修改 signup() 報名函數

  1. ,這部份很容易就被忽略,這是指登入後,如果又去報名其他活動,那麼報名的當下,應該要把該活動也加到 $_SESSION['uid_signup'] 陣列中才合理。
    //報名
    function signup($action_id)
    {
        global $xoopsDB, $xoopsUser;
    
        $uid = $xoopsUser->uid();
    
        $tbl = $xoopsDB->prefix('signups');
        $sql = "INSERT INTO `{$tbl}` ( `action_id`, `uid`, `signup_date`)
        VALUES ('{$action_id}', '{$uid}', NOW())";
        $xoopsDB->queryF($sql) or web_error($sql);
        $_SESSION['uid_signup'][] = $action_id;
    }

四、修改主樣板的活動列表

  1. 我們直接在樣板中判斷即可,編輯 list_action.tpl
    <{if $xoops_isadmin}>
      <a href="javascript:delete_action(<{$action.action_id}>)" class="btn btn-danger btn-xs">刪除</a>
      <a href="admin/main.php?action_id=<{$action.action_id}>" class="btn btn-warning btn-xs">編輯</a>
    <{elseif $xoops_isuser}>
      <{if $action.action_id|in_array:$smarty.session.uid_signup}>
        <a href="index.php?op=delete_signup&action_id=<{$action.action_id}>" class="btn btn-danger btn-xs">取消報名</a>
      <{else}>
        <a href="index.php?op=signup&action_id=<{$action.action_id}>" class="btn btn-success btn-xs">我要報名</a>
      <{/if}>
    <{/if}>
  2. 我們利用smarty的變數修飾器,直接使用 php 的 in_array() 函數來判斷目前此活動編號有無在 $_SESSION['uid_signup'] 陣列中


:::

書籍目錄

展開 | 闔起

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D908

計數器

今天: 2032203220322032
昨天: 1988198819881988
總計: 7388923738892373889237388923738892373889237388923