function getElementsArrayTrackingTemplate($pathelem, $scormVersion) { soap__dbgOut("+getElementsArrayTrackingTemplate({$pathelem})"); $path = translateParam($pathelem); $xmldoc = getXmlDocTrackingTemplate($scormVersion); $elem = $xmldoc->getDocumentElement(); $increment = 1; $resultArray = array(); for ($i = 0; $i < count($path) && $elem; $i += $increment) { $step = $path[$i]; soap__dbgOut(" getElementsArrayTrackingTemplate procesing step = {$step}"); if ($i < count($path) - 1) { $next = $path[$i + 1]; } else { $next = ""; } $index = ""; $increment = 1; // Virtual elements switch ($step) { case '_count': if (strlen($next) > 0) { $resultArray[] = array($step, false); // after _count can't be anything } elseif ($elem->getAttribute('index') != 'yes') { $resultArray[] = array($step, false); // count on an uncountable element } else { $resultArray[] = array($step, true); // ok } return $resultArray; break; case '_children': if (strlen($next) > 0) { $resultArray[] = array($step, false); // after _children can't be anything } elseif ($elem->getAttribute('item') == 'yes') { $resultArray[] = array($step, false); // can't get children of a terminal element } else { $resultArray[] = array($step, true); // ok } return $resultArray; break; case '_version': $step = 'version'; // the element name in template is 'version' break; } // if next step is a number the element to find is an // element of a list if (is_numeric($next)) { $index = $next; $increment = 2; $name = $index; $elem =& $elem->GetElementByNameAttrib($step, "index", "yes"); } elseif (strlen($next) > 0) { // it's not the last element soap__dbgOut(" getElementsArrayTrackingTemplate search {$step} elem in " . $elem->getTagName()); $elem = $elem->GetElementByNameAttrib($step, "item", "no"); //soap__dbgOut(" getElementsArrayTrackingTemplate elem tag ". $elem->tagName); $name = $step; } else { // last element $elem = $elem->GetElementByNameAttrib($step, "item", "yes"); $name = $step; } if ($elem) { $resultArray[] = array($name, $elem); } else { $resultArray[] = array($name, false); } } soap__dbgOut("-getElementsArrayTrackingTemplate"); return $resultArray; }
/** * 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()); } } }
function SetValue($idUser, $idReference, $idscorm_item, $param, $value) { soap__dbgOut("+SetValue( {$idUser}, {$idReference}, {$idscorm_item}, {$param}, {$value})"); $dbconn = $GLOBALS['dbConn']; // get item_track $itemtrack = new Scorm_ItemsTrack($dbconn, $GLOBALS['prefix_lms']); $rs = $itemtrack->getItemTrack($idUser, $idReference, $idscorm_item); $arrItemTrackData = mysql_fetch_assoc($rs); // get tracking soap__dbgOut("before: Scorm_Tracking(NULL, NULL, {$arrItemTrackData['idscorm_tracking']}, NULL, {$dbconn}, FALSE, FALSE);"); $trackobj = new Scorm_Tracking(NULL, NULL, $arrItemTrackData['idscorm_tracking'], NULL, $dbconn, FALSE, FALSE); soap__dbgOut("after: Scorm_Tracking(NULL, NULL, {$arrItemTrackData['idscorm_tracking']}, NULL, {$dbconn}, FALSE, FALSE);"); if ($trackobj->setParam($param, $value) === false) { soap__dbgOut("Scorm_Tracking setParam({$param}, {$value}) return false"); soap__dbgOut("Scorm_Tracking error: " . $trackobj->getErrorCode() . "\n" . $trackobj->getErrorText()); $status = "error"; $error = $trackobj->getErrorCode(); $errorString = $trackobj->getErrorText(); } else { soap__dbgOut("Scorm_Tracking setParam({$param}, {$value}) return true"); $status = "success"; $error = ""; $errorString = ""; } $arr_result = array(new SOAP_Value('status', 'string', $status), new SOAP_Value('error', 'string', $error), new SOAP_Value('errorString', 'string', $errorString)); soap__dbgOut("-SetValue return {$status}"); return $arr_result; }
function setParamXML($xmldoc) { require_once dirname(__FILE__) . '/scorm-' . $this->scormVersion . '.php'; $arrFields = array(); $xpath = new DDomXPath($xmldoc); foreach ($GLOBALS['xpathwritedb'] as $fieldName => $xpathquery) { $xpath_ns = $xpath->query($xpathquery); if ($xpath_ns->getLength() > 0) { $elem = $xpath_ns->item(0); $arrFields[$fieldName] = $elem->getContent(); } } if (count($arrFields) > 0) { $isFirst = TRUE; $query = "UPDATE {$this->tracktable} SET "; foreach ($arrFields as $fname => $fvalue) { if ($fname == 'score_raw') { $fvalue = str_replace(',', '.', $fvalue); } if ($isFirst) { $query .= "`{$fname}` = '" . addslashes($fvalue) . "' "; $isFirst = FALSE; } else { $query .= ", `{$fname}` = '" . addslashes($fvalue) . "' "; } } $query .= "WHERE idscorm_tracking = {$this->idtrack}"; //echo "<!-- $query -->\n"; if (sql_query($query, $this->dbconn)) { if (mysql_affected_rows($this->dbconn) == 1) { // return true; // We must also set the value in xmlData filed! soap__dbgOut(" Scorm_Tracking::setParam OK affected row = 1", SOAP_DBG_LEVEL_LOG, SOAP_DBG_FILTER_SETPARAM); } else { // mysql return 0 also when $fieldMap is already $paramval soap__dbgOut(" Scorm_Tracking::setParam affected row != 1", SOAP_DBG_LEVEL_ERROR, SOAP_DBG_FILTER_SETPARAM); if (mysql_errno($this->dbconn) != 0) { soap__dbgOut(" Scorm_Tracking::setParam report Error", SOAP_DBG_LEVEL_ERROR, SOAP_DBG_FILTER_SETPARAM); $this->setError(1, "Scorm_Tracking::setParam 1 [ {$query} ] " . mysql_error($this->dbconn)); return false; } } } else { soap__dbgOut(" Scorm_Tracking::setParam report Error", SOAP_DBG_LEVEL_ERROR, SOAP_DBG_FILTER_SETPARAM); $this->setError(1, "Scorm_Tracking::setParam 2 [ {$query} ] " . mysql_error($this->dbconn)); return false; } } $this->setXmlDoc($xmldoc); }