:::
13-5 取消報名
- 取消報名實際上就是把 signups 中的一筆報名資料刪除而已。
- 還記得之前教的 確認後刪除 嗎?依樣畫葫蘆即可!
一、修改連結並產生相關函數
- 一樣先把 show_action.tpl 和 list_action.tpl 中的連結改成這樣:
<a href="javascript:delete_signup({$action.action_id})" class="btn btn-danger btn-xs">取消報名</a> -
接著修改 templates\sweet-alert.tpl(或者要另外做一個新的也行),多加上一個新的函數
function delete_signup(id){ swal({ title: "確定要取消嗎?", text: "取消後就不能參加活動囉!", type: "warning", showCancelButton: true, confirmButtonColor: "#DD6B55", confirmButtonText: "是!含淚取消!", cancelButtonText: "不...還是繼續參加", closeOnConfirm: false }, function(){ swal("OK!取消惹!", "下次有機會再來啦!", "success"); location.href='index.php?op=delete_signup&action_id=' + id; }); } -
重點在於14行,也就是實際會連結到 index.php,並且帶個活動編號過去,至於uid不用特別帶過去,因為session中可以抓得到。
二、做出刪除的函數
- 接著到 index.php,先新增一組流程:
case "delete_signup": delete_signup($action_id); header("location:{$_SERVER['PHP_SELF']}?action_id=$action_id"); exit; -
接著實際做出該函數:
//取消報名 function delete_signup($action_id) { global $db; $sql = "DELETE FROM `signups` WHERE `action_id`='{$action_id}' and `uid`='{$_SESSION['uid']}'"; if (!$db->query($sql)) { throw new Exception($db->error); } $_SESSION['uid_signup'] = array_diff($_SESSION['uid_signup'], [$action_id]); } - 報名了要把該活動加到 $_SESSION['uid_signup'] 陣列中,同樣的,取消報名也要從 $_SESSION['uid_signup'] 陣列中把該編號拿掉。不拿掉會怎樣?不會怎樣,系統確實是刪了資料,但該活動還是會一直出現「取消報名」的按鈕而已。
- 所以,我們在第10行利用 array_diff([陣列一], [陣列二]) 來達成刪掉陣列中某個值。
三、關於array_diff()
- 這個其實並不是什麼移除陣列內容的函數,而是拿來比對兩個陣列的差異,並將差異的部份傳回一個新陣列。
- 所以,假設$_SESSION['uid_signup'] 陣列中有三個活動,依序為 [1, 2, 3],那麼,若是要取消活動 2,我們只要寫成 array_diff([1, 2, 3], [2]),該函數就會傳回陣列 [1, 3],因為這剛好是差異部份,是不是看起來如同 2 被刪除了一般!
13-4 報名過後,就不可再報