function scorm_randomize_children_process($scoid, $userid) { $sco = scorm_get_sco($scoid); if (!scorm_is_leaf($sco)) { if (!scorm_seq_is('suspended', $scoid, $userid) && !scorm_seq_is('active', $scoid, $userid)) { $r = get_record('scorm_scoes_track', 'scoid', $scoid, 'userid', $userid, 'element', 'randomizationtiming'); switch ($r->value) { case 'never': break; case 'oneachnewattempt': case 'once': if (!scorm_seq_is('activityprogressstatus', $scoid, $userid)) { if (scorm_seq_is('randomizechildren', $scoid, $userid)) { $childlist = array(); $res = scorm_get_available_children($sco); $i = sizeof($res) - 1; $children = $res->value; while ($i >= 0) { $pos = array_rand($children); array_push($childlist, $children[$pos]); array_splice($children, $pos, 1); $i--; } $clist = serialize($childlist); scorm_seq_set('availablechildren', $scoid, $userid, false); scorm_seq_set('availablechildren', $scoid, $userid, $clist); } } break; } } } }
function scorm_seq_flow_activity_traversal($activity, $userid, $direction, $childrenflag, $prevdirection, $seq, $userid) { $parent = scorm_get_parent($activity); if (!isset($parent->flow) || $parent->flow == false) { $seq->deliverable = false; $seq->exception = 'SB.2.2-1'; $seq->nextactivity = $activity; return $seq; } $rulecheck = scorm_seq_rules_check($activity, 'skip'); if ($rulecheck != null) { $skip = scorm_evaluate_condition($rulecheck, $activity, $userid); if ($skip) { $seq = scorm_seq_flow_tree_traversal($activity, $direction, false, $prevdirection, $seq, $userid, $skip); $seq = scorm_seq_flow_activity_traversal($seq->nextactivity, $userid, $direction, $childrenflag, $prevdirection, $seq, $userid); } else { if (!empty($seq->identifiedactivity)) { $seq->nextactivity = $activity; } } return $seq; } $ch = scorm_check_activity($activity, $userid); if ($ch) { $seq->deliverable = false; $seq->exception = 'SB.2.2-2'; $seq->nextactivity = $activity; return $seq; } if (!scorm_is_leaf($activity)) { $seq = scorm_seq_flow_tree_traversal($activity, $direction, true, null, $seq, $userid); if ($seq->identifiedactivity == null) { $seq->deliverable = false; $seq->nextactivity = $activity; return $seq; } else { if ($direction == 'backward' && $seq->traversaldir == 'forward') { $seq = scorm_seq_flow_activity_traversal($seq->identifiedactivity, $userid, 'forward', $childrenflag, 'backward', $seq, $userid); } else { $seq = scorm_seq_flow_activity_traversal($seq->identifiedactivity, $userid, $direction, $childrenflag, null, $seq, $userid); } return $seq; } } $seq->deliverable = true; $seq->nextactivity = $activity; $seq->exception = null; return $seq; }
function scorm_seq_end_attempt($sco, $userid) { if (scorm_is_leaf($sco)) { if (!isset($sco->tracked) || $sco->tracked == 1) { if (!scorm_seq_is('suspended', $sco->id, $userid)) { if (!isset($sco->completionsetbycontent) || $sco->completionsetbycontent == 0) { if (!scorm_seq_is('attemptprogressstatus', $sco->id, $userid, $attempt)) { scorm_seq_set('attemptprogressstatus', $sco->id, $userid, $attempt); scorm_seq_set('attemptcompletionstatus', $sco->id, $userid, $attempt); } } if (!isset($sco->objectivesetbycontent) || $sco->objectivesetbycontent == 0) { if ($sco->objectives) { foreach ($objectives as $objective) { if ($objective->primary) { if (!scorm_seq_objective_progress_status($sco, $userid, $objective)) { scorm_seq_set('objectiveprogressstatus', $sco->id, $userid, $attempt); scorm_seq_set('objectivesatisfiedstatus', $sco->id, $userid, $attempt); } } } } } } } } else { if ($children = scorm_get_children($sco)) { $suspended = false; foreach ($children as $child) { if (scorm_seq_is('suspended', $child, $userid)) { $suspended = true; break; } } if ($suspended) { scorm_seq_set('suspended', $sco, $userid); } else { scorm_seq_set('suspended', $sco, $userid, 0, false); } } } scorm_seq_set('active', $sco, $userid, 0, false); scorm_seq_overall_rollup($sco, $userid); }