:::
主內容區域
6-2 show() 顯示某筆資料的物件方法
- 用來產生單一頁面需用到物件方法是:
show(),其預設內容如下://以流水號秀出某筆 submission 資料內容 Submission::show() public static function show($where_arr = [], $other_arr = [], $mode = '') { global $xoopsTpl; if (empty($where_arr)) { redirect_header($_SERVER['HTTP_REFERER'], 3, "無查詢條件:" . __FILE__ . __LINE__); } $all = self::get($where_arr, $other_arr); if (empty($all)) { return false; } foreach ($all as $key => $value) { $value = Tools::filter($key, $value, 'read', self::$filter_arr); $all[$key] = $value; $$key = $value; } //將 uid 編號轉換成使用者姓名(或帳號) $uid_name = Utility::get_name_by_uid($uid); $xoopsTpl->assign('uid_name', $uid_name); $SweetAlert = new SweetAlert(); $SweetAlert->render('submission_destroy_func', "{$_SERVER['PHP_SELF']}?op=submission_destroy&id=", "id"); if ($mode == "return") { return $all; } elseif ($mode == "assign_all") { $xoopsTpl->assign('submission', $all); } else { foreach ($all as $key => $value) { $xoopsTpl->assign($key, $value); } } } - 傳入的參數預設有三個:
$where_arr = []就是篩選資料用的,陣列格式,會用and串接- 若內容為
['id' => 1],SQL語法便會轉換為WHERE 1 AND `id` = '1' - 若內容為
['start > NOW()', 'end < NOW()'],SQL語法便會轉換為WHERE1 AND start > NOW() and end < NOW() - 若內容為
['NOW() BETWEEN start AND end'],SQL語法便會轉換為WHERE1 AND NOW() BETWEEN start AND end
- 若內容為
$other_arr = []用來作為彈性擴增,晚點若有用到再說$mode的值若為return,則會傳回值,而非直接 assign到樣板。
- 接著開始根據傳入的條件來抓資料,並且在資料送到樣板或傳回前,將資料先做過濾,避免如XSS等攻擊。
if (empty($where_arr)) { redirect_header($_SERVER['HTTP_REFERER'], 3, "無查詢條件:" . __FILE__ . __LINE__); } $all = self::get($where_arr, $other_arr); if (empty($all)) { return false; } foreach ($all as $key => $value) { $value = Tools::filter($key, $value, 'read', self::$filter_arr); $all[$key] = $value; $$key = $value; }$where_arr若是沒有值,會顯示無查詢條件,並回到上頁($_SERVER['HTTP_REFERER']),redirect_header()則是XOOPS內建的轉向函數- 我們用
self::get($where_arr, $other_arr)來擷取單一筆資料並將值放入$all,若$all沒資料就直接傳回空值。 - 若是有
$all資料,則依序用Tools::filter()來過濾變數,並存回$all中,順便重製出各個欄位的變數值,例如:$id、$start、$end....等
- 由於有uid欄位,所以,我們用
Utility::get_name_by_uid($uid)來擷取此使用者的姓名,並且用$xoopsTpl->assign()送到樣板://將 uid 編號轉換成使用者姓名(或帳號) $uid_name = Utility::get_name_by_uid($uid); $xoopsTpl->assign('uid_name', $uid_name); - 最後看起來像這樣

- 由於有刪除按鈕,所以,我們呼叫
SweetAlert來做刪除確認use XoopsModules\Tadtools\SweetAlert;render()需要三個參數,第一個是javascript的呼叫名稱,第二個參數就是要執行刪除的網址,第三個參數則是根據哪個欄位值來刪除。SweetAlert 詳細用法可以看這裡link to https://github.com/tad0616/tadtools/blob/master/class/FormValidator.php _blank$SweetAlert = new SweetAlert(); $SweetAlert->render('submission_destroy_func', "{$_SERVER['PHP_SELF']}?op=submission_destroy&id=", "id"); - 最後則是根據
$mode來決定是要傳回還是送至樣板if ($mode == "return") { return $all; } elseif ($mode == "assign_all") { $xoopsTpl->assign('submission', $all); } else { foreach ($all as $key => $value) { $xoopsTpl->assign($key, $value); } }- 若是
$mode的值若為return,則會傳整個$all陣列 - 若是
$mode的值若為assign_all,則會將整個$all陣列傳到樣板 - 若是
$mode的不是上述兩種,則會依序將$all陣列拆解成單一變數,然後依序傳到樣板(這是預設)
- 若是
6-1 調整顯示單一投稿主題的界面