StudyActivity類別實作

This commit is contained in:
Yuan Chiu 2014-10-27 01:13:02 +08:00
parent e762c6d87c
commit 5c19270e9c
5 changed files with 494 additions and 56 deletions

View File

@ -53,7 +53,7 @@
*
* 針對未個別設定過的使用者,採用預設的導引模式
*/
define('LMODE', '0');
define('LMODE', '1');
/**
* 預設教材模式

View File

@ -0,0 +1,341 @@
<?php
/**
* DBStudyActivity.php
*
* 此檔案針對學習標的,以及學習標的的區域、廳等的資料庫查詢用。
*/
namespace UElearning\Database;
use UElearning\Exception;
require_once UELEARNING_LIB_ROOT.'/Database/Database.php';
require_once UELEARNING_LIB_ROOT.'/Database/Exception.php';
/**
* 學習活動資料表
*
* 此檔案針對學習標的,以及學習標的的區域、廳等的資料表進行操作。
*
* 範例:
*
* require_once __DIR__.'/../config.php';
* require_once UELEARNING_LIB_ROOT.'/Database/DBStudyActivity.php';
* use UElearning\Database;
*
* $db = new Database\DBStudyActivity();
* // 現在開始一個活動
* $db->insertActivity('yuan', '1', null, null, null, 0, null, true, null);
* // 設定延後
* $db->setDelay(40, -12);
*
* // 查詢'yuan'的所有活動
* $data = $db->queryAllActivityByUserId('yuan');
* echo '<pre>';print_r($data);echo '</pre>';
*
* @author Yuan Chiu <chyuaner@gmail.com>
* @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 '<pre>'; print_r($targetInfo); echo '</pre>';
*
*
* @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();
}
}

View File

@ -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;

View File

@ -0,0 +1,39 @@
<?php
/**
* Exception.php
*/
namespace UElearning\Exception;
// TODO: 將以下類別濃縮
/**
* 沒有找到此標的
* @since 2.0.0
* @package UElearning
* @subpackage Target
*/
class StudyActivityNoFoundException extends \UnexpectedValueException {
/**
* 指定的學習活動ID
* @type int
*/
private $id;
/**
* 使用者帳號例外
* @param int $id 輸入的標的ID
*/
public function __construct($id) {
$this->id = $id;
parent::__construct('No Activity: '.$this->id);
}
/**
* 取得輸入的標的ID
* @return int 標的ID
*/
public function getId() {
return $this->id;
}
}

View File

@ -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'];
}