diff --git a/htdocs/api/v2/index.php b/htdocs/api/v2/index.php index b08ca5e..4c77333 100644 --- a/htdocs/api/v2/index.php +++ b/htdocs/api/v2/index.php @@ -7,6 +7,7 @@ require_once UELEARNING_LIB_ROOT.'/User/UserSession.php'; require_once UELEARNING_LIB_ROOT.'/User/UserAdmin.php'; require_once UELEARNING_LIB_ROOT.'/Study/StudyActivity.php'; require_once UELEARNING_LIB_ROOT.'/Study/StudyActivityManager.php'; +require_once UELEARNING_LIB_ROOT.'/Study/StudyManager.php'; require_once UELEARNING_LIB_ROOT.'/Target/Target.php'; require_once UELEARNING_LIB_ROOT.'/Target/TargetManager.php'; use UElearning\User; @@ -78,10 +79,14 @@ function login($user_id = null) { $user = $session->getUser($loginToken); $sessionInfo = $session->getTokenInfo($loginToken); + //取得現在時間,用字串的形式 + $nowDate = date("Y-m-d H:i:s"); + + // 輸出結果 $app->render(201,array( - 'user_id' => $user_id, - 'token' => $loginToken, - 'browser' => $browser, + 'user_id' => $user_id, + 'token' => $loginToken, + 'browser' => $browser, 'user' => array( 'id' => $user->getId(), 'user_id' => $user->getId(), @@ -100,10 +105,11 @@ function login($user_id = null) { 'email' => $user->getEmail(), 'memo' => $user->getMemo(), ), - 'login_time' => $sessionInfo['login_date'], - 'error' => false, - 'msg' => '\''.$user_id.'\' is logined', - 'msg_cht' => '\''.$user_id.'\'使用者已登入' + 'login_time' => $sessionInfo['login_date'], + 'current_time' => $nowDate, + 'error' => false, + 'msg' => '\''.$user_id.'\' is logined', + 'msg_cht' => '\''.$user_id.'\'使用者已登入' )); } catch (Exception\UserNoFoundException $e) { @@ -849,6 +855,231 @@ $app->group('/tokens', 'APIrequest', function () use ($app, $app_template) { } }); + /* + * 取得此標的資料 + * GET http://localhost/api/v2/tokens/{登入Token}/activitys/{學習中活動編號}/points/{標的編號} + */ + $app->get('/:token/activitys/:said/points/:tid', function ($token, $saId, $tId) use ($app) { + + try { + // 查詢使用者 + $session = new User\UserSession(); + $user_id = $session->getUserId($token); + + // 取得開始後的學習活動資訊 + $sact = new Study\StudyActivity($saId); + + // 確認此學習活動是否為本人所有 + if($sact->getUserId() == $user_id) { + + // 取得此活動的主題 + $thid = $sact->getThemeId(); + + // 取得本次採用的教材風格 + $materialMode = $sact->getMaterialStyle(); + + // 取得主題內所有的標的資訊 + $target = new Target\Target($thid); + $materialUrl = $target->getMaterialUrl(true, $materialMode); + $virtualMaterialUrl = $target->getMaterialUrl(false, $materialMode); + + // 處理噴出結果 + $output_targets = array( + 'theme_id' => $thid, + 'target_id' => $target->getId(), + 'hall_id' => $target->getHallId(), + //'hall_name' => $thisTargetArray['hall_name'], + 'area_id' => $target->getAreaId(), + //'area_name' => $thisTargetArray['area_name'], + //'floor' => $thisTargetArray['floor'], + //'area_number' => $thisTargetArray['area_number'], + 'target_number' => $target->getNumber(), + 'name' => $target->getName(), + 'map_url' => $target->getMapUrl(), + 'material_url' => $materialUrl, + 'virtual_material_url' => $virtualMaterialUrl, + 'learn_time' => $target->getLearnTime(), + 'PLj' => $target->getPLj(), + 'Mj' => $target->getMj(), + 'S' => $target->getS(), + 'Fj' => $target->getFj() + ); + + // 噴出結果 + $app->render(200,array( + 'token' => $token, + 'user_id' => $user_id, + 'activity_id' => $sact->getId(), + 'target' => $output_targets, + 'error' => false + )); + + } + // 若非本人所有,則視同無此活動 + else { + throw new Exception\StudyActivityNoFoundException($saId); + } + + } + catch (Exception\LoginTokenNoFoundException $e) { + $app->render(401,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No \''.$token.'\' session. Please login again.', + 'msg_cht' => '沒有\''.$token.'\'登入階段,請重新登入', + 'substatus' => 204 + )); + } + catch (Exception\StudyActivityNoFoundException $e) { + $app->render(404,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No found this activity.', + 'msg_cht' => '沒有此學習活動' + )); + } + }); + + + /* + * 進入此學習點 + * POST http://localhost/api/v2/tokens/{登入Token}/activitys/{學習中活動編號}/points/{標的編號}/toin + */ + $app->post('/:token/activitys/:said/points/:tid/toin', function ($token, $saId, $tId) use ($app) { + + // 取得帶來的參數 + $cType = $app->request->getContentType(); + if($cType == 'application/x-www-form-urlencoded') { + $is_entity = isset($_POST['is_entity']) ? $_POST['is_entity'] : true; + } + else /*if($cType == 'application/json')*/ { + $postData = $app->request->getBody(); + $postDataArray = json_decode($postData); + $is_entity = isset($postDataArray->is_entity) + ? $postDataArray->is_entity : true; + } + /*else { + $app->render(400, array( + 'Content-Type'=> $cType, + 'error' => true, + 'msg' => '', + 'msg_cht' => '輸入參數的Content-Type不在支援範圍內 或是沒有輸入', + 'substatus' => 102 + ) + ); + }*/ + + try { + // 查詢使用者 + $session = new User\UserSession(); + $user_id = $session->getUserId($token); + + // 取得開始後的學習活動資訊 + $sact = new Study\StudyActivity($saId); + + // 確認此學習活動是否為本人所有 + if($sact->getUserId() == $user_id) { + + // 進入學習點 + try{ + $sid = $sact->toInTarget($tId, $is_entity); + } + // 若狀態為正在標的內學習時,強制當成離開標的,重新進入 + catch (Exception\InLearningException $e) { + $sact->toOutTarget($tId); + $sid = $sact->toInTarget($tId, $is_entity); + } + + // 噴出結果 + $app->render(200,array( + 'token' => $token, + 'user_id' => $user_id, + 'activity_id' => $sact->getId(), + 'study_id' => $sid, + 'error' => false + )); + + } + // 若非本人所有,則視同無此活動 + else { + throw new Exception\StudyActivityNoFoundException($saId); + } + + } + catch (Exception\LoginTokenNoFoundException $e) { + $app->render(401,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No \''.$token.'\' session. Please login again.', + 'msg_cht' => '沒有\''.$token.'\'登入階段,請重新登入', + 'substatus' => 204 + )); + } + catch (Exception\StudyActivityNoFoundException $e) { + $app->render(404,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No found this activity.', + 'msg_cht' => '沒有此學習活動' + )); + } + + }); + + /* + * 進入此學習點 + * POST http://localhost/api/v2/tokens/{登入Token}/activitys/{學習中活動編號}/points/{標的編號}/toout + */ + $app->post('/:token/activitys/:said/points/:tid/toout', function ($token, $saId, $tId) use ($app) { + + try { + // 查詢使用者 + $session = new User\UserSession(); + $user_id = $session->getUserId($token); + + // 取得開始後的學習活動資訊 + $sact = new Study\StudyActivity($saId); + + // 確認此學習活動是否為本人所有 + if($sact->getUserId() == $user_id) { + + // 離開學習點 + $sact->toOutTarget($tId); + + // 噴出結果 + $app->render(201,array( + 'token' => $token, + 'user_id' => $user_id, + 'activity_id' => $sact->getId(), + 'error' => false + )); + + } + // 若非本人所有,則視同無此活動 + else { + throw new Exception\StudyActivityNoFoundException($saId); + } + + } + catch (Exception\LoginTokenNoFoundException $e) { + $app->render(401,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No \''.$token.'\' session. Please login again.', + 'msg_cht' => '沒有\''.$token.'\'登入階段,請重新登入', + 'substatus' => 204 + )); + } + catch (Exception\StudyActivityNoFoundException $e) { + $app->render(404,array( + 'token' => $token, + 'error' => true, + 'msg' => 'No found this activity.', + 'msg_cht' => '沒有此學習活動' + )); + } + + }); }); // ============================================================================ @@ -873,9 +1104,14 @@ else { // API首頁 $app->get('/', 'APIrequest', function () use ($app) { + + //取得現在時間,用字串的形式 + $nowDate = date("Y-m-d H:i:s"); + $app->render(200, array( 'title' => '', 'version' => '2.0', + 'current_time' => $nowDate, 'error' => false, )); }); diff --git a/htdocs/lib/Database/DBRecommand.php b/htdocs/lib/Database/DBRecommand.php index b01061d..043a28d 100644 --- a/htdocs/lib/Database/DBRecommand.php +++ b/htdocs/lib/Database/DBRecommand.php @@ -21,9 +21,10 @@ class DBRecommand extends Database * @param string $where SQL WHERE子句 * @return array 查詢結果 */ - protected function queryEdgeByWhere($where) - { - $sqlString = "SELECT DISTINCT ".$this->table('Edge').".Ti, ".$this->table('Edge').".Tj, ".$this->table('Edge').".MoveTime". + + protected function queryEdgeByWhere($where) + { + $sqlString = "SELECT DISTINCT ".$this->table('Edge').".Ti, ".$this->table('Edge').".Tj, ".$this->table('Edge').".MoveTime". " FROM ".$this->table('Edge')." WHERE ".$where; $query = $this->connDB->prepare($sqlString); $query->execute(); @@ -44,11 +45,16 @@ class DBRecommand extends Database return $result; } else return null; - } + } + /** + * 內部查詢用 + * @param string $where SQL WHERE子句 + * @return array 查詢結果 + */ protected function queryBelongByWhere($where) { - $sqlString = "SELECT ".$this->table('tbelong').".Weights FROM ".$this->table('tbelong')." WHERE ".$where; + $sqlString = "SELECT ".$this->table('TBelong').".Weights FROM ".$this->table('TBelong')." WHERE ".$where; $query = $this->connDB->prepare($sqlString); $query->execute(); @@ -66,19 +72,29 @@ class DBRecommand extends Database else return null; } + /** + * 以下一個學習點和主題編號查詢屬於的權重資料 + * @param string $next_point 下一個學習點編號 + * @return array 查詢結果 + */ public function queryBelongByID($next_point,$theme_number) { - $whereClause = $this->table('tbelong').".thID = ".$this->connDB->quote($theme_number)." AND ".$this->table('tbelong').".TID = ".$this->connDB->quote($next_point); + $whereClause = $this->table('TBelong').".ThID = ".$this->connDB->quote($theme_number)." AND ".$this->table('TBelong').".TID = ".$this->connDB->quote($next_point); $AllOfResult = $this->queryBelongByWhere($whereClause); - if(count($AllOfResult) != 0) return $AllOfResult; + if(count($AllOfResult) != 0) return $AllOfResult[0]; else return null; } - + /** + * 以目前的學習點編號查詢下一個學習點的資訊 + * @param string $currentPoint 目前的學習點編號 + * @return array 查詢結果 + */ public function queryEdgeByID($currentPoint) { - $AllOfResult = $this->queryBelongByWhere("Ti = ".$this->connDB->quote($currentPoint)); + //echo "EEEEEEEEE"; + $AllOfResult = $this->queryEdgeByWhere($this->table('Edge').".Ti = ".$this->connDB->quote($currentPoint)); if(count($AllOfResult) != 0) return $AllOfResult; else return null; } diff --git a/htdocs/lib/Database/DBStudy.php b/htdocs/lib/Database/DBStudy.php new file mode 100644 index 0000000..ad10220 --- /dev/null +++ b/htdocs/lib/Database/DBStudy.php @@ -0,0 +1,391 @@ +queryAllStudyByUserId('yuan'); + * echo '
';print_r($data);echo '
'; + * + * @author Yuan Chiu + * @version 2.0.0 + * @package UElearning + * @subpackage Database + */ +class DBStudy extends Database { + + /** + * 內部使用的查詢動作 + * @param string $where 查詢語法 + * @return array 查詢結果陣列 + */ + protected function queryByWhere($where) { + + $sqlString = "SELECT `SID`, `SaID`, ". + "`TID`, `IsEntity`, `In_TargetTime`, `Out_TargetTime` ". + "FROM `".$this->table('Study')."` ". + "WHERE ".$where; + + $query = $this->connDB->prepare($sqlString); + $query->execute(); + + $queryResultAll = $query->fetchAll(); + // 如果有查到一筆以上 + if( count($queryResultAll) >= 1 ) { + // 製作回傳結果陣列 + $result = array(); + foreach($queryResultAll as $key => $thisResult) { + + if($thisResult['IsEntity'] != '0') { + $output_entity = true; + } + else { $output_entity = false; } + + array_push($result, + array( 'study_id' => (int)$thisResult['SID'], + 'activity_id' => (int)$thisResult['SaID'], + 'target_id' => (int)$thisResult['TID'], + 'is_entity' => $output_entity, + 'in_target_time' => $thisResult['In_TargetTime'], + 'out_target_time' => $thisResult['Out_TargetTime'] + ) + ); + } + return $result; + } + // 若都沒查到的話 + else { + return null; + } + } + + /** + * 以活動編號查詢所有進出標的資料 + * + * @return array 進出標的資料陣列,格式為: + * + * array( + * array( + * 'study_id' => <流水編號>, + * 'activity_id' => <活動編號>, + * 'target_id' => <標的編號>, + * 'is_entity' => <是否為現場學習>, + * 'in_target_time' => <進入時間>, + * 'out_target_time' => <離開時間> + * ) + * ); + * + */ + public function queryById($id) { + $queryResultAll = $this->queryByWhere("`SID`=".$this->connDB->quote($id)); + + // 如果有查到一筆以上 + if( count($queryResultAll) >= 1 ) { + return $queryResultAll[0]; + } + // 若都沒查到的話 + else { + return null; + } + } + + /** + * 以活動編號查詢所有進出標的資料 + * + * @return array 進出標的資料陣列,格式為: + * + * array( + * array( + * 'study_id' => <流水編號>, + * 'activity_id' => <活動編號>, + * 'target_id' => <標的編號>, + * 'is_entity' => <是否為現場學習>, + * 'in_target_time' => <進入時間>, + * 'out_target_time' => <離開時間> + * ) + * ); + * + */ + public function queryByActivityId($id) { + + return $this->queryByWhere("`SID`=".$this->connDB->quote($id)); + } + + /** + * 查詢所有進出標的資料 + * + * @return array 進出標的資料陣列,格式為: + * + * array( + * array( + * 'study_id' => <流水編號>, + * 'activity_id' => <活動編號>, + * 'target_id' => <標的編號>, + * 'is_entity' => <是否為現場學習>, + * 'in_target_time' => <進入時間>, + * 'out_target_time' => <離開時間> + * ) + * ); + * + */ + public function queryAll() { + + return $this->queryByWhere("1"); + } + + /** + * 建立學習點進出記錄 + * + * @param string $activity_id 活動編號 + * @param string $target_id 標的編號 + * @param string $is_entity 是否為現場學習 + * @param int $in_target_time 進入時間 + * @param int $out_target_time 離開時間 + * + * @return int 剛新增的記錄編號 + * @since 2.0.0 + */ + public function insert($activity_id, $target_id, + $is_entity, $in_target_time, $out_target_time) + { + + if(!isset($is_entity)) { + $is_entity = true; + } + + // 寫入 + $sqlString = "INSERT INTO `".$this->table('Study'). + "` (`SaID`, `TID`, `IsEntity`, `In_TargetTime`, `Out_TargetTime`) + VALUES ( :said , :tid , :entity , :intime , :outtime )"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":said", $activity_id); + $query->bindParam(":tid", $target_id); + $query->bindParam(":entity", $is_entity); + $query->bindParam(":intime", $in_target_time); + $query->bindParam(":outtime", $out_target_time); + $query->execute(); + + // 取得剛剛加入的ID + $sqlString = "SELECT LAST_INSERT_ID()"; + $query = $this->connDB->query($sqlString); + $queryResult = $query->fetch(); + $resultId = $queryResult[0]; + + return $resultId; + } + + /** + * 移除一筆進出標的資料 + * @param int $id 進出標的編號 + * @since 2.0.0 + */ + public function delete($id) { + + $sqlString = "DELETE FROM ".$this->table('Study'). + " WHERE `SID` = :id "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":id", $id); + $query->execute(); + } + + /** + * 移除此學習活動的所有進出標的資料 + * @param int $id 學習活動編號 + * @since 2.0.0 + */ + public function deleteByActivityId($id) { + + $sqlString = "DELETE FROM ".$this->table('Study'). + " WHERE `SaID` = :id "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":id", $id); + $query->execute(); + } + + /** + * 進入學習點 + * + * @param string $activity_id 活動編號 + * @param string $target_id 標的編號 + * @param string $is_entity 是否為現場學習 + * @return int 剛新增的記錄編號 + * @since 2.0.0 + */ + public function toInTaeget($activity_id, $target_id, $is_entity) + { + + if(!isset($is_entity)) { + $is_entity = true; + } + + // 寫入 + $sqlString = "INSERT INTO `".$this->table('Study'). + "` (`SaID`, `TID`, `IsEntity`, `In_TargetTime`, `Out_TargetTime`) + VALUES ( :said , :tid , :entity , NOW() , NULL )"; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":said", $activity_id); + $query->bindParam(":tid", $target_id); + $query->bindParam(":entity", $is_entity); + $query->execute(); + + // 取得剛剛加入的ID + $sqlString = "SELECT LAST_INSERT_ID()"; + $query = $this->connDB->query($sqlString); + $queryResult = $query->fetch(); + $resultId = $queryResult[0]; + + return $resultId; + } + + /** + * 離開學習點 + * + * @param string $study_id 此記錄編號 + * @since 2.0.0 + */ + public function toOutTaeget($study_id) + { + + // 寫入 + $sqlString = "UPDATE `".$this->table('Study'). + "` SET `Out_TargetTime` = NOW() + WHERE `SID` = :id "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":id", $study_id); + $query->execute(); + } + + /** + * 此活動內離開所有學習點 + * + * @param string $activity_id 活動編號 + * @since 2.0.0 + */ + public function allToOutTaeget($activity_id) + { + + // 寫入 + $sqlString = "UPDATE `".$this->table('Study'). + "` SET `Out_TargetTime` = NOW() + WHERE `SaID` = :id "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":id", $activity_id); + $query->execute(); + } + + /** + * 取得目前正在進行的標的編號 + * + * @param int $activity_id 活動編號 + * @return int 標的編號 + * @since 2.0.0 + */ + public function getCurrentInTargetId($activity_id) { + + $sqlString = "SELECT `TID` FROM `".$this->table('Study')."` ". + "WHERE `Out_TargetTime` IS NULL AND `SaID` = :said "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":said", $activity_id); + $query->execute(); + + $queryResult = $query->fetch(); + // 如果有查到一筆以上 + if( count($queryResult) >= 1 ) { + return (int)$queryResult[0]; + } + else { + return null; + } + } + + /** + * 取得目前正在進行的紀錄編號 + * + * @param int $activity_id 活動編號 + * @return int 進出紀錄編號 + * @since 2.0.0 + */ + public function getCurrentInStudyId($activity_id) { + + $sqlString = "SELECT `SID` FROM `".$this->table('Study')."` ". + "WHERE `Out_TargetTime` IS NULL AND `SaID` = :said "; + + $query = $this->connDB->prepare($sqlString); + $query->bindParam(":said", $activity_id); + $query->execute(); + + $queryResult = $query->fetch(); + // 如果有查到一筆以上 + if( count($queryResult) >= 1 ) { + return (int)$queryResult[0]; + } + else { + return null; + } + } + + /** + * 取得所有在此標的的記錄編號 + * + * 正常來說只會有一個,但考量使用者可能在這次活動內同一標的進出兩次以上,故還是以二維陣列輸出。 + * + * @param int $activity_id 活動編號 + * @param int $target_id 標的編號 + * @return array 所有進出記錄資訊陣列 + * @since 2.0.0 + */ + public function getAllStudyIdByTargetId($activity_id, $target_id) { + + $queryResultAll = $this->queryByWhere( + "`TID` = ".$this->connDB->quote($target_id). + " AND `SaID` = ".$this->connDB->quote($activity_id)); + + return $queryResultAll; + } + + /** + * 取得在此標學習中的記錄編號 + * + * 正常來說只會有一個,但考量使用者可能在這次活動內同一標的進出兩次以上,故還是以陣列輸出。 + * + * @param int $activity_id 活動編號 + * @param int $target_id 標的編號 + * @return array 所有進出記錄資訊陣列 + * @since 2.0.0 + */ + public function getInStudyIdByTargetId($activity_id, $target_id) { + + $queryResultAll = $this->queryByWhere( + "`TID` = ".$this->connDB->quote($target_id). + " AND `SaID` = ".$this->connDB->quote($activity_id). + " AND `Out_TargetTime` IS NULL"); + + return $queryResultAll; + } +} diff --git a/htdocs/lib/Database/DBStudyActivity.php b/htdocs/lib/Database/DBStudyActivity.php index 9757ba3..c6bd534 100644 --- a/htdocs/lib/Database/DBStudyActivity.php +++ b/htdocs/lib/Database/DBStudyActivity.php @@ -54,6 +54,8 @@ class DBStudyActivity extends Database { * @param bool $learnStyle_force 拒絕前往非推薦的學習點 * @param bool $enable_virtual 是否啟用虛擬教材 * @param string $materialMode 教材模式 + * + * @return int 剛新增的活動編號 * @since 2.0.0 */ public function insertActivity($userId, $themeId, $startTime, $endTime, @@ -408,6 +410,8 @@ class DBStudyActivity extends Database { * @param bool $enable_virtual 是否啟用虛擬教材 * @param string $materialMode 教材模式 * @param string $isLock 是否鎖定不讓學生更改 + * + * @return int 剛新增的活動編號 * @since 2.0.0 */ public function insertWillActivity($userId, $themeId, $startTime, $expiredTime, diff --git a/htdocs/lib/Recommand/RecommandPoint.php b/htdocs/lib/Recommand/RecommandPoint.php index 0e297c7..df903e5 100644 --- a/htdocs/lib/Recommand/RecommandPoint.php +++ b/htdocs/lib/Recommand/RecommandPoint.php @@ -1,57 +1,87 @@ recommand = new Database\DBRecommand(); + } + + /** + * 計算正規化參數 + * @return double 正規化參數 + */ + private function computeNormalizationParameter($theme_number) + { + $normal = 0; //正規化之後的GAMMA值 + $EntitySum = 0; //實體學習點分別算銓重之後的值 + $VirtualSum = 0; //虛擬學習點分別算銓重之後的值 + + $edge = $this->recommand->queryEdgeByID('0'); + $theme = new Study\Theme($theme_number); + + for($i=0;$irecommand->queryBelongByID($next_point,$theme->getId()); + $weight = $belong["weight"]; + + $VirtualSum += $weight / $next_target->getLearnTime(); + + if($next_target->isNumberOfPeopleZero()) $Rj = 0; + else $Rj = $next_target->getMj() / $next_target->getPLj(); + + $EntitySum += $weight * ($next_target->getS() - $Rj + 1) / ($move_time + $next_target->getLearnTime()); + } + return $EntitySum/$VirtualSum; + } + + /** + * 推薦學習點 + * @return array 學習點清單 + */ + public function recommand($current_point,$theme_number,$activity_number) + { + + } +} diff --git a/htdocs/lib/Study/Exception.php b/htdocs/lib/Study/Exception.php index 01afc55..3a9e501 100644 --- a/htdocs/lib/Study/Exception.php +++ b/htdocs/lib/Study/Exception.php @@ -7,6 +7,54 @@ namespace UElearning\Exception; // TODO: 將以下類別濃縮 +/** + * 沒有找到此標的進出記錄 + * @since 2.0.0 + * @package UElearning + * @subpackage Study + */ +class StudyNoFoundException extends \UnexpectedValueException { + /** + * 指定的學習活動ID + * @type int + */ + private $id; + + /** + * 使用者帳號例外 + * @param int $id 輸入的標的ID + */ + public function __construct($id) { + $this->id = $id; + parent::__construct('No Study: '.$this->id); + } + + /** + * 取得輸入的標的ID + * @return int 標的ID + */ + public function getId() { + return $this->id; + } +} + +/** + * 正在學習中例外(難道使用者有分身?) + * @since 2.0.0 + * @package UElearning + * @subpackage Study + */ +class InLearningException extends \UnexpectedValueException { + + /** + * 使用者帳號例外 + * @param int $id 輸入的標的ID + */ + public function __construct() { + parent::__construct('Learning'); + } +} + /** * 沒有找到此活動 * @since 2.0.0 diff --git a/htdocs/lib/Study/Study.php b/htdocs/lib/Study/Study.php index e69de29..25405f2 100644 --- a/htdocs/lib/Study/Study.php +++ b/htdocs/lib/Study/Study.php @@ -0,0 +1,179 @@ +getQuery() 抓取資料表中所有資訊,並放在此陣列裡 + * @type array + */ + protected $queryResultArray; + + /** + * 從資料庫取得查詢 + * + * @throw \UElearning\Exception\ThemeNoFoundException + * @since 2.0.0 + */ + protected function getQuery(){ + + // 從資料庫查詢 + $db = new Database\DBStudy(); + $info = $db->queryById($this->id); + + // 判斷有沒有這個 + if( $info != null ) { + $this->queryResultArray = $info; + } + else throw new Exception\StudyNoFoundException($this->id); + } + + // ======================================================================== + + /** + * 建構子 + * + * @param int $inputTID 主題ID + * @since 2.0.0 + */ + public function __construct($inputID){ + $this->id = $inputID; + $this->getQuery(); + } + + // ======================================================================== + + /** + * 取得本進出記錄編號 + * + * @return int 進出記錄編號 + * @since 2.0.0 + */ + public function getId(){ + return $this->id; + } + + /** + * 取得本次活動編號 + * + * @return int 學習活動編號 + * @since 2.0.0 + */ + public function getActivityId(){ + return $this->queryResultArray['activity_id']; + } + + /** + * 取得標的編號 + * + * @return int 標的編號 + * @since 2.0.0 + */ + public function getTargetId(){ + return $this->queryResultArray['target_id']; + } + +// /** +// * 取得標的名稱 +// * +// * @return int 標的名稱 +// * @since 2.0.0 +// */ +// public function getTargetName(){ +// return $this->queryResultArray['target_id']; +// } + +// /** +// * 取得此紀錄的使用者ID +// * +// * @return string 使用者ID +// * @since 2.0.0 +// */ +// public function getUserId(){ +// return $this->queryResultArray['target_id']; +// } + + /** + * 是否為實體(實際抵達學習點) + * + * @return bool 是否為實體 + * @since 2.0.0 + */ + public function isEntity(){ + return $this->queryResultArray['is_entity']; + } + + /** + * 取得進入學習點時間 + * + * @return string 進入學習點時間 + * @since 2.0.0 + */ + public function isIn(){ + // TODO: 尚未測試 + if($this->queryResultArray['out_target_time'] == null) { + return true; + } + else { + return false; + } + } + + /** + * 取得進入學習點時間 + * + * @return string 進入學習點時間 + * @since 2.0.0 + */ + public function getInTime(){ + return $this->queryResultArray['in_target_time']; + } + + /** + * 取得離開學習點時間 + * + * @return string 離開學習點時間 + * @since 2.0.0 + */ + public function getOutTime(){ + return $this->queryResultArray['out_target_time']; + } + + /** + * 離開學習點 + * + * @since 2.0.0 + */ + public function toOut() { + $db = new Database\DBStudy(); + $db->toOutTaeget($this->id); + } +} diff --git a/htdocs/lib/Study/StudyActivity.php b/htdocs/lib/Study/StudyActivity.php index 549bd1b..d4effd3 100644 --- a/htdocs/lib/Study/StudyActivity.php +++ b/htdocs/lib/Study/StudyActivity.php @@ -8,6 +8,7 @@ namespace UElearning\Study; require_once UELEARNING_LIB_ROOT.'/Database/DBStudyActivity.php'; require_once UELEARNING_LIB_ROOT.'/User/User.php'; require_once UELEARNING_LIB_ROOT.'/Study/Theme.php'; +require_once UELEARNING_LIB_ROOT.'/Study/StudyManager.php'; require_once UELEARNING_LIB_ROOT.'/Study/Exception.php'; use UElearning\Database; use UElearning\Exception; @@ -422,4 +423,61 @@ class StudyActivity { return $this->queryResultArray['material_mode']; } + // ======================================================================== + + /** + * 此標的是否已學習過 + * + * @param string $target_id 標的編號 + * @return bool 是否已學習過 + */ + public function isTargetLearned($target_id) { + + // 活動編號 + $saId = $this->id; + + $sct = new StudyManager(); + return $sct->isTargetLearned($saId, $target_id); + } + + /** + * 進入標的 + * + * @param int $target_id 標的編號 + * @param bool $is_entity 是否為現場學習 + * @throw UElearning\Exception\InLearningException + * return int 進出紀錄編號 + */ + public function toInTarget($target_id, $is_entity) { + + // 活動編號 + $saId = $this->id; + + $sct = new StudyManager(); + // 進入學習點 + try{ + return $sct->toInTarget($saId, $target_id, $is_entity); + } + // 若狀態為正在標的內學習時,強制當成離開標的,重新進入 + catch (Exception\InLearningException $e) { + throw $e; + } + + } + + /** + * 離開標的 + * + * @param int $target_id 標的編號 + */ + public function toOutTarget($target_id) { + + // 活動編號 + $saId = $this->id; + + $sct = new StudyManager(); + // 離開學習點 + $sct->toOutTarget($saId, $target_id); + } + } diff --git a/htdocs/lib/Study/StudyManager.php b/htdocs/lib/Study/StudyManager.php new file mode 100644 index 0000000..a1051c1 --- /dev/null +++ b/htdocs/lib/Study/StudyManager.php @@ -0,0 +1,105 @@ +getCurrentInTargetId($activity_id); + } + + /** + * 取得目前已進入的學習點的進出紀錄物件 + * @param string $activity_id 活動編號 + * @return int 進出紀錄編號 + */ + public function getCurrentInStudyId($activity_id) { + + $db = new Database\DBStudy(); + return $db->getCurrentInStudyId($activity_id); + } + + /** + * 此標的是否已學習過 + * + * @param int $activity_id 活動編號 + * @param string $target_id 標的編號 + * @return bool 是否已學習過 + */ + public function isTargetLearned($activity_id, $target_id) { + + $db = new Database\DBStudy(); + $query = $db->getAllStudyIdByTargetId($activity_id, $target_id); + if(count($query) > 0) { + return true; + } + else { + return false; + } + } + + /** + * 進入標的 + * + * @param int $activity_id 活動編號 + * @param int $target_id 標的編號 + * @param bool $is_entity 是否為現場學習 + * return int 進出紀錄編號 + */ + public function toInTarget($activity_id, $target_id, $is_entity) { + + // 若沒有任一個點正在學習中 + if($this->getCurrentInTargetId($activity_id) == null) { + $db = new Database\DBStudy(); + return $db->toInTaeget($activity_id, $target_id, $is_entity); + } + else { + throw new Exception\InLearningException(); + } + } + + /** + * 離開標的 + * + * @param int $activity_id 活動編號 + * @param int $target_id 標的編號 + */ + public function toOutTarget($activity_id, $target_id) { + + // 從資料庫取得此活動此標的學習中資料 + $db = new Database\DBStudy(); + $learning_array = $db->getInStudyIdByTargetId($activity_id, $target_id); + + if(isset($learning_array)) { + + foreach($learning_array as $thisArray) { + + $db->toOutTaeget($thisArray['study_id']); + } + } + } +} diff --git a/htdocs/lib/Study/Theme.php b/htdocs/lib/Study/Theme.php index 2fcb6d6..d255601 100644 --- a/htdocs/lib/Study/Theme.php +++ b/htdocs/lib/Study/Theme.php @@ -96,7 +96,7 @@ class Theme { /** * 建構子 * - * @param int $inputTID 主題ID + * @param int $inputID 主題ID * @since 2.0.0 */ public function __construct($inputID){ diff --git a/htdocs/lib/Target/Target.php b/htdocs/lib/Target/Target.php index c7b8f76..af82b26 100644 --- a/htdocs/lib/Target/Target.php +++ b/htdocs/lib/Target/Target.php @@ -293,6 +293,17 @@ class Target { return $this->getMj(); } + /** + * 判斷目前標的人數是否為零 + * + * @return bool true/此標的目前人數是空的,false/此標的目前人數不是空的 + * @since 2.0.0 + */ + public function isNumberOfPeopleZero(){ + if($this->getCurrentPeople() == 0) return true; + else return false; + } + /** * 增加學習標的目前人數 *