8-2
報名過後的界面改變
- 其實,我們已經悄悄的內建報名過後,就不可再報功能了!為什麼?因為我們當初設計資料表時,就把「uid」和「action_id」組合成主索引,主索引只能有一組,所以絕對不會讓您有機會出現第二筆重複資料。若硬是要報名就會出現「Duplicate entry '2-1' for key 'PRIMARY'」的訊息。
- 「那為何還要提出來修改?」因為,您覺得使用者看得懂「Duplicate entry '2-1' for key 'PRIMARY'」是啥意思嗎?更別說當使用者明明報完活動了,卻還在該活動頁面看到「我要報名」的按鈕,這時心裡會如何評價這位開發者呢?
- 所以,請修改一下列處,以及活動頁面裡面,偵測,若使用者已經報名,就不顯示「我要報名」的按鈕。
- 思考一下,作法有那些?
一、建議作法
- 連到此模組時就撈出該使用者所有已經參加的資料,存成陣列,並放入session
- 列出活動時,只要利用in_array()判斷該活動有無在陣列中即可。
- 優點,只多做了一次SQL請求就可以搞定。
二、修改 interface_menu.php
- 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;
}
}
}
-
我們將活動編號都放入 $_SESSION['uid_signup'] 陣列中
-
由於迴圈只抓了一個欄位,故改用 $xoopsDB->fetchRow($result) 來抓,並利用 list() 做指派,把值放到 $action_id 中。
三、修改 signup() 報名函數
- ,這部份很容易就被忽略,這是指登入後,如果又去報名其他活動,那麼報名的當下,應該要把該活動也加到 $_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;
}
四、修改主樣板的活動列表
- 我們直接在樣板中判斷即可,編輯 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}>
-
我們利用smarty的變數修飾器,直接使用 php 的 in_array() 函數來判斷目前此活動編號有無在 $_SESSION['uid_signup'] 陣列中