Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
 /**
  * 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());
         }
     }
 }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 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);
 }