:::
所有書籍
「[1102] PHP全端開發」目錄
MarkDown
9-4-2-2 class\Tad_signup_api.php 套用語系
1. 開發環境與XOOPS模組結構
1-1 第一節 完成開發環境設定
1-1-1 開發環境需求
1-1-2 UniFormServer 常用功能重要目錄介紹
1-1-3 讓 UniForm Server 可以寄信
1-1-4 初步認識XOOPS
1-2 第二節 安裝開發工具
1-2-1 安裝 Visual Studio Code 文字編輯器
1-2-2 安裝 Visual Studio Code 的相關套件
1-2-3 新增程式碼片段
1-2-4 VSCode 常用快捷鍵
1-3 第三節 建立模組基本架構
1-3-1 下載 XOOPS250ModuleConversionFiles
1-3-2 xoops_version.php 基本設定
1-3-3 將專案發布至GitHub
1-4 第四節 完成圖示及資料表設計
1-4-1 用inkscape設計logo
1-4-2 常用資料庫的欄位類型
1-4-3 建立資料表
1-5 第五節 了解類別(class)架構及邏輯
1-5-1 修改預先載入設定 preloads\core.php
1-5-2 修改用來操控資料表的類別(class)
1-5-3 模組物件.php
1-5-4 PHP簡易的物件導向觀念
1-6 第五節 前台相關檔案
1-6-1 前後臺的基本樣板檔
1-6-2 前台頁面的基本架構
1-6-3 認識模組中的 header.php
1-6-4 認識 interface_menu.php
1-6-5 $xoopsUser 使用者物件
2. 製作前台活動管理功能
2-1 第一節 完成模組首頁預設動作
2-1-1 讓畫面顯示新增活動按鈕
2-1-2 安裝模組
2-2 第二節 各種內建的常用物件
2-2-1 關於 Xmf\Request 變數過濾物件
2-2-2 關於 $xoopsDB 資料庫物件
2-2-3 關於 $xoopsTpl 樣板物件
2-2-4 關於各種XOOPS會用到超級全域變數,如 $GLOBALS['xoops']
2-3 第三節 建立活動的表單
2-3-1 解析建立活動表單的方法
2-3-2 建立活動表單樣板檔
2-4 第四節 完成新增活動
2-4-1 表單初步權限判斷及設定預設值
2-4-2 寫入活動到資料庫中
2-4-3 關於 MyTextSanitizer 資料過濾物件
2-4-4 eguide表單語法
2-5 第五節 顯示單一活動內容
2-5-1 完成顯示活動
2-5-2 完成顯示單一活動的樣板
2-5-3 關於 css/module.css
2-6 第六節 修改活動功能
2-6-1 活動編輯表單加入隱藏編號
2-6-2 完成活動修改功能
3. 製作前台活動報名功能(上)
3-1 第一節 所有活動列表
3-1-1 取得所有活動資料
3-1-2 完成顯示活動列表畫面
3-2 第二節 加入刪除活動功能
3-2-1 加入刪除功能
3-2-2 刪除套用 SweetAlert
3-3 第三節 報名的架構
3-3-1 新增活動報名的資料表
3-3-2 新增 TadDataCenter 用的資料表
3-3-3 建立 Tad_signup_data 紀錄報名資料的類別檔
3-4 第四節 打造報名功能
3-4-1 新增報名表單流程
3-4-2 建立報名表的初步畫面
3-4-3 模組開發除錯方式
3-4-4 修改活動報名的 create()
3-4-5 在報名表加入活動相關資訊
3-5 第五節 完成儲存報名功能
3-5-1 TadDataCenter 常用方法
3-5-2 用 TadDataCenter 產生報名表的完整欄位
3-5-3 寫入報名資訊到資料庫
3-6 第六節 初步完成報名功能
3-6-1 取得報名資訊
3-6-2 顯示報名資訊
3-6-3 修改報名資料的流程
3-6-4 完成更新報名資料功能
3-6-5 完成取消報名功能
3-6-6 加入刪除確認功能
4. 製作前台活動報名功能(下)
4-1 第一節 顯示已報名清單
4-1-1 取得所有報名的完整資料
4-1-2 在顯示單一活動頁面顯示所有報名者
4-1-3 套用BootstrapTable強化表格
4-2 第二節 針對訪客來調整顯示內容
4-2-1 在活動列表顯示報名人數
4-2-2 訪客的能看到的東西
4-3 第三節 調整一般登入者能看到的畫面
4-3-1 登入的使用者能看到的東西
4-3-2 新增前台頁面:我的報名紀錄
4-4 第四節 自行建立物件方法及樣板
4-4-1 建立「我的報名紀錄」物件方法
4-4-2 建立「我的報名紀錄」樣板
4-4-3 讓報名者可以觀看自己的紀錄
4-5 第五節 完成各種活動管理功能
4-5-1 完成錄取功能
4-5-2 加入複製活動功能
4-6 第六節 更安全、更彈性的 get() 取得資料
4-6-1 加強資料保護
4-6-2 讓活動的 get() 可以根據情況過濾
5. 寄信、後台、權限、搜尋、偏好設定等機制用法
5-1 第一節 寄發各種通知信
5-1-1 在流程加入寄發報名通知信
5-1-2 寄信功能
5-2 第二節 針對不同狀況寄發通知信
5-2-1 產生通知信內容
5-2-2 製作HTML通知信內容
5-2-3 錄取狀態改變時的通知
5-3 第三節 新增後台界面
5-3-1 建立後台頁面 main.php
5-3-2 讓後台可以看到過期或關閉活動
5-3-3 修改樣板讓前後臺連結都適用
5-4 第四節 在後台進行權限設定
5-4-1 在後台建立權限設定頁
5-4-2 套用細部權限
5-4-3 修正可發布活動者可看到的東西
5-5 第五節 新增模組偏好設定
5-5-1 加入偏好設定
5-5-2 加入分頁工具
5-5-3 讓無法報名的活動也能顯示出來
5-6 第六節 加入搜尋功能
5-6-1 完成搜尋功能
5-6-2 套用所見即所得編輯器
6. 模組區塊及自動功能之應用
6-1 第一節 建立「可報名活動一覽」區塊
6-1-1 加入「可報名活動一覽」區塊的設定
6-1-2 建立區塊的php檔
6-1-3 建立區塊的樣板檔
6-2 第二節 加入區塊設定值
6-2-1 編輯區塊的設定函式
6-2-2 套用區塊設定值
6-2-3 勿用分頁功能來限制呈現數
6-3 第三節 可選擇活動的區塊設定
6-3-1 建立「活動報名焦點」區塊
6-3-2 建立「活動報名焦點」區塊的樣板
6-4 第四節 模組安裝時自動建立群組並完成權限設定
6-4-1 安裝模組時的自動功能
6-4-2 安裝模組時自動建立群組
6-4-3 安裝模組時自動完成群組權限設定
6-4-4 移除模組時的自動功能
6-5 第五節 模組更新時自動修改資料庫架構
6-5-1 更新模組時的自動功能
6-5-2 更新模組時的自動修改資料庫欄位
6-5-3 加入候補欄位後的基本異動
6-5-4 讓候補功能生效
6-6 第六節 用TadDataCenter 取代資料表異動
6-6-1 用 TadDataCenter 來註記候補
6-6-2 用 TadUpFiles 上傳附檔
6-6-3 顯示上傳檔案
7. HTML、CSV、Excel的匯出與匯入
7-1 第一節 HTML的匯出
7-1-1 匯出HTML及產生靜態頁面檔
7-2 匯出 CSV 檔
7-2-1 CSV 匯出及轉碼
7-2-2 產生 CSV 完整內容
7-3 第二節 CSV 的匯入
7-3-1 CSV 匯入界面
7-3-2 CSV 匯入後的資料預覽畫面
7-4 完成 CSV 匯入
7-4-1 批次匯入 CSV 報名資料
7-5 第三節 產生 Excel 檔
7-5-1 產生 Excel 檔
7-5-2 Excel 常用方法
7-5-3 產生 Excel 匯入檔
7-5-4 產生完整的 Excel 匯出檔
7-6 第四節 妝點 Excel 及匯入功能
7-6-1 設定 Excel 樣式
7-6-2 設定最適欄位寬度
7-6-3 匯入 Excel 界面
7-6-4 讀取匯入的 Excel 資料
7-6-5 產生 Excel 預覽界面並批次匯入資料
8. PDF、Word文件輸出
8-1 第一節 PDF簡易製作法
8-1-1 無痛產生PDF
8-1-2 TCPDF 基本設定
8-1-3 用 HTML 快速產生 PDF
8-2 第二節 精雕細琢產生 PDF
8-2-1 手動刻畫PDF檔內容的幾種方法
8-2-2 手刻簽到表
8-2-3 將報名欄位做成類別方法
8-3 第三節 動態產生PDF
8-3-1 用雙框挑選器來設定PDF簽到表
8-3-2 寫入 PDF 設定
8-3-3 產出套用設定的PDF檔
8-3-4 更換PDF字型為全字庫
8-4 第四節 產生 docx 檔(word)
8-4-1 產生docx或odt檔案的基本架構
8-4-2 產生各種格式的簽到表
8-5 第五節 產生 word 檔內容
8-5-1 加入內容到word檔
8-5-2 插入表格到word中
8-5-3 產生 OpenDocument(odt)檔案
8-5-4 優化操作流程
8-6 第六節 利用樣板產生 word 檔
8-6-1 製作套用樣板檔
8-6-2 將值套用到樣板檔
8-6-3 將值套用到樣板的表格中
9. API製作、操作優化並製成多國語系模組釋出
9-1 第一節 產生 API
9-1-1 建立專屬的 API 類別
9-1-2 建立 API 介接入口
9-1-3 用 API 取得所有活動
9-2 第二節 API認證及接收API
9-2-1 限制登入後才能取得資料
9-2-2 有權限的群組才能取得資料
9-2-3 接收 API 並產生頁面
9-3 第三節 做成多國語系模組
9-3-1 關於XOOPS的語系
9-3-2 建立後台語系 admin.php
9-3-2-1 admin\main.php 套用語系
9-3-2-2 admin\power.php 套用語系
9-3-3 建立設定檔語系 modinfo.php
9-3-3-1 admin\menu.php 套用語系
9-3-3-2 xoops_version.php 套用語系
9-3-4 建立區塊語系 blocks.php
9-3-4-1 blocks\action_list.php 套用語系
9-3-4-2 blocks\action_signup.php 套用語系
9-3-4-3 templates\blocks\action_list.tpl 套用語系
9-3-4-4 templates\blocks\action_signup.tpl 套用語系
9-4 第四節 建立前台語系
9-4-1 建立主要語系 main.php
9-4-2 修改所有前台PHP檔
9-4-2-1 class\Tad_signup_actions.php 套用語系
9-4-2-2 class\Tad_signup_api.php 套用語系
9-4-2-3 class\Tad_signup_data.php 套用語系
9-4-2-4 include\onInstall.php 套用語系
9-4-2-5 include\onUpdate.php 套用語系
9-4-2-6 csv.php 套用語系
9-4-2-7 excel.php 套用語系
9-4-2-8 html.php 套用語系
9-4-2-9 index.php 套用語系
9-4-2-10 interface_menu.php 套用語系
9-4-2-11 odt_signup.php 套用語系
9-4-2-12 pdf_signup.php 套用語系
9-4-2-13 pdf.php 套用語系
9-4-2-14 word_signup.php 套用語系
9-4-2-15 word.php 套用語系
9-5 第五節 製作樣及英文語系
9-5-1 修改所有前台的樣板檔
9-5-1-1 templates\op_tad_signup_actions_create.tpl 套用語系
9-5-1-2 templates\op_tad_signup_actions_index.tpl 套用語系
9-5-1-3 templates\op_tad_signup_actions_show.tpl 套用語系
9-5-1-4 templates\op_tad_signup_data_create.tpl 套用語系
9-5-1-5 templates\op_tad_signup_data_my.tpl 套用語系
9-5-1-6 templates\op_tad_signup_data_pdf_setup.tpl 套用語系
9-5-1-7 templates\op_tad_signup_data_preview_csv.tpl 套用語系
9-5-1-8 templates\op_tad_signup_data_preview_excel.tpl 套用語系
9-5-1-9 templates\op_tad_signup_data_show.tpl 套用語系
9-5-2 建立英文語系
9-6 第六節 打包模組、釋出模組
9-6-1 編寫說明檔
9-6-2 修改 xoops_version.php 的版號及發布日期
9-6-3 利用 WinMerge 來過濾 git 檔並比較和舊版差異
9-6-4 反安裝模組,並重裝模組
9-6-5 將模組發布至 https://campus-xoops.tn.edu.tw/
10. 課程補充
10-1 新增XOOPS會員
10-2 在 interface_menu.php 另外判斷群組權限的用法?
9-4-2-4 include\onInstall.php 套用語系
\[1102\] PHP全端開發 ================
影片中資料庫大小寫不正確,一律改為小寫 prefix("tad\_signup\_data")
```php assign('all_data', $all_data); } //編輯表單 public static function create($action_id, $id = '') { global $xoopsTpl, $xoopsUser; $uid = $_SESSION['can_add'] ? null : $xoopsUser->uid(); //抓取預設值 $db_values = empty($id) ? [] : self::get($id, $uid); if ($id and empty($db_values)) { redirect_header($_SERVER['PHP_SELF'] . "?id={$action_id}", 3, _MD_TAD_SIGNUP_CANNOT_BE_MODIFIED); } foreach ($db_values as $col_name => $col_val) { $$col_name = $col_val; $xoopsTpl->assign($col_name, $col_val); } $op = empty($id) ? "tad_signup_data_store" : "tad_signup_data_update"; $xoopsTpl->assign('next_op', $op); //套用formValidator驗證機制 $formValidator = new FormValidator("#myForm", true); $formValidator->render(); //加入Token安全機制 include_once $GLOBALS['xoops']->path('class/xoopsformloader.php'); $token = new \XoopsFormHiddenToken(); $token_form = $token->render(); $xoopsTpl->assign("token_form", $token_form); $action = Tad_signup_actions::get($action_id, true); if (time() > strtotime($action['end_date'])) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_END); } elseif (!$action['enable']) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_CLOSED); } elseif ($action['signup_count'] >= ($action['number'] + $action['candidate'])) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_FULL); } $xoopsTpl->assign("action", $action); $uid = $xoopsUser ? $xoopsUser->uid() : 0; $xoopsTpl->assign("uid", $uid); $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $signup_form = $TadDataCenter->strToForm($action['setup']); $xoopsTpl->assign("signup_form", $signup_form); } //新增資料 public static function store() { global $xoopsDB; //XOOPS表單安全檢查 Utility::xoops_security_check(); $myts = \MyTextSanitizer::getInstance(); foreach ($_POST as $var_name => $var_val) { $$var_name = $myts->addSlashes($var_val); } $action_id = (int) $action_id; $uid = (int) $uid; $sql = "insert into `" . $xoopsDB->prefix("tad_signup_data") . "` ( `action_id`, `uid`, `signup_date` ) values( '{$action_id}', '{$uid}', now() )"; $xoopsDB->queryF($sql) or Utility::web_error($sql, __FILE__, __LINE__); //取得最後新增資料的流水編號 $id = $xoopsDB->getInsertId(); $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $TadDataCenter->saveData(); $action = Tad_signup_actions::get($action_id); $action['signup'] = self::get_all($action_id); if (count($action['signup']) > $action['number']) { $TadDataCenter->set_col('data_id', $id); $TadDataCenter->saveCustomData(['tag' => [_MD_TAD_SIGNUP_CANDIDATE]]); } return $id; } //以流水號秀出某筆資料內容 public static function show($id = '') { global $xoopsTpl, $xoopsUser; if (empty($id)) { return; } $uid = $_SESSION['can_add'] ? null : $xoopsUser->uid(); $id = (int) $id; $data = self::get($id, $uid); if (empty($data)) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_CANT_WATCH); } $myts = \MyTextSanitizer::getInstance(); foreach ($data as $col_name => $col_val) { $col_val = $myts->htmlSpecialChars($col_val); $xoopsTpl->assign($col_name, $col_val); $$col_name = $col_val; } $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $tdc = $TadDataCenter->getData(); $xoopsTpl->assign('tdc', $tdc); $action = Tad_signup_actions::get($action_id, true); $xoopsTpl->assign("action", $action); $now_uid = $xoopsUser ? $xoopsUser->uid() : 0; $xoopsTpl->assign("now_uid", $now_uid); $SweetAlert = new SweetAlert(); $SweetAlert->render("del_data", "index.php?op=tad_signup_data_destroy&action_id={$action_id}&id=", 'id'); } //更新某一筆資料 public static function update($id = '') { global $xoopsDB, $xoopsUser; //XOOPS表單安全檢查 Utility::xoops_security_check(); $myts = \MyTextSanitizer::getInstance(); foreach ($_POST as $var_name => $var_val) { $$var_name = $myts->addSlashes($var_val); } $action_id = (int) $action_id; $uid = (int) $uid; $now_uid = $xoopsUser ? $xoopsUser->uid() : 0; $sql = "update `" . $xoopsDB->prefix("tad_signup_data") . "` set `signup_date` = now() where `id` = '$id' and `uid` = '$now_uid'"; if ($xoopsDB->queryF($sql)) { $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $TadDataCenter->saveData(); } else { Utility::web_error($sql, __FILE__, __LINE__); } return $id; } //刪除某筆資料資料 public static function destroy($id = '') { global $xoopsDB, $xoopsUser; if (empty($id)) { return; } $now_uid = $xoopsUser ? $xoopsUser->uid() : 0; $sql = "delete from `" . $xoopsDB->prefix("tad_signup_data") . "` where `id` = '{$id}' and `uid`='$now_uid'"; if ($xoopsDB->queryF($sql)) { $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $TadDataCenter->delData(); } else { Utility::web_error($sql, __FILE__, __LINE__); } } //以流水號取得某筆資料 public static function get($id = '', $uid = '') { global $xoopsDB; if (empty($id)) { return; } $and_uid = $uid ? "and `uid`='$uid'" : ''; $sql = "select * from `" . $xoopsDB->prefix("tad_signup_data") . "` where `id` = '{$id}' $and_uid"; $result = $xoopsDB->query($sql) or Utility::web_error($sql, __FILE__, __LINE__); $data = $xoopsDB->fetchArray($result); return $data; } //取得所有資料陣列 public static function get_all($action_id = '', $uid = '', $auto_key = false, $only_accept = false) { global $xoopsDB, $xoopsUser; $myts = \MyTextSanitizer::getInstance(); $and_accept = $only_accept ? "and `accept`='1'" : ''; if ($action_id) { $sql = "select * from `" . $xoopsDB->prefix("tad_signup_data") . "` where `action_id`='$action_id' $and_accept order by `signup_date`"; } else { if (!$_SESSION['can_add'] or !$uid) { $uid = $xoopsUser ? $xoopsUser->uid() : 0; } $sql = "select * from `" . $xoopsDB->prefix("tad_signup_data") . "` where `uid`='$uid' $and_accept order by `signup_date`"; } $result = $xoopsDB->query($sql) or Utility::web_error($sql, __FILE__, __LINE__); $data_arr = []; $TadDataCenter = new TadDataCenter('tad_signup'); while ($data = $xoopsDB->fetchArray($result)) { $TadDataCenter->set_col('id', $data['id']); $data['tdc'] = $TadDataCenter->getData(); $data['action'] = Tad_signup_actions::get($data['action_id'], true); $TadDataCenter->set_col('data_id', $data['id']); $data['tag'] = $TadDataCenter->getData('tag', 0); if ($_SESSION['api_mode'] or $auto_key) { $data_arr[] = $data; } else { $data_arr[$data['id']] = $data; } } return $data_arr; } // 查詢某人的報名紀錄 public static function my($uid) { global $xoopsTpl, $xoopsUser; $my_signup = self::get_all(null, $uid); $xoopsTpl->assign('my_signup', $my_signup); BootstrapTable::render(); } // 更改錄取狀態 public static function accept($id, $accept) { global $xoopsDB; if (!$_SESSION['can_add']) { redirect_header($_SERVER['PHP_SELF'], 3, _TAD_PERMISSION_DENIED); } $id = (int) $id; $accept = (int) $accept; $sql = "update `" . $xoopsDB->prefix("tad_signup_data") . "` set `accept` = '$accept' where `id` = '$id'"; $xoopsDB->queryF($sql) or Utility::web_error($sql, __FILE__, __LINE__); } //立即寄出 public static function send($title = _MD_TAD_SIGNUP_NO_TITLE, $content = _MD_TAD_SIGNUP_NO_CONTENT, $email = "") { global $xoopsUser; if (empty($email)) { $email = $xoopsUser->email(); } $xoopsMailer = xoops_getMailer(); $xoopsMailer->multimailer->ContentType = "text/html"; $xoopsMailer->addHeaders("MIME-Version: 1.0"); $header = ''; return $xoopsMailer->sendMail($email, $title, $content, $header); } // 產生通知信 public static function mail($id, $type, $signup = []) { global $xoopsUser; $id = (int) $id; if (empty($id)) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_UNABLE_TO_SEND); } $signup = $signup ? $signup : self::get($id, true); $now = date("Y-m-d H:i:s"); $name = $xoopsUser->name(); $name = $name ? $name : $xoopsUser->uname(); $action = Tad_signup_actions::get($signup['action_id']); $member_handler = xoops_getHandler('member'); $admUser = $member_handler->getUser($action['uid']); $adm_email = $admUser->email(); if ($type == 'destroy') { $title = sprintf(_MD_TAD_SIGNUP_DESTROY_TITLE, $action['title']); $head = sprintf(_MD_TAD_SIGNUP_DESTROY_HEAD, $signup['signup_date'], $action['title'], $now, $name); $foot = _MD_TAD_SIGNUP_DESTROY_FOOT . XOOPS_URL . "/modules/tad_signup/index.php?op=tad_signup_data_create&action_id={$action['id']}"; } elseif ($type == 'store') { $title = sprintf(_MD_TAD_SIGNUP_STORE_TITLE, $action['title']); $head = sprintf(_MD_TAD_SIGNUP_STORE_HEAD, $signup['signup_date'], $action['title'], $now, $name); $foot = _MD_TAD_SIGNUP_FOOT . XOOPS_URL . "/modules/tad_signup/index.php?id={$signup['action_id']}"; } elseif ($type == 'update') { $title = sprintf(_MD_TAD_SIGNUP_UPDATE_TITLE, $action['title']); $head = sprintf(_MD_TAD_SIGNUP_UPDATE_HEAD, $signup['signup_date'], $action['title'], $now, $name); $foot = _MD_TAD_SIGNUP_FOOT . XOOPS_URL . "/modules/tad_signup/index.php?id={$signup['action_id']}"; } elseif ($type == 'accept') { $title = sprintf(_MD_TAD_SIGNUP_ACCEPT_TITLE, $action['title']); if ($signup['accept'] == 1) { $head = sprintf(_MD_TAD_SIGNUP_ACCEPT_HEAD1, $signup['signup_date'], $action['title']); } else { $head = sprintf(_MD_TAD_SIGNUP_ACCEPT_HEAD0, $signup['signup_date'], $action['title']); } $foot = _MD_TAD_SIGNUP_FOOT . XOOPS_URL . "/modules/tad_signup/index.php?id={$signup['action_id']}"; $signupUser = $member_handler->getUser($signup['uid']); $email = $signupUser->email(); } $content = self::mk_content($id, $head, $foot, $action); if (!self::send($title, $content, $email)) { redirect_header($_SERVER['PHP_SELF'], 3, _MD_TAD_SIGNUP_FAILED_TO_SEND); } self::send($title, $content, $adm_email); } // 產生通知信內容 public static function mk_content($id, $head = '', $foot = '', $action = []) { if ($id) { $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('id', $id); $tdc = $TadDataCenter->getData(); $table = '
'; foreach ($tdc as $title => $signup) { $table .= "
{$title}
"; foreach ($signup as $i => $val) { $table .= "
{$val}
"; } $table .= "
"; } $table .= '
'; } $content = " $head
{$action['title']}
" . _MD_TAD_SIGNUP_ACTION_DATE . _TAD_FOR . "{$action['action_date']}
{$action['detail']}
$table $foot "; return $content; } // 預覽 CSV public static function preview_csv($action_id) { global $xoopsTpl; if (!$_SESSION['can_add']) { redirect_header($_SERVER['PHP_SELF'], 3, _TAD_PERMISSION_DENIED); } $action = Tad_signup_actions::get($action_id); $xoopsTpl->assign('action', $action); // 製作標題 list($head, $type) = self::get_head($action, true, true); $xoopsTpl->assign('head', $head); $xoopsTpl->assign('type', $type); // 抓取內容 $preview_data = []; $handle = fopen($_FILES['csv']['tmp_name'], "r") or die(_MD_TAD_SIGNUP_UNABLE_TO_OPEN); while (($val = fgetcsv($handle, 1000)) !== false) { $preview_data[] = mb_convert_encoding($val, 'UTF-8', 'Big5'); } fclose($handle); $xoopsTpl->assign('preview_data', $preview_data); //加入Token安全機制 include_once $GLOBALS['xoops']->path('class/xoopsformloader.php'); $token = new \XoopsFormHiddenToken(); $token_form = $token->render(); $xoopsTpl->assign("token_form", $token_form); } //批次匯入 CSV public static function import_csv($action_id) { global $xoopsDB, $xoopsUser; //XOOPS表單安全檢查 Utility::xoops_security_check(); if (!$_SESSION['can_add']) { redirect_header($_SERVER['PHP_SELF'], 3, _TAD_PERMISSION_DENIED); } $action_id = (int) $action_id; $uid = $xoopsUser->uid(); $action = Tad_signup_actions::get($action_id); $TadDataCenter = new TadDataCenter('tad_signup'); foreach ($_POST['tdc'] as $tdc) { $sql = "insert into `" . $xoopsDB->prefix("tad_signup_data") . "` ( `action_id`, `uid`, `signup_date`, `accept` ) values( '{$action_id}', '{$uid}', now(), '1' )"; $xoopsDB->queryF($sql) or Utility::web_error($sql, __FILE__, __LINE__); $id = $xoopsDB->getInsertId(); $TadDataCenter->set_col('id', $id); $TadDataCenter->saveCustomData($tdc); $action['signup'] = self::get_all($action_id); if (count($action['signup']) > $action['number']) { $TadDataCenter->set_col('data_id', $id); $TadDataCenter->saveCustomData(['tag' => [_MD_TAD_SIGNUP_CANDIDATE]]); } } } // 預覽 Excel public static function preview_excel($action_id) { global $xoopsTpl; if (!$_SESSION['can_add']) { redirect_header($_SERVER['PHP_SELF'], 3, _TAD_PERMISSION_DENIED); } $action = Tad_signup_actions::get($action_id); $xoopsTpl->assign('action', $action); // 製作標題 list($head, $type) = self::get_head($action, true, true); $xoopsTpl->assign('head', $head); $xoopsTpl->assign('type', $type); // 抓取內容 $preview_data = []; require_once XOOPS_ROOT_PATH . '/modules/tadtools/vendor/phpoffice/phpexcel/Classes/PHPExcel/IOFactory.php'; $reader = \PHPExcel_IOFactory::createReader('Excel2007'); $PHPExcel = $reader->load($_FILES['excel']['tmp_name']); // 檔案名稱 $sheet = $PHPExcel->getSheet(0); // 讀取第一個工作表(編號從 0 開始) $maxCell = $PHPExcel->getActiveSheet()->getHighestRowAndColumn(); $maxColumn = self::getIndex($maxCell['column']); // 一次讀一列 for ($row = 1; $row <= $maxCell['row']; $row++) { // 讀出每一格 for ($column = 0; $column <= $maxColumn; $column++) { $preview_data[$row][$column] = $sheet->getCellByColumnAndRow($column, $row)->getCalculatedValue(); } } $xoopsTpl->assign('preview_data', $preview_data); //加入Token安全機制 include_once $GLOBALS['xoops']->path('class/xoopsformloader.php'); $token = new \XoopsFormHiddenToken(); $token_form = $token->render(); $xoopsTpl->assign("token_form", $token_form); } // 將文字轉為數字 private static function getIndex($let) { // Iterate through each letter, starting at the back to increment the value for ($num = 0, $i = 0; $let != ''; $let = substr($let, 0, -1), $i++) { $num += (ord(substr($let, -1)) - 65) * pow(26, $i); } return $num; } //批次匯入 Excel public static function import_excel($action_id) { self::import_csv($action_id); } //取得報名的標題欄 public static function get_head($action, $return_type = false, $only_tdc = false) { $head_row = explode("\n", $action['setup']); $head = $type = []; foreach ($head_row as $head_data) { $cols = explode(',', $head_data); if (strpos($cols[0], '#') === false) { $head[] = str_replace('*', '', trim($cols[0])); $type[] = trim($cols[1]); } } if (!$only_tdc) { $head[] = _MD_TAD_SIGNUP_ACCEPT; $head[] = _MD_TAD_SIGNUP_APPLY_DATE; $head[] = _MD_TAD_SIGNUP_IDENTITY; } if ($return_type) { return [$head, $type]; } else { return $head; } } //進行pdf的匯出設定 public static function pdf_setup($action_id) { global $xoopsTpl; $action = Tad_signup_actions::get($action_id); $xoopsTpl->assign('action', $action); $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('pdf_setup_id', $action_id); $pdf_setup_col = $TadDataCenter->getData('pdf_setup_col', 0); $to_arr = explode(',', $pdf_setup_col); // 製作標題 $head_arr = self::get_head($action); $from_arr = array_diff($head_arr, $to_arr); $hidden_arr = []; $tmt_box = Tmt::render('pdf_setup_col', $from_arr, $to_arr, $hidden_arr, true, false); $xoopsTpl->assign('tmt_box', $tmt_box); } //儲存pdf的匯出設定 public static function pdf_setup_save($action_id, $pdf_setup_col = '') { $TadDataCenter = new TadDataCenter('tad_signup'); $TadDataCenter->set_col('pdf_setup_id', $action_id); $TadDataCenter->saveCustomData(['pdf_setup_col' => [$pdf_setup_col]]); } } ``` [![](https://www.tad0616.net/uploads/tad_book3/image/48/to_github.png)
link to https://github.com/tadlearn/tad\_signup/commit/6e72592641cf5e7e409ef6a465f12e4894d402a0 \\
](https://github.com/tadlearn/tad_signup/commit/6e72592641cf5e7e409ef6a465f12e4894d402a0)