function scorm_seq_termination($seq, $userid) { if (empty($seq->currentactivity)) { $seq->termination = false; $seq->exception = 'TB.2.3-1'; return $seq; } $sco = $seq->currentactivity; if (($seq->termination == 'exit' || $seq->termination == 'abandon') && !$seq->active) { $seq->termination = false; $seq->exception = 'TB.2.3-2'; return $seq; } switch ($seq->termination) { case 'exit': scorm_seq_end_attempt($sco, $userid, $seq); $seq = scorm_seq_exit_action_rules($seq, $userid); do { $exit = false; // I think this is false. Originally this was true. $seq = scorm_seq_post_cond_rules($seq, $userid); if ($seq->termination == 'exitparent') { if ($sco->parent != '/') { $sco = scorm_get_parent($sco); $seq->currentactivity = $sco; $seq->active = scorm_seq_is('active', $sco->id, $userid); scorm_seq_end_attempt($sco, $userid, $seq); $exit = true; // I think it's true. Originally this was false. } else { $seq->termination = false; $seq->exception = 'TB.2.3-4'; return $seq; } } } while ($exit == false && $seq->termination == 'exit'); if ($seq->termination == 'exit') { $seq->termination = true; return $seq; } case 'exitall': if ($seq->active) { scorm_seq_end_attempt($sco, $userid, $seq); } // Terminate Descendent Attempts Process. if ($ancestors = scorm_get_ancestors($sco)) { foreach ($ancestors as $ancestor) { scorm_seq_end_attempt($ancestor, $userid, $seq); $seq->currentactivity = $ancestor; } } $seq->active = scorm_seq_is('active', $seq->currentactivity->id, $userid); $seq->termination = true; $seq->sequencing = exit; break; case 'suspendall': if ($seq->active || $seq->suspended) { scorm_seq_set('suspended', $sco->id, $userid, $attempt); } else { if ($sco->parent != '/') { $parentsco = scorm_get_parent($sco); scorm_seq_set('suspended', $parentsco->id, $userid, $attempt); } else { $seq->termination = false; $seq->exception = 'TB.2.3-3'; } } if ($ancestors = scorm_get_ancestors($sco)) { foreach ($ancestors as $ancestor) { scorm_seq_set('active', $ancestor->id, $userid, $attempt, false); scorm_seq_set('suspended', $ancestor->id, $userid, $attempt); $seq->currentactivity = $ancestor; } $seq->termination = true; $seq->sequencing = 'exit'; } else { $seq->termination = false; $seq->exception = 'TB.2.3-5'; } break; case 'abandon': scorm_seq_set('active', $sco->id, $userid, $attempt, false); $seq->active = null; $seq->termination = true; break; case 'abandonall': if ($ancestors = scorm_get_ancestors($sco)) { foreach ($ancestors as $ancestor) { scorm_seq_set('active', $ancestor->id, $userid, $attempt, false); $seq->currentactivity = $ancestor; } $seq->termination = true; $seq->sequencing = 'exit'; } else { $seq->termination = false; $seq->exception = 'TB.2.3-6'; } break; default: $seq->termination = false; $seq->exception = 'TB.2.3-7'; break; } return $seq; }
function scorm_seq_exit_action_rules($seq, $userid) { $sco = $seq->currentactivity; $ancestors = scorm_get_ancestors($sco); $exittarget = null; foreach (array_reverse($ancestors) as $ancestor) { if (scorm_seq_rules_check($ancestor, 'exit') != null) { $exittarget = $ancestor; break; } } if ($exittarget != null) { $commons = array_slice($ancestors, 0, scorm_find_common_ancestor($ancestors, $exittarget)); /// Terminate Descendent Attempts Process if ($commons) { foreach ($commons as $ancestor) { scorm_seq_end_attempt($ancestor, $userid); $seq->currentactivity = $ancestor; } } } return $seq; }
function scorm_terminate_descendent_attempts($activity, $userid, $seq) { $ancestors = scorm_get_ancestors($seq->currentactivity); $commonpos = scorm_find_common_ancestor($ancestors, $activity); if ($commonpos !== false) { if ($activitypath = array_slice($ancestors, 1, $commonpos - 2)) { if (!empty($activitypath)) { foreach ($activitypath as $sco) { scorm_seq_end_attempt($sco, $userid, $seq->attempt); } } } } }
$scorm = $DB->get_record("scorm", array("id" => $cm->instance), '*', MUST_EXIST); } else { if (!empty($a)) { $scorm = $DB->get_record("scorm", array("id" => $a), '*', MUST_EXIST); $course = $DB->get_record("course", array("id" => $scorm->course), '*', MUST_EXIST); $cm = get_coursemodule_from_instance("scorm", $scorm->id, $course->id, false, MUST_EXIST); } else { print_error('missingparameter'); } } $PAGE->set_url('/mod/scorm/datamodels/sequencinghandler.php', array('scoid' => $scoid, 'attempt' => $attempt, 'id' => $cm->id, 'function' => $function, 'request' => $request)); require_login($course, false, $cm); if (!empty($scoid) && !empty($function)) { require_once $CFG->dirroot . '/mod/scorm/datamodels/scorm_13lib.php'; if (has_capability('mod/scorm:savetrack', context_module::instance($cm->id))) { $result = null; switch ($function) { case 'scorm_seq_flow': if ($request == 'forward' || $request == 'backward') { $seq = scorm_seq_navigation($scoid, $USER->id, $request . '_', $attempt); $sco = scorm_get_sco($scoid); $seq = scorm_seq_flow($sco, $request, $seq, true, $USER->id); if (!empty($seq->nextactivity)) { scorm_seq_end_attempt($sco, $USER->id, $seq); } } echo json_encode($seq); break; } } }