function Finish($idUser, $idReference, $idscorm_item, $environment = 'course_lo') { soap__dbgOut("+Finish({$idUser}, {$idReference}, {$idscorm_item} )"); $status = "success"; $error = ""; $errorString = ""; $lesson_status = ""; $scormVersion = getScormVersion('idscorm_item', $idscorm_item); require_once dirname(__FILE__) . '/scorm-' . $scormVersion . '.php'; $dbconn = $GLOBALS['dbConn']; $itemtrack = new Scorm_ItemsTrack($dbconn, $GLOBALS['prefix_lms']); $rs = $itemtrack->getItemTrack($idUser, $idReference, $idscorm_item); $arrItemTrackData = mysql_fetch_assoc($rs); $trackobj = new Scorm_Tracking(NULL, NULL, $arrItemTrackData['idscorm_tracking'], NULL, $dbconn, FALSE, FALSE); if ($trackobj->getErrorCode() != 0) { soap__dbgOut("Finish error: " . $trackobj->getErrorText()); } /* if it's not for credit don't evaluate lesson_staus/completion_status */ if ($trackobj->getParam(SCORM_RTE_CREDIT, false) == 'credit') { soap__dbgOut("Finish: evaluate " . SCORM_RTE_COMPLETIONSTATUS); $itemobj = new Scorm_Item(NULL, FALSE, NULL, $dbconn, false, $arrItemTrackData['idscorm_item']); if ($itemobj) { /* remember in 1.3 masteryscore = completionthreshold */ if (strlen($itemobj->adlcp_masteryscore) > 0) { $lesson_status = computeCompletionStatus($trackobj, $itemobj->adlcp_masteryscore); } else { $lesson_status = $trackobj->getParam(SCORM_RTE_LESSONSTATUS, false); if ($scormVersion == '1.3') { $success_status = $trackobj->getParam(SCORM_RTE_SUCCESSSTATUS, false); if ($success_status == 'failed') { $lesson_status = 'failed'; } } if ($lesson_status == 'passed' || $lesson_status == 'completed') { $trackobj->setParam(SCORM_RTE_CREDIT, 'no-credit', false, true); } } } $itemtrack->setStatus($idUser, $idReference, $idscorm_item, $lesson_status, $environment); } soap__dbgOut("Finish: evaluate " . SCORM_RTE_ENTRY); $exitVal = $trackobj->getParam(SCORM_RTE_EXIT, false); /* logout is only in 1.3 scorm version */ if ($exitVal == "suspend" || $exitVal == "logout") { $trackobj->setParam(SCORM_RTE_ENTRY, 'resume', false, true); } else { $trackobj->setParam(SCORM_RTE_ENTRY, '', false, true); } soap__dbgOut("Finish: evaluate " . SCORM_RTE_TOTALTIME); $sessTime = $trackobj->getParam(SCORM_RTE_SESSIONTIME, false); $totTime = $trackobj->getParam(SCORM_RTE_TOTALTIME, false); if (strlen($sessTime) > 0) { $totTime = sumScormTime($sessTime, $totTime); $trackobj->setParam(SCORM_RTE_TOTALTIME, $totTime, false, true); } //update history if ($arr = $trackobj->getTrackData($trackobj->idtrack)) { if (!$trackobj->saveHistory($trackobj->idtrack, $arr['score_raw'], $arr['score_max'], $sessTime, $arr['lesson_status'])) { } // if is a game we update the score result } if ($environment == 'games' && $arr['score_raw'] !== false && $arr['score_raw'] !== NULL) { require_once _lms_ . '/class.module/track.scorm.php'; Track_ScormOrg::setEnvGamesData($idUser, $idReference, $arr['score_raw'], 'scormorg'); } //end update soap__dbgOut("Finish return status = {$status}"); return $this->makeResponse($status, $error, $errorString); }
} if ($environment == false) { $environment = 'course_lo'; } if ($playertemplate != '') { if (!file_exists(getPathTemplate() . 'player_scorm/' . $playertemplate . '/def_style.css')) { $playertemplate = 'default'; } } else { $playertemplate = 'default'; } $idscorm_organization = $idResource; $idUser = (int) getLogUserId(); /*Start database connection***********************************************/ /* get scorm version */ $scormVersion = getScormVersion('idscorm_organization', $idscorm_organization); /* get object title */ list($lo_title) = sql_fetch_row(sql_query("SELECT title" . " FROM " . $GLOBALS['prefix_lms'] . "_organization" . " WHERE idResource = '{$idResource}'" . " AND objectType = 'scormorg'")); $itemtrack = new Scorm_ItemsTrack(null, $GLOBALS['prefix_lms']); $rsItemTrack = $itemtrack->getItemTrack($idUser, $idReference, NULL, $idscorm_organization); if ($rsItemTrack === FALSE) { // The first time for this user in this organization $itemtrack->createItemsTrack($idUser, $idReference, $idscorm_organization); // Now should be present $rsItemTrack = $itemtrack->getItemTrack($idUser, $idReference, NULL, $idscorm_organization); } $arrItemTrack = mysql_fetch_assoc($rsItemTrack); // with id_item_track of organization|user|reference create an entry in commontrack table require_once _lms_ . '/class.module/track.object.php'; require_once _lms_ . '/class.module/track.scorm.php'; $track_so = new Track_ScormOrg($arrItemTrack['idscorm_item_track'], false, false, NULL, $environment);
/** * Constructor of the Scorm_Tracking * @param $idUser * @param $idReference * @param $id if $idUser is null => $idscorm_tracking, * if $id_isitemid is true => $idscorm_item, and $idRefrence is needed * else idsco from manifest * @param $idscorm_package * @param $connection * @param $createonfile */ function Scorm_Tracking($idUser, $idRefernce, $id, $idscorm_package, $connection, $createonfail = true, $id_isitemid = false) { $this->idUser = $idUser; $this->idReference = $idRefernce; $this->idscorm_item = NULL; $this->idscorm_package = $idscorm_package; $this->dbconn = $connection; $this->xmldoc = null; $this->tracktable = $GLOBALS['prefix_lms'] . "_scorm_tracking"; $this->historytable = $GLOBALS['prefix_lms'] . "_scorm_tracking_history"; // Find the idtrack for this peer iditem, iduser if ($idUser === null) { // id is idscorm_tracking $query = "SELECT idUser, idscorm_item FROM " . $GLOBALS['prefix_lms'] . "_scorm_tracking WHERE idscorm_tracking='" . (int) $id . "'"; $rs = sql_query($query, $this->dbconn); if ($rs == false || mysql_num_rows($rs) == 0) { return false; } list($this->idUser, $this->idscorm_item) = sql_fetch_row($rs); $this->idtrack = $id; $this->scormVersion = getScormVersion('idscorm_item', $this->idscorm_item); return true; } if ($id_isitemid) { $query = "SELECT tracking.idscorm_item, tracking.idscorm_tracking" . " FROM " . $GLOBALS['prefix_lms'] . "_scorm_tracking tracking" . " WHERE tracking.idscorm_item=" . $id . " AND tracking.idUser="******"Scorm_Tracking::Scorm_Tracking " . mysql_error($this->dbconn) . "[" . $query . "]"); return false; } if (mysql_num_rows($rs) == 0) { if ($createonfail) { // not found => create new track record $query = "INSERT INTO {$this->tracktable} " . " (idUser, idReference, idscorm_item)" . " VALUES" . " ( {$this->idUser}, {$this->idReference}, {$id} )"; if (sql_query($query, $this->dbconn)) { if (mysql_affected_rows($this->dbconn) == 1) { // get the id of the last insert = idscorm_tracking $this->idtrack = mysql_insert_id($this->dbconn); $this->scormVersion = getScormVersion('idscorm_item', $id); //update history //end update } else { $this->setError(1, "Scorm_Tracking::Scorm_Tracking " . mysql_error($this->dbconn) . "[" . $query . "]"); return false; } } else { $this->setError(1, "Scorm_Tracking::Scorm_Tracking " . mysql_error($this->dbconn) . "[" . $query . "]"); return false; } } else { $this->setError(1, "Scorm_Tracking::Scorm_Tracking " . mysql_error($this->dbconn) . "[" . $query . "]"); return false; } } else { list($this->idscorm_item, $this->idtrack) = mysql_fetch_array($rs); $this->scormVersion = getScormVersion('idscorm_item', $this->idscorm_item); mysql_free_result($rs); } return true; }