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); }
$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); if ($track_so->idReference === NULL) { $track_so->createTrack($idReference, $arrItemTrack['idscorm_item_track'], $idUser, date("Y-m-d H:i:s"), 'ab-initio', 'scormorg'); } /* info on number of items and setting of variables for tree hide/show */ $nItem = $arrItemTrack['nDescendant']; if (!empty($GLOBALS['chapter'])) { $isshow_tree = 'false'; $class_extension = '_hiddentree'; } else { $isshow_tree = $nItem > 1 ? 'true' : 'false'; $class_extension = $nItem > 1 ? '' : '_hiddentree'; } $lms_base_url = 'http' . ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' or isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) == 'https' or isset($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) == 'on') ? 's' : '') . '://' . (isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : $_SERVER['HTTP_HOST']) . (strlen(dirname($_SERVER['SCRIPT_NAME'])) != 1 ? dirname($_SERVER['SCRIPT_NAME']) : '') . '/'; $lms_url = $lms_base_url . $scormws; $xmlTreeUrl = $lms_base_url . $scormxmltree . '?idscorm_organization=' . $idscorm_organization . '&idReference=' . $idReference . '&environment=' . $environment;
/** * Scorm_ItemsTrack::forwardCompleted * forward completition back to ancestors items. * change the nChildCompleted and nDescendantCompleted fields * * @param $idUser * @param $idReference * @param $idscorm_item * @param $isChild **/ function forwardCompleted($idUser, $idReference, $idscorm_item, $isChild, $environment) { $rs = $this->getParentItemTrack($idUser, $idReference, $idscorm_item); if ($rs === FALSE) { return FALSE; } $record = mysql_fetch_assoc($rs); $status = 'incomplete'; if ($isChild) { $record['nChildCompleted']++; $updates[] = "nChildCompleted='" . (int) $record['nChildCompleted'] . "'"; if ($record['nChildCompleted'] >= $record['nChild']) { $status = 'completed'; if ($record['nChildCompleted'] > $record['nChild']) { // is possible? $record['nChildCompleted'] = $record['nChild']; } } } $record['nDescendantCompleted']++; if ($record['nDescendantCompleted'] > $record['nDescendant']) { $record['nDescendantCompleted'] = $record['nDescendant']; } $updates[] = "nDescendantCompleted='" . (int) $record['nDescendantCompleted'] . "'"; if (strcmp($status, $record['status']) != 0) { $updates[] = "status='{$status}'"; } $query = "UPDATE " . $this->main_table . " SET " . implode(', ', $updates) . " WHERE idscorm_item_track=" . $record['idscorm_item_track']; if (sql_query($query, $this->dbconn) === FALSE) { $textOut = "Scorm_ItemsTrack::forwardCompleted error in update [{$query}] " . mysql_error($this->dbconn) . print_r($record); soap__dbgOut($textOut, 1); die($textOut); } if (isset($record['idscorm_item'])) { if ($record['idscorm_item'] !== NULL) { if (strcmp($status, 'completed') == 0 || strcmp($status, 'passed') == 0) { $this->forwardCompleted($idUser, $idReference, $record['idscorm_item'], TRUE, $environment); } else { $this->forwardCompleted($idUser, $idReference, $record['idscorm_item'], FALSE, $environment); } } } else { // org item! set commontrack //print_r($record); if (strcmp($status, 'completed') == 0 || strcmp($status, 'passed') == 0) { soap__dbgOut("update commontrack"); require_once _lms_ . "/class.module/track.object.php"; require_once _lms_ . "/class.module/track.scorm.php"; soap__dbgOut("create Track_ScormOrg object"); $track_so = new Track_ScormOrg($record['idscorm_item_track'], false, false, NULL, $environment); soap__dbgOut("idscorm_item_track" . $record['idscorm_item_track']); soap__dbgOut("idReference = " . $track_so->idReference); $track_so->setStatus('completed'); $track_so->setDate(date("Y-m-d H:i:s")); $track_so->update(); soap__dbgOut("mysql error = " . mysql_error()); } } }