5require_once 
"./Services/Object/classes/class.ilObject.php";
 
    6require_once 
"./Modules/ScormAicc/classes/class.ilObjSCORMValidator.php";
 
    7require_once 
"./Modules/ScormAicc/classes/class.ilObjSAHSLearningModule.php";
 
   27    public function __construct($a_id = 0, $a_call_by_reference = 
true)
 
   30        parent::__construct($a_id, $a_call_by_reference);
 
   43        $returnValue = $this->validator->validate();
 
   49        if (is_object($this->validator)) {
 
   50            return $this->validator->getSummary();
 
   67        include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMTree.php");
 
   69        $root_id = 
$tree->readRootId();
 
   72        $childs = 
$tree->getSubTree(
$tree->getNodeData($root_id));
 
   74        foreach ($childs as $child) {
 
   75            if ($child[
"c_type"] == 
"sit") {
 
   76                include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
 
   78                if ($sc_item->getIdentifierRef() != 
"") {
 
   79                    $items[count($items)] = $sc_item;
 
   95        $needs_convert = 
false;
 
  102        $check_for_manifest_file = is_file($manifest_file);
 
  105        if (!$check_for_manifest_file) {
 
  106            $this->
ilias->raiseError($this->lng->txt(
"Manifestfile $manifest_file not found!"), $this->ilias->error_obj->MESSAGE);
 
  110        if ($check_for_manifest_file) {
 
  111            $manifest_file_array = file($manifest_file);
 
  112            foreach ($manifest_file_array as $mfa) {
 
  114                if (@iconv(
'UTF-8', 
'UTF-8', $mfa) != $mfa) {
 
  115                    $needs_convert = 
true;
 
  121            $estimated_manifest_filesize = filesize($manifest_file) * 2;
 
  125            $check_disc_free = 2;
 
  129        if ($needs_convert) {
 
  131            if ($check_for_manifest_file && ($check_disc_free > 1)) {
 
  134                if (!copy($manifest_file, $manifest_file . 
".old")) {
 
  135                    echo 
"Failed to copy $manifest_file...<br>\n";
 
  140                $f_write_handler = fopen($manifest_file . 
".new", 
"w");
 
  141                $f_read_handler = fopen($manifest_file . 
".old", 
"r");
 
  142                while (!feof($f_read_handler)) {
 
  143                    $zeile = fgets($f_read_handler);
 
  145                    fputs($f_write_handler, utf8_encode($zeile));
 
  147                fclose($f_read_handler);
 
  148                fclose($f_write_handler);
 
  151                if (!copy($manifest_file . 
".new", $manifest_file)) {
 
  152                    echo 
"Failed to copy $manifest_file...<br>\n";
 
  155                if (!@is_file($manifest_file)) {
 
  156                    $this->
ilias->raiseError(
 
  157                        $this->lng->txt(
"cont_no_manifest"),
 
  158                        $this->ilias->error_obj->WARNING
 
  164                if (!($check_disc_free > 1)) {
 
  165                    $this->
ilias->raiseError($this->lng->txt(
"Not enough space left on device!"), $this->ilias->error_obj->MESSAGE);
 
  171            $hmani = fopen($manifest_file, 
"r");
 
  172            $start = fread($hmani, 3);
 
  173            if (strtolower(bin2hex($start)) == 
"efbbbf") {
 
  174                $f_write_handler = fopen($manifest_file . 
".new", 
"w");
 
  175                while (!feof($hmani)) {
 
  176                    $n = fread($hmani, 900);
 
  177                    fputs($f_write_handler, 
$n);
 
  179                fclose($f_write_handler);
 
  183                if (!copy($manifest_file . 
".new", $manifest_file)) {
 
  184                    echo 
"Failed to copy $manifest_file...<br>\n";
 
  192        if (
$_POST[
"validate"] == 
"y") {
 
  194                $ilErr->raiseError(
"<b>Validation Error(s):</b><br>" . $this->
getValidationSummary(), $ilErr->MESSAGE);
 
  199        include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMPackageParser.php");
 
  202        $slmParser->startParsing();
 
  203        return $slmParser->getPackageTitle();
 
  214        if (
$lm_set->get(
'scorm_lp_auto_activate') != 1) {
 
  218        include_once(
"./Services/Tracking/classes/class.ilObjUserTracking.php");
 
  224        include_once(
"./Services/Tracking/classes/class.ilLPObjSettings.php");
 
  230        include_once(
"Services/Tracking/classes/collection/class.ilLPCollectionOfSCOs.php");
 
  233        foreach ($collection->getPossibleItems() as $sco_id => $item) {
 
  236        $collection->activateEntries($scos);
 
  245        $sco_set = 
$ilDB->queryF(
 
  247                SELECT DISTINCT sco_id FROM scorm_tracking WHERE obj_id = %s',
 
  249            array($this->
getId())
 
  253        while ($sco_rec = 
$ilDB->fetchAssoc($sco_set)) {
 
  254            include_once(
"./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php");
 
  256            if ($sc_item->getIdentifierRef() != 
"") {
 
  257                $items[count($items)] = $sc_item;
 
  277                SELECT last_access FROM sahs_user  
  280            array(
'integer',
'integer'),
 
  281            array($a_obj_id,$a_usr_id)
 
  286            return $row[
"last_access"];
 
  296        $query = 
'SELECT user_id, last_access, lastname, firstname FROM sahs_user st ' .
 
  297            'JOIN usr_data ud ON st.user_id = ud.usr_id ' .
 
  298            'WHERE obj_id = ' . 
$ilDB->quote($this->
getId(), 
'integer');
 
  301            $query .= 
' AND ' . 
$ilDB->like(
'lastname', 
'text', 
'%' . $a_search . 
'%');
 
  303        $query .= 
' GROUP BY user_id, lastname, firstname, last_access';
 
  307        while ($sco_rec = 
$ilDB->fetchAssoc($sco_set)) {
 
  322        $query = 
'SELECT user_id, package_attempts FROM sahs_user WHERE obj_id = ' . 
$ilDB->quote($this->
getId(), 
'integer') . 
' ';
 
  327            $attempts[
$row[
'user_id']] = (int) 
$row[
'package_attempts'];
 
  339        $val_set = 
$ilDB->queryF(
 
  340            'SELECT package_attempts FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  341            array(
'integer',
'integer'),
 
  342            array($this->
getId(),$a_user_id,0)
 
  345        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
  347        if ($val_rec[
"package_attempts"] == 
null) {
 
  348            $val_rec[
"package_attempts"]=
"";
 
  350        return $val_rec[
"package_attempts"];
 
  361        $query = 
'SELECT user_id, module_version FROM sahs_user WHERE obj_id = ' . 
$ilDB->quote($this->
getId(), 
'integer') . 
' ';
 
  366            $versions[
$row[
'user_id']] = (int) 
$row[
'module_version'];
 
  378        $val_set = 
$ilDB->queryF(
 
  379            'SELECT module_version FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  380            array(
'integer',
'integer'),
 
  381            array($this->
getId(),$a_user_id,0)
 
  384        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
  386        if ($val_rec[
"module_version"] == 
null) {
 
  387            $val_rec[
"module_version"]=
"";
 
  389        return $val_rec[
"module_version"];
 
  403        $data_set = 
$ilDB->queryF(
 
  405                SELECT * FROM scorm_tracking  
  410            array(
'integer',
'integer',
'integer'),
 
  411            array($a_user_id,$a_sco_id,$this->
getId())
 
  415        while ($data_rec = 
$ilDB->fetchAssoc($data_set)) {
 
  427        $sco_set = 
$ilDB->queryF(
 
  429                SELECT DISTINCT sco_id FROM scorm_tracking  
  433            array(
'integer',
'integer',
'integer'),
 
  434            array($this->
getId(),$a_user_id,0)
 
  438        while ($sco_rec = 
$ilDB->fetchAssoc($sco_set)) {
 
  439            $data_set = 
$ilDB->queryF(
 
  441                        SELECT * FROM scorm_tracking  
  449                array(
'integer',
'integer',
'integer',
'text',
'text',
'text',
'text'),
 
  450                array($this->
getId(),
 
  454                "cmi.core.lesson_status",
 
  455                "cmi.core.total_time",
 
  456                "cmi.core.score.raw")
 
  459            $score = 
$time = $status = 
"";
 
  461            while ($data_rec = 
$ilDB->fetchAssoc($data_set)) {
 
  462                switch ($data_rec[
"lvalue"]) {
 
  463                    case "cmi.core.lesson_status":
 
  464                        $status = $data_rec[
"rvalue"];
 
  467                    case "cmi.core.total_time":
 
  468                        $time = $data_rec[
"rvalue"];
 
  471                    case "cmi.core.score.raw":
 
  472                        $score = $data_rec[
"rvalue"];
 
  477            include_once 
'./Modules/ScormAicc/classes/SCORM/class.ilSCORMItem.php';
 
  479            $data[] = array(
"sco_id"=>$sco_rec[
"sco_id"], 
"title" => $sc_item->getTitle(),
 
  480            "score" => $score, 
"time" => 
$time, 
"status" => $status);
 
  482        return (array) 
$data;
 
  490        $user_set = 
$ilDB->queryF(
 
  492                SELECT DISTINCT user_id FROM scorm_tracking  
  495                array(
'integer',
'integer'),
 
  496                array($this->
getId(),$a_sco_id)
 
  500        while ($user_rec = 
$ilDB->fetchAssoc($user_set)) {
 
  501            $data_set = 
$ilDB->queryF(
 
  503                    SELECT * FROM scorm_tracking  
  510                    array(
'integer',
'integer',
'integer',
'text',
'text',
'text'),
 
  511                    array($this->
getId(),
 
  513                    $user_rec[
"user_id"],
 
  514                    "cmi.core.lesson_status",
 
  515                    "cmi.core.total_time",
 
  516                    "cmi.core.score.raw")
 
  519            $score = 
$time = $status = 
"";
 
  521            while ($data_rec = 
$ilDB->fetchAssoc($data_set)) {
 
  522                switch ($data_rec[
"lvalue"]) {
 
  523                        case "cmi.core.lesson_status":
 
  524                            $status = $data_rec[
"rvalue"];
 
  527                        case "cmi.core.total_time":
 
  528                            $time = $data_rec[
"rvalue"];
 
  531                        case "cmi.core.score.raw":
 
  532                            $score = $data_rec[
"rvalue"];
 
  537            $data[] = array(
"user_id" => $user_rec[
"user_id"],
 
  538                    "score" => $score, 
"time" => 
$time, 
"status" => $status);
 
  556        include_once(
'./Modules/ScormAicc/classes/class.ilSCORMTrackingItems.php');
 
  557        include_once(
"./Services/Tracking/classes/class.ilLearningProgressBaseGUI.php");
 
  558        include_once(
'./Services/PrivacySecurity/classes/class.ilPrivacySettings.php');
 
  560        $allowExportPrivacy = $privacy->enabledExportSCORM();
 
  563        $query = 
'SELECT * FROM sahs_user WHERE obj_id = %s';
 
  564        if (count($a_users) >0) {
 
  565            $query .= 
' AND ' . 
$ilDB->in(
'user_id', $a_users, 
false, 
'integer');
 
  570            array($this->
getId())
 
  572        while (
$data = $ilDB->fetchAssoc(
$res)) {
 
  573            $csv = $csv . 
$data[
"obj_id"]
 
  575                . 
";" . 
$data[
"module_version"]
 
  577                . 
";\"" . 
$data[
"last_access"] . 
"\"" 
  579                . 
";" . 
$data[
"package_attempts"]
 
  580                . 
";" . 
$data[
"percentage_completed"]
 
  581                . 
";" . 
$data[
"sco_total_time_sec"]
 
  586        $header = 
"LearningModuleId;LearningModuleTitle;LearningModuleVersion;" . str_replace(
',', 
';', $udh[
"cols"]) . 
";" 
  587                . 
"LastAccess;Status;Attempts;percentageCompletedSCOs;SumTotal_timeSeconds\n";
 
  602        $fhandle = fopen($a_file, 
"r");
 
  605        $fields = fgetcsv($fhandle, pow(2, 16), 
';');
 
  609        switch ($fields[0]) {
 
  611            case "SCO-Identifier":
 
  615            case "LearningModuleId":
 
  628        include_once(
"./Services/Tracking/classes/class.ilLPStatus.php");
 
  631        include_once 
'./Services/Object/classes/class.ilObjectLP.php';
 
  633        $collection = $olp->getCollectionInstance();
 
  635            $scos = $collection->getItems();
 
  638        $fhandle = fopen($a_file, 
"r");
 
  640        $obj_id = $this->getID();
 
  641        $fields = fgetcsv($fhandle, pow(2, 16), 
';');
 
  643        $usersToDelete = array();
 
  644        while (($csv_rows = fgetcsv($fhandle, pow(2, 16), 
";")) !== 
false) {
 
  645            $data = array_combine($fields, $csv_rows);
 
  647            if (
$data[
"Login"]) {
 
  650            if (
$data[
"login"]) {
 
  654            if (
$data[
"user"] && is_numeric(
$data[
"user"])) {
 
  655                $user_id = (int) 
$data[
"user"];
 
  661                    $date_ex = explode(
'.', 
$data[
'Date']);
 
  662                    $last_access = implode(
'-', array($date_ex[2], $date_ex[1], $date_ex[0]));
 
  664                if (
$data[
'LastAccess']) {
 
  665                    $last_access = 
$data[
'LastAccess'];
 
  670                if (
$data[
"Status"]) {
 
  671                    if (is_int(
$data[
"Status"])) {
 
  672                        $status = 
$data[
"Status"];
 
  673                    } elseif (
$data[
"Status"] == 
"0" || 
$data[
"Status"] == 
"1" || 
$data[
"Status"] == 
"2" || 
$data[
"Status"] == 
"3") {
 
  674                        $status = (int) 
$data[
"Status"];
 
  685                if (
$data[
"Attempts"]) {
 
  686                    $attempts = 
$data[
"Attempts"];
 
  689                $percentage_completed = 0;
 
  691                    $percentage_completed = 100;
 
  693                if (
$data[
'percentageCompletedSCOs']) {
 
  694                    $percentage_completed = 
$data[
'percentageCompletedSCOs'];
 
  697                $sco_total_time_sec = 
null;
 
  698                if (
$data[
'SumTotal_timeSeconds']) {
 
  699                    $sco_total_time_sec = 
$data[
'SumTotal_timeSeconds'];
 
  703                    $usersToDelete[] = $user_id;
 
  705                    $this->
importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
 
  710                    foreach ($scos as $sco_id) {
 
  711                        $statement = 
$ilDB->queryF(
 
  713                                                        SELECT * FROM scorm_tracking  
  718                            array(
'integer',
'integer',
'text',
'integer'),
 
  719                            array($user_id, $sco_id, 
'cmi.core.lesson_status',$obj_id)
 
  721                        if (
$ilDB->numRows($statement) > 0) {
 
  725                                    'rvalue'            => array(
'clob', 
'completed'),
 
  726                                    'c_timestamp'       => array(
'timestamp', $last_access)
 
  729                                    'user_id'           => array(
'integer', $user_id),
 
  730                                    'sco_id'            => array(
'integer', $sco_id),
 
  731                                    'lvalue'            => array(
'text', 
'cmi.core.lesson_status'),
 
  732                                    'obj_id'            => array(
'integer', $obj_id)
 
  736                            $ilDB->insert(
'scorm_tracking', array(
 
  737                                'obj_id'                => array(
'integer', $obj_id),
 
  738                                'user_id'               => array(
'integer', $user_id),
 
  739                                'sco_id'                => array(
'integer', $sco_id),
 
  740                                'lvalue'                => array(
'text', 
'cmi.core.lesson_status'),
 
  741                                'rvalue'                => array(
'clob', 
'completed'),
 
  742                                'c_timestamp'   => array(
'timestamp', $last_access)
 
  751        if (count($usersToDelete)>0) {
 
  756        include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
 
  761    public function importSuccessForSahsUser($user_id, $last_access, $status, $attempts=
null, $percentage_completed=
null, $sco_total_time_sec=
null)
 
  764        $statement = 
$ilDB->queryF(
 
  765            'SELECT * FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
  766            array(
'integer',
'integer'),
 
  767            array($this->getID(),$user_id)
 
  769        if (
$ilDB->numRows($statement) > 0) {
 
  773                    'last_access'       => array(
'timestamp', $last_access),
 
  774                    'status'    => array(
'integer', $status),
 
  775                    'package_attempts'  => array(
'integer', $attempts),
 
  776                    'percentage_completed'      => array(
'integer', $percentage_completed),
 
  777                    'sco_total_time_sec'        => array(
'integer', $sco_total_time_sec)
 
  780                    'obj_id'            => array(
'integer', $this->getID()),
 
  781                    'user_id'           => array(
'integer', $user_id)
 
  785            $ilDB->insert(
'sahs_user', array(
 
  786                'obj_id'                => array(
'integer', $this->getID()),
 
  787                'user_id'               => array(
'integer', $user_id),
 
  788                'last_access'   => array(
'timestamp', $last_access),
 
  789                'status'        => array(
'integer', $status),
 
  790                'package_attempts'      => array(
'integer', $attempts),
 
  791                'percentage_completed'  => array(
'integer', $percentage_completed),
 
  792                'sco_total_time_sec'    => array(
'integer', $sco_total_time_sec)
 
  796        include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
 
  809        $parts = explode(
'_', $il_id);
 
  811        if (!count((array) $parts)) {
 
  814        if (!isset($parts[2]) or !isset($parts[3])) {
 
  817        if ($parts[2] != 
$ilSetting->get(
'inst_id', $parts[2])) {
 
  833        $lng->loadLanguageModule(
"scormtrac");
 
  835        $fhandle = fopen($a_file, 
"r");
 
  837        $fields = fgetcsv($fhandle, pow(2, 16), 
';');
 
  839        $a_last_access = array();
 
  841        $a_package_attempts = array();
 
  842        $a_module_version = array();
 
  843        while (($csv_rows = fgetcsv($fhandle, pow(2, 16), 
";")) !== 
false) {
 
  844            $data = array_combine($fields, $csv_rows);
 
  845            if (
$data[
'Userid']) {
 
  859            if (
$data[
'Scoid']) {
 
  862            if (
$data[$lng->txt(
"identifierref")]) {
 
  870            if (
$data[
'Timestamp']) {
 
  871                $c_timestamp = 
$data[
'Timestamp'];
 
  874                $c_timestamp = 
$data[
$lng->txt(
"c_timestamp")];
 
  876            if ($c_timestamp == 
"") {
 
  877                $date = 
new DateTime();
 
  878                $c_timestamp = $date->getTimestamp();
 
  880                if ($a_last_access[$user_id]) {
 
  881                    if ($a_last_access[$user_id] < $c_timestamp) {
 
  882                        $a_last_access[$user_id] = $c_timestamp;
 
  885                    $a_last_access[$user_id] = $c_timestamp;
 
  892            if (!
$data[
'Value']) {
 
  896            if (
$data[
'Key'] == 
"cmi.core.total_time" && 
$data[
'Value'] != 
"") {
 
  897                $tarr = explode(
":", 
$data[
'Value']);
 
  898                $sec = (int) $tarr[2] + (
int) $tarr[1] * 60 +
 
  899                    (int) substr($tarr[0], strlen($tarr[0]) - 3) * 60 * 60;
 
  900                if ($a_time[$user_id]) {
 
  901                    $a_time[$user_id] += $sec;
 
  903                    $a_time[$user_id] = $sec;
 
  907            if ($il_sco_id > 0) {
 
  908                $statement = 
$ilDB->queryF(
 
  910                                        SELECT * FROM scorm_tracking  
  915                    array(
'integer', 
'integer', 
'text', 
'integer'),
 
  916                    array($user_id, $il_sco_id, 
$data[
'Key'], $this->getID())
 
  918                if (
$ilDB->numRows($statement) > 0) {
 
  922                            'rvalue' => array(
'clob', 
$data[
'Value']),
 
  923                            'c_timestamp' => array(
'timestamp', $c_timestamp)
 
  926                            'user_id' => array(
'integer', $user_id),
 
  927                            'sco_id' => array(
'integer', $il_sco_id),
 
  928                            'lvalue' => array(
'text', 
$data[
'Key']),
 
  929                            'obj_id' => array(
'integer', $this->
getId())
 
  933                    $ilDB->insert(
'scorm_tracking', array(
 
  934                        'obj_id' => array(
'integer', $this->
getId()),
 
  935                        'user_id' => array(
'integer', $user_id),
 
  936                        'sco_id' => array(
'integer', $il_sco_id),
 
  937                        'lvalue' => array(
'text', 
$data[
'Key']),
 
  938                        'rvalue' => array(
'clob', 
$data[
'Value']),
 
  939                        'c_timestamp' => array(
'timestamp', 
$data[
'Timestamp'])
 
  944            if ($il_sco_id == 0) {
 
  945                if (
$data[
'Key'] == 
"package_attempts") {
 
  946                    $a_package_attempts[$user_id] = 
$data[
'Value'];
 
  950            if (!in_array($user_id, 
$users)) {
 
  957        include_once 
'./Services/Tracking/classes/class.ilLPStatusWrapper.php';
 
  961        include_once 
'./Services/Tracking/classes/class.ilLPStatus.php';
 
  962        foreach (
$users as $user_id) {
 
  964            if ($a_package_attempts[$user_id]) {
 
  965                $attempts = $a_package_attempts[$user_id];
 
  969            $sco_total_time_sec = 
null;
 
  970            if ($a_time[$user_id]) {
 
  971                $sco_total_time_sec = $a_time[$user_id];
 
  974            if ($a_last_access[$user_id]) {
 
  975                $last_access = $a_last_access[$user_id];
 
  982            $this->
importSuccessForSahsUser($user_id, $last_access, $status, $attempts, $percentage_completed, $sco_total_time_sec);
 
  998        foreach ($a_user_id as $user) {
 
 1000            $val_set = 
$ilDB->queryF(
 
 1001                'SELECT package_attempts FROM sahs_user WHERE user_id = %s AND obj_id = %s',
 
 1002                array(
'integer',
'integer'),
 
 1003                array($user,$this->getID())
 
 1006            $val_rec = 
$ilDB->fetchAssoc($val_set);
 
 1008            if ($val_rec[
"package_attempts"] != 
null && $val_rec[
"package_attempts"] != 0) {
 
 1011                if ((
int) $val_rec[
"package_attempts"] > 0) {
 
 1012                    $new_rec = (int) $val_rec[
"package_attempts"]-1;
 
 1015                    'UPDATE sahs_user SET package_attempts = %s WHERE user_id = %s AND obj_id = %s',
 
 1016                    array(
'integer',
'integer',
'integer'),
 
 1017                    array($new_rec,$user,$this->getID())
 
 1021                include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
 
 1033        $val_set = 
$ilDB->queryF(
 
 1034            'SELECT * FROM usr_data WHERE(login=%s)',
 
 1038        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
 1040        if (count($val_rec)>0) {
 
 1041            return $val_rec[
'usr_id'];
 
 1056        if ($a_referrer==
"0") {
 
 1060        $val_set = 
$ilDB->queryF(
 
 1062                SELECT obj_id FROM sc_item,scorm_tree  
 1063                WHERE (obj_id = child  
 1064                AND identifierref = %s  
 1066            array(
'text',
'integer'),
 
 1067            array($a_referrer,$this->getID())
 
 1069        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
 1071        return $val_rec[
"obj_id"];
 
 1081        $val_set = 
$ilDB->queryF(
 
 1082            'SELECT usr_id FROM usr_data WHERE(email=%s)',
 
 1086        $val_rec = 
$ilDB->fetchAssoc($val_set);
 
 1089        return $val_rec[
"usr_id"];
 
 1116        $val_set = 
$ilDB->queryF(
 
 1118                SELECT scorm_object.obj_id, 
 1120                                scorm_object.c_type, 
 1121                                scorm_object.slm_id, 
 1122                                scorm_object.obj_id scoid  
 1123                FROM scorm_object,sc_item,sc_resource  
 1124                WHERE(scorm_object.slm_id = %s 
 1125                AND scorm_object.obj_id = sc_item.obj_id  
 1126                AND sc_item.identifierref = sc_resource.import_id  
 1127                AND sc_resource.scormtype = %s) 
 1128                GROUP BY scorm_object.obj_id, 
 1130                                scorm_object.c_type, 
 1131                                scorm_object.slm_id, 
 1132                                scorm_object.obj_id ',
 
 1133            array(
'integer', 
'text'),
 
 1137        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1138            array_push($scos, $val_rec[
'scoid']);
 
 1155        $scos = $a_allScoIds;
 
 1157        $scos_c = implode(
',', $scos);
 
 1159        $val_set = 
$ilDB->queryF(
 
 1161                SELECT * FROM scorm_tracking  
 1164                AND ' . 
$ilDB->in(
'sco_id', $scos, 
false, 
'integer') . 
' 
 1165                AND ((lvalue = %s AND ' . 
$ilDB->like(
'rvalue', 
'clob', 
'completed') . 
')  
 1166                        OR (lvalue = %s AND ' . 
$ilDB->like(
'rvalue', 
'clob', 
'passed') . 
')))',
 
 1167            array(
'integer',
'integer',
'text',
'text'),
 
 1168            array($a_user,$a_id,
'cmi.core.lesson_status', 
'cmi.core.lesson_status')
 
 1170        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1171            $key = array_search($val_rec[
'sco_id'], $scos);
 
 1175        if (count($scos) == 0) {
 
 1176            $completion = ($a_numerical===
true)  ? 
true: 
$lng->txt(
"cont_complete");
 
 1178        if (count($scos) > 0) {
 
 1179            $completion = ($a_numerical===
true)  ? 
false: 
$lng->txt(
"cont_incomplete");
 
 1201        $val_set = 
$ilDB->queryF(
 
 1203                SELECT scorm_object.obj_id, 
 1205                                scorm_object.c_type, 
 1206                                scorm_object.slm_id, 
 1207                                scorm_object.obj_id scoid  
 1208                FROM scorm_object, sc_item,sc_resource  
 1209                WHERE(scorm_object.slm_id = %s  
 1210                        AND scorm_object.obj_id = sc_item.obj_id  
 1211                        AND sc_item.identifierref = sc_resource.import_id  
 1212                        AND sc_resource.scormtype = %s ) 
 1213                GROUP BY scorm_object.obj_id, 
 1215                scorm_object.c_type, 
 1216                scorm_object.slm_id, 
 1217                scorm_object.obj_id',
 
 1218            array(
'integer',
'text'),
 
 1219            array($this->
getId(),
'sco')
 
 1222        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1223            array_push($scos, $val_rec[
'scoid']);
 
 1231        $scos = $a_allScoIds;
 
 1234        $scos_c = implode(
',', $scos);
 
 1236        $val_set = 
$ilDB->queryF(
 
 1238                SELECT sco_id FROM scorm_tracking  
 1241                        AND ' . 
$ilDB->in(
'sco_id', $scos, 
false, 
'integer') . 
' 
 1242                 AND ((lvalue = %s AND ' . 
$ilDB->like(
'rvalue', 
'clob', 
'completed') . 
') OR (lvalue =  %s AND ' . 
$ilDB->like(
'rvalue', 
'clob', 
'passed') . 
') ) )',
 
 1243            array(
'integer',
'integer',
'text',
'text',),
 
 1244            array($a_user,$this->getID(),
'cmi.core.lesson_status',
'cmi.core.lesson_status')
 
 1246        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1247            $key = array_search($val_rec[
'sco_id'], $scos);
 
 1251        if (count($scos) == 0) {
 
 1252            $completion = ($a_numerical===
true)  ? 
true: $this->lng->txt(
"cont_complete");
 
 1254        if (count($scos) > 0) {
 
 1255            $completion = ($a_numerical===
true)  ? 
false: $this->lng->txt(
"cont_incomplete");
 
 1271            'DELETE FROM scorm_tracking WHERE user_id = %s',
 
 1276            'DELETE FROM sahs_user WHERE user_id = %s',
 
 1286        $retAr = array(
"raw" => 
null, 
"max" => 
null, 
"scaled" => 
null);
 
 1287        $val_set = 
$ilDB->queryF(
 
 1289                        SELECT lvalue, rvalue FROM scorm_tracking  
 1292                        AND (lvalue = 'cmi.core.score.raw' OR lvalue = 'cmi.core.score.max')",
 
 1293            array(
'integer', 
'integer'),
 
 1294            array($a_item_id, $a_user_id)
 
 1296        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1297            if ($val_rec[
'lvalue'] == 
"cmi.core.score.raw") {
 
 1298                $retAr[
"raw"] = $val_rec[
"rvalue"];
 
 1300            if ($val_rec[
'lvalue'] == 
"cmi.core.score.max") {
 
 1301                $retAr[
"max"] = $val_rec[
"rvalue"];
 
 1304        if ($retAr[
"raw"] != 
null && $retAr[
"max"] != 
null) {
 
 1305            $retAr[
"scaled"] = ($retAr[
"raw"] / $retAr[
"max"]);
 
 1315        $val_set = 
$ilDB->queryF(
 
 1316            'SELECT last_visited FROM sahs_user WHERE obj_id = %s AND user_id = %s',
 
 1317            array(
'integer',
'integer'),
 
 1318            array($this->getID(),$user_id)
 
 1320        while ($val_rec = 
$ilDB->fetchAssoc($val_set)) {
 
 1321            if ($val_rec[
"last_visited"] != 
null) {
 
 1322                return "" . $val_rec[
"last_visited"];
 
 1331        include_once(
"./Services/Tracking/classes/class.ilChangeEvent.php");
 
 1332        include_once(
"./Services/Tracking/classes/class.ilLPStatusWrapper.php");
 
 1336        foreach ($a_users as $user) {
 
 1339                                DELETE FROM scorm_tracking 
 1342                array(
'integer', 
'integer'),
 
 1343                array($user, $this->getID())
 
 1348                                DELETE FROM sahs_user 
 1351                array(
'integer', 
'integer'),
 
 1352                array($user, $this->getID())
 
foreach($mandatory_scripts as $file) $timestamp
An exception for terminatinating execution or to throw for unit testing.
static _recordReadEvent( $a_type, $a_ref_id, $obj_id, $usr_id, $isCatchupWriteEvents=true, $a_ext_rc=false, $a_ext_time=false)
Records a read event and catches up with write events.
static _deleteReadEventsForUsers($a_obj_id, array $a_user_ids)
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
static _refreshStatus($a_obj_id, $a_users=null)
Set dirty.
const LP_STATUS_COMPLETED_NUM
static _lookupStatus($a_obj_id, $a_user_id, $a_create=true)
Lookup status.
const LP_STATUS_IN_PROGRESS_NUM
const LP_STATUS_NOT_ATTEMPTED_NUM
const LP_STATUS_FAILED_NUM
static _lookupPercentage($a_obj_id, $a_user_id)
Lookup percentage.
const LP_STATUS_NOT_ATTEMPTED
const LP_STATUS_IN_PROGRESS
static __readStatus($a_obj_id, $user_id)
Class ilObjSCORMLearningModule.
getDataDirectory($mode="filesystem")
get data directory of lm
Class ilObjSCORMLearningModule.
static _getScoresForUser($a_item_id, $a_user_id)
getStatusForUser($a_user, $a_allScoIds, $a_numerical=false)
setLearningProgressSettingsAtUpload()
set settings for learning progress determination per default at upload
importTrackingData($a_file)
getModuleVersionForUsers()
Get module version for users.
importRaw($a_file)
Import raw data @global ilDB $ilDB @global ilObjUser $ilUser.
exportSelected($a_all, $a_users=array())
Export selected user tracking data @global ilDB $ilDB @global ilObjUser $ilUser.
getCourseCompletionForUser($a_user)
static _getTrackingItems($a_obj_id)
get all tracking items of scorm object @access static
static _removeTrackingDataForUser($user_id)
static _getStatusForUser($a_id, $a_user, $a_allScoIds, $a_numerical=false)
Get the status of a SCORM module for a given user.
getAttemptsForUser($a_user_id)
get number of atttempts for a certain user and package
getTrackingDataAgg($a_user_id)
lookupSCOId($a_referrer)
resolves manifest SCOID to internal ILIAS SCO ID
getAttemptsForUsers()
Get attempts for all users @global ilDB $ilDB.
parseUserId($il_id)
Parse il_usr_123_6 id.
static _lookupLastAccess($a_obj_id, $a_usr_id)
Return the last access timestamp for a given user.
importSuccessForSahsUser($user_id, $last_access, $status, $attempts=null, $percentage_completed=null, $sco_total_time_sec=null)
validate($directory)
Validate all XML-Files in a SCOM-Directory.
getTrackingDataPerUser($a_sco_id, $a_user_id)
Get tracking data per user @global ilDB $ilDB.
sendExportFile($a_header, $a_content)
send export file to browser
__construct($a_id=0, $a_call_by_reference=true)
Constructor @access public.
getTrackingDataAggSco($a_sco_id)
static _getCourseCompletionForUser($a_id, $a_user)
Get the completion of a SCORM module for a given user.
deleteTrackingDataOfUsers($a_users)
readObject()
read manifest file @access public
getTrackedItems()
get all tracked items of current user
static _getAllScoIds($a_id)
Get an array of id's for all Sco's in the module.
decreaseAttemptsForUser($a_user_id)
Decrease attempts for user @global ilDB $ilDB.
getUserIdEmail($a_mail)
assumes that only one account exists for a mailadress
getTrackedUsers($a_search)
getModuleVersionForUser($a_user_id)
get module version that tracking data for a user was recorded on
Validation of SCORM-XML Files.
static _enabledLearningProgress()
check wether learing progress is enabled or not
static getInstance($a_obj_id)
getRefId()
get reference id @access public
getId()
get object id @access public
getTitle()
get object title @access public
static _getInstance()
Get instance of ilPrivacySettings.
static userDataHeaderForExport()
static userDataArrayForExport($user, $b_allowExportPrivacy=false)
static deliverData($a_data, $a_filename, $mime="application/octet-stream", $charset="")
deliver data for download via browser.
static now()
Return current timestamp in Y-m-d H:i:s format.
redirection script todo: (a better solution should control the processing via a xml file)
foreach($_POST as $key=> $value) $res