From 5c19270e9cae4608887bfcb28cb60025befe862b Mon Sep 17 00:00:00 2001 From: Yuan Chiu Date: Mon, 27 Oct 2014 01:13:02 +0800 Subject: [PATCH] =?UTF-8?q?StudyActivity=E9=A1=9E=E5=88=A5=E5=AF=A6?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- htdocs/config.sample.php | 2 +- htdocs/lib/Database/DBStudyActivity.php | 341 ++++++++++++++++++++++++ htdocs/lib/Database/DBTarget.php | 2 +- htdocs/lib/Study/Exception.php | 39 +++ htdocs/lib/Study/StudyActivity.php | 166 ++++++++---- 5 files changed, 494 insertions(+), 56 deletions(-) create mode 100644 htdocs/lib/Database/DBStudyActivity.php create mode 100644 htdocs/lib/Study/Exception.php diff --git a/htdocs/config.sample.php b/htdocs/config.sample.php index 3a56f3a..939646c 100644 --- a/htdocs/config.sample.php +++ b/htdocs/config.sample.php @@ -53,7 +53,7 @@ * * 針對未個別設定過的使用者,採用預設的導引模式 */ - define('LMODE', '0'); + define('LMODE', '1'); /** * 預設教材模式 diff --git a/htdocs/lib/Database/DBStudyActivity.php b/htdocs/lib/Database/DBStudyActivity.php new file mode 100644 index 0000000..4694455 --- /dev/null +++ b/htdocs/lib/Database/DBStudyActivity.php @@ -0,0 +1,341 @@ +insertActivity('yuan', '1', null, null, null, 0, null, true, null); + * // 設定延後 + * $db->setDelay(40, -12); + * + * // 查詢'yuan'的所有活動 + * $data = $db->queryAllActivityByUserId('yuan'); + * echo '
';print_r($data);echo '
'; + * + * @author Yuan Chiu + * @version 2.0.0 + * @package UElearning + * @subpackage Database + */ +class DBStudyActivity extends Database { + + /** + * 建立一個活動 + * + * @param string $userId 使用者ID + * @param string $themeId 主題ID + * @param string $startTime 開始學習時間 + * @param string $endTime 結束學習時間 + * @param int $learnTime 學習所需時間(分) + * @param int $delay 延誤結束時間(分) + * @param int $learnStyle 學習導引模式 + * @param bool $learnStyle_force 拒絕前往非推薦的學習點 + * @param string $materialMode 教材模式 + * @since 2.0.0 + */ + public function insertActivity($userId, $themeId, $startTime, $endTime, + $learnTime, $delay, $learnStyle, $learnStyle_force, $materialMode) + { + + // 自動填入未填的時間 + if(isset($startTime)) + $to_startTime = $this->connDB->quote($startTime); + else $to_startTime = "NOW()"; + + if(isset($endTime)) + $to_endTime = $this->connDB->quote($endTime); + else $to_endTime = "NULL"; + + // 未填入學習時間,將會自動取得主題學習時間 + if(isset($learnTime)) + $to_learnTime = $this->connDB->quote($learnTime); + else $to_learnTime = + "(SELECT `ThLearnTime` FROM `".$this->table('Theme'). + "` WHERE `ThID` = ".$this->connDB->quote($themeId).")"; + + // 未填入學習風格,將會取用使用者偏好的風格,若帳號未設定,將取用系統預設的學習風格 + $queryResult = array(); + if(!isset($learnStyle) || !isset($materialMode)) { + $sqlSUser = "SELECT `LMode`, `MMode` ". + "FROM `".$this->table('User')."` ". + "WHERE `UID`=".$this->connDB->quote($userId); + + $query = $this->connDB->prepare($sqlSUser); + $query->execute(); + + $queryResult = $query->fetch(); + } + if(isset($learnStyle)) + $to_learnStyle = $this->connDB->quote($learnStyle); + else if(isset($queryResult['LMode'])) + $to_learnStyle = $queryResult['LMode']; + else + $to_learnStyle = LMODE; + + if(isset($materialMode)) + $to_materialMode = $this->connDB->quote($materialMode); + else if(isset($queryResult['MMode'])) + $to_materialMode = "'".$queryResult['MMode']."'"; + else + $to_materialMode = "'".MMODE."'"; + + // 寫入學習活動資料 + $sqlString = "INSERT INTO `".$this->table('StudyActivity'). + "` (`UID`, `ThID`, + `StartTime`, `EndTime`, `LearnTime`, `Delay`, + `LMode`, `LModeForce`, `MMode`) + VALUES ( :uid , :thid , + ".$to_startTime.", ".$to_endTime.", ".$to_learnTime." , :delay , + ".$to_learnStyle.", :lstyle_force , ".$to_materialMode.")"; + + + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":uid", $userId); + $query->bindParam(":thid", $themeId); + $query->bindParam(":delay", $delay); + $query->bindParam(":lstyle_force", $learnStyle_force); + $query->execute(); + + // 取得剛剛加入的ID + $sqlString = "SELECT LAST_INSERT_ID()"; + $query = $this->connDB->query($sqlString); + $queryResult = $query->fetch(); + + if(isset($cId)) return $cId; + return $queryResult[0]; + } + + /** + * 移除一場活動 + * @param string $uId 使用者名稱 + * @since 2.0.0 + */ + public function deleteActivity($id) { + + $sqlString = "DELETE FROM ".$this->table('StudyActivity'). + " WHERE `SaID` = :id "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":id", $id); + $query->execute(); + } + + /** + * 內部使用的查詢動作 + * @param string $where 查詢語法 + * @return array 查詢結果陣列 + */ + public function queryActivityByWhere($where) { + + $sqlString = "SELECT `SaID`, `UID`, `ThID`, ". + "`StartTime`, `EndTime`, `LearnTime`, `Delay`, ". + "`LMode`, `LModeForce`, `MMode` ". + "FROM `".$this->table('StudyActivity')."` AS Act ". + //"LEFT JOIN `".$this->table('Area')."` AS Area ". + //"ON Area.`AID` = Target.`AID` ". + "WHERE ".$where; + + $query = $this->connDB->prepare($sqlString); + $query->execute(); + + $queryResultAll = $query->fetchAll(); + // 如果有查到一筆以上 + if( count($queryResultAll) >= 1 ) { + // 製作回傳結果陣列 + $result = array(); + foreach($queryResultAll as $key => $thisResult) { + + array_push($result, + array( 'activity_id' => $thisResult['SaID'], + 'user_id' => $thisResult['UID'], + 'theme_id' => $thisResult['ThID'], + 'start_time' => $thisResult['StartTime'], + 'end_time' => $thisResult['EndTime'], + 'learn_time' => $thisResult['LearnTime'], + 'delay' => $thisResult['Delay'], + 'learnStyle_mode' => $thisResult['LMode'], + 'learnStyle_force' => $thisResult['LModeForce'], + 'material_mode' => $thisResult['MMode']) + ); + } + return $result; + } + // 若都沒查到的話 + else { + return null; + } + } + + + /** + * 查詢一個活動資料 + * + * + * 範例: + * + * require_once __DIR__.'/../config.php'; + * require_once UELEARNING_LIB_ROOT.'/Database/DBTarget.php'; + * use UElearning\Database; + * + * $db = new Database\DBTarget(); + * + * $targetInfo = $db->queryActivity(4); + * echo '
'; print_r($targetInfo); echo '
'; + * + * + * @param int $td 學習活動ID + * @return array 活動資料陣列,格式為: + * array( 'activity_id' => <活動流水編號>, + * 'user_id' => <使用者ID>, + * 'theme_id' => <主題ID>, + * 'start_time' => <開始學習時間>, + * 'end_time' => <結束學習時間>, + * 'learn_time' => <學習所需時間(分)>, + * 'delay' => <延誤結束時間(分)>, + * 'learnStyle_mode' => <學習導引模式>, + * 'learnStyle_force' => <拒絕前往非推薦的學習點>, + * 'material_mode' => <教材模式> + * ); + * + */ + public function queryActivity($id) { + + $queryResultAll = + $this->queryActivityByWhere("`SaID`=".$this->connDB->quote($id)); + + // 如果有查到一筆以上 + if( count($queryResultAll) >= 1 ) { + return $queryResultAll[0]; + } + // 若都沒查到的話 + else { + return null; + } + } + + /** + * 查詢所有活動資料 + * + * @return array 學習活動資料陣列,格式為: + * + * array( + * array( + * 'activity_id' => <活動流水編號>, + * 'user_id' => <使用者ID>, + * 'theme_id' => <主題ID>, + * 'start_time' => <開始學習時間>, + * 'end_time' => <結束學習時間>, + * 'delay' => <延誤結束時間(分)>, + * 'learnStyle_mode' => <學習導引模式>, + * 'learnStyle_force' => <拒絕前往非推薦的學習點>, + * 'material_mode' => <教材模式> + * ) + * ); + * + */ + public function queryAllActivity() { + + return $this->queryActivityByWhere("1"); + } + + /** + * 查詢此使用者所有活動資料 + * + * @param int $user_id 使用者ID + * @return array 學習活動資料陣列,格式為: + * + * array( + * array( + * 'activity_id' => <活動流水編號>, + * 'user_id' => <使用者ID>, + * 'theme_id' => <主題ID>, + * 'start_time' => <開始學習時間>, + * 'end_time' => <結束學習時間>, + * 'delay' => <延誤結束時間(分)>, + * 'learnStyle_mode' => <學習導引模式>, + * 'learnStyle_force' => <拒絕前往非推薦的學習點>, + * 'material_mode' => <教材模式> + * ) + * ); + * + */ + public function queryAllActivityByUserId($user_id) { + + return $this->queryActivityByWhere( + "`UID`=".$this->connDB->quote($user_id)); + } + + /** + * 設定結束時間 + * + * 只要一設定,就代表學習活動結束了 + * @param int $activity_id 活動編號 + * @param string $endTime 時間 + */ + public function setEndTime($activity_id, $endTime) { + $sqlString = "UPDATE ".$this->table('StudyActivity'). + " SET `EndTime` = :value". + " WHERE `SaID` = :id"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(':id', $activity_id); + $query->bindParam(':value', $endTime); + $query->execute(); + } + + /** + * 設定立即結束 + * + * 只要一設定,就代表學習活動結束了 + * @param int $activity_id 活動編號 + */ + public function setEndTimeNow($activity_id) { + $sqlString = "UPDATE ".$this->table('StudyActivity'). + " SET `EndTime` = NOW()". + " WHERE `SaID` = :id"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(':id', $activity_id); + $query->execute(); + } + + /** + * 設定延後時間 + * + * 只要一設定,就代表學習活動結束了 + * @param int $activity_id 活動編號 + * @param int $delay 延後時間(分) + */ + public function setDelay($activity_id, $delay) { + $sqlString = "UPDATE ".$this->table('StudyActivity'). + " SET `Delay` = :value". + " WHERE `SaID` = :id"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(':id', $activity_id); + $query->bindParam(':value', $delay); + $query->execute(); + } +} \ No newline at end of file diff --git a/htdocs/lib/Database/DBTarget.php b/htdocs/lib/Database/DBTarget.php index 37a8e08..0a934d1 100644 --- a/htdocs/lib/Database/DBTarget.php +++ b/htdocs/lib/Database/DBTarget.php @@ -153,7 +153,7 @@ class DBTarget extends Database { * @param string $field 欄位名稱 * @param string $value 內容 */ - function changeTargetData($tId, $field, $value) { + public function changeTargetData($tId, $field, $value) { $sqlField = null; switch($field) { case 'area_id': $sqlField = 'AID'; break; diff --git a/htdocs/lib/Study/Exception.php b/htdocs/lib/Study/Exception.php new file mode 100644 index 0000000..7ea1153 --- /dev/null +++ b/htdocs/lib/Study/Exception.php @@ -0,0 +1,39 @@ +id = $id; + parent::__construct('No Activity: '.$this->id); + } + + /** + * 取得輸入的標的ID + * @return int 標的ID + */ + public function getId() { + return $this->id; + } +} \ No newline at end of file diff --git a/htdocs/lib/Study/StudyActivity.php b/htdocs/lib/Study/StudyActivity.php index a6feb5b..393e371 100644 --- a/htdocs/lib/Study/StudyActivity.php +++ b/htdocs/lib/Study/StudyActivity.php @@ -5,8 +5,9 @@ namespace UElearning\Study; -//require_once UELEARNING_LIB_ROOT.'/Database/DBTarget.php'; -//require_once UELEARNING_LIB_ROOT.'/Target/Exception.php'; +require_once UELEARNING_LIB_ROOT.'/Database/DBStudyActivity.php'; +require_once UELEARNING_LIB_ROOT.'/User/User.php'; +require_once UELEARNING_LIB_ROOT.'/Study/Exception.php'; use UElearning\Database; use UElearning\Exception; use UElearning\User; @@ -43,17 +44,17 @@ class StudyActivity { * @throw UElearning\Exception\AreaNoFoundException * @since 2.0.0 */ - protected function getQuery(){ - // TODO: 從資料庫取得查詢 - //// 從資料庫查詢 - //$db = new Database\DBTarget(); - //$areaInfo = $db->queryArea($this->aId); - // - //// 判斷有沒有這個 - //if( $areaInfo != null ) { - // $this->queryResultArray = $areaInfo; - //} - //else throw new Exception\AreaNoFoundException($this->aId); + protected function getQuery() { + + // 從資料庫查詢 + $db = new Database\DBStudyActivity(); + $info = $db->queryActivity($this->id); + + // 判斷有沒有這個 + if( $info != null ) { + $this->queryResultArray = $info; + } + else throw new Exception\StudyActivityNoFoundException($this->id); } // ======================================================================== @@ -64,40 +65,20 @@ class StudyActivity { * @param int $inputID 學習階段流水號ID * @since 2.0.0 */ - public function __construct($inputID){ - $this->id = $inputAID; + public function __construct($inputID) { + $this->id = $inputID; $this->getQuery(); } // ======================================================================== - // 控制這次學習階段: - - /** - * 設定這次學習時間要延長多久 - * - * @return int 延長時間(分) - * @since 2.0.0 - */ - public function setDelay(){ - //return $this->queryResultArray['name']; - } - - /** - * 設定累加這次學習時間要延長多久 - * - * @return int 延長時間(分) - * @since 2.0.0 - */ - public function addDelay(){ - //return $this->queryResultArray['name']; - } + // 控制這次學習階段時間: /** * 結束這次學習 * * @since 2.0.0 */ - public function finishActivity(){ + public function finishActivity() { //return $this->queryResultArray['name']; } @@ -106,10 +87,32 @@ class StudyActivity { * * @since 2.0.0 */ - public function cancelActivity(){ + public function cancelActivity() { //return $this->queryResultArray['name']; } + // ======================================================================== + + /** + * 取得已經學過幾個學習點 + * + * @return ing 已學過幾個學習點 + * @since 2.0.0 + */ + public function getLearnedPointTotal() { + + } + + /** + * 取得還剩下幾個學習點還沒學 + * + * @return ing 還剩下幾個學習點 + * @since 2.0.0 + */ + public function getRemainingPointTotal() { + + } + // ======================================================================== // 取得資料: @@ -119,7 +122,7 @@ class StudyActivity { * @return int 學習階段流水號ID * @since 2.0.0 */ - public function getId(){ + public function getId() { return $this->id; } @@ -129,7 +132,7 @@ class StudyActivity { * @return \UElearning\User\User 使用者物件 * @since 2.0.0 */ - public function getUser(){ + public function getUser() { $userId = $this->queryResultArray['user_id'];; return new User\User($userId); @@ -141,7 +144,7 @@ class StudyActivity { * @return string 使用者ID * @since 2.0.0 */ - public function getUserId(){ + public function getUserId() { return $this->queryResultArray['user_id']; } @@ -151,7 +154,7 @@ class StudyActivity { // * @return int 主題物件 // * @since 2.0.0 // */ - //public function getTheme(){ + //public function getTheme() { // $tId = $this->queryResultArray['theme_id']; // return new Target\User($userId);; //} @@ -162,18 +165,21 @@ class StudyActivity { * @return int 主題ID * @since 2.0.0 */ - public function getThemeId(){ + public function getThemeId() { return $this->queryResultArray['theme_id']; } + // ------------------------------------------------------------------------ + // 時間控制: + /** * 取得這次學習是什麼時候開始的 * * @return string 開始學習時間 * @since 2.0.0 */ - public function getStartTime(){ - //return $this->queryResultArray['build_time']; + public function getStartTime() { + return $this->queryResultArray['start_time']; } /** @@ -182,8 +188,8 @@ class StudyActivity { * @return string 結束學習時間 * @since 2.0.0 */ - public function getEndTime(){ - //return $this->queryResultArray['build_time']; + public function getEndTime() { + return $this->queryResultArray['end_time']; } /** @@ -192,27 +198,79 @@ class StudyActivity { * @return int 所需學習時間(分) * @since 2.0.0 */ - public function getLearnTime(){ - //return $this->queryResultArray['name']; + public function getLearnTime() { + return $this->queryResultArray['learn_time']; } + /** + * 取得這次學習還剩下多少學習時間 + * + * @return int 剩下的學習時間(分) + * @since 2.0.0 + */ + public function getRemainingTime() { + + // TODO: 取得這次學習還剩下多少學習時間 + + // 計算總共學習時間(包含延長時間) + $haveTime = $this->getLearnTime() - $this->getDelay(); + + // 取得現在時間 + // 開始時間+學習時間 = 應結束時間 + + // 應結束時間-現在時間 = 剩餘時間 + } + /** * 取得這次學習時間要延長多久 * * @return int 延長時間(分) * @since 2.0.0 */ - public function getDelay(){ - //return $this->queryResultArray['name']; + public function getDelay() { + return $this->queryResultArray['delay']; } + /** + * 設定這次學習時間要延長多久 + * + * @param int $minute 延長時間(分) + * @since 2.0.0 + */ + public function setDelay($minute) { + $db = new Database\DBStudyActivity(); + $db->setDelay($this->id, $minute); + + $this->getQuery(); + } + + /** + * 設定累加這次學習時間要延長多久 + * + * @param int $minute 延長時間(分) + * @since 2.0.0 + */ + public function addDelay($minute) { + + $setMinute = $this->queryResultArray['delay'] + $minute; + + $db = new Database\DBStudyActivity(); + $db->setDelay($this->id, $setMinute); + + // TODO: 防呆-不能設的比開始時間還早 + + $this->getQuery(); + } + + // ------------------------------------------------------------------------ + /** * 取得這次學習的導引風格 * * @return int 將推薦幾個學習點 * @since 2.0.0 */ - public function getLearnStyle(){ + public function getLearnStyle() { return $this->queryResultArray['learnStyle_mode']; } @@ -222,7 +280,7 @@ class StudyActivity { * @return bool 是否拒絕前往非推薦的學習點 * @since 2.0.0 */ - public function isForceLearnStyle(){ + public function isForceLearnStyle() { return $this->queryResultArray['learnStyle_force']; } @@ -232,7 +290,7 @@ class StudyActivity { * @return string 教材風格 * @since 2.0.0 */ - public function getMaterialStyle(){ + public function getMaterialStyle() { return $this->queryResultArray['material_mode']; }