function scorm_get_preorder(&$preorder = array(), $sco = null) { if ($sco != null) { array_push($preorder, $sco); if ($children = scorm_get_children($sco)) { foreach ($children as $child) { scorm_get_preorder($preorder, $child); } } } return $preorder; }
function scorm_seq_flow_tree_traversal($activity, $direction, $childrenflag, $prevdirection, $seq, $userid, $skip = false) { $revdirection = false; $parent = scorm_get_parent($activity); if (!empty($parent)) { $children = scorm_get_available_children($parent); } else { $children = array(); } $childrensize = count($children); if ($prevdirection != null && $prevdirection == 'backward' && $children[$childrensize - 1]->id == $activity->id) { $direction = 'backward'; $activity = $children[0]; $revdirection = true; } if ($direction == 'forward') { $ancestors = scorm_get_ancestors($activity); $ancestorsroot = array_reverse($ancestors); $preorder = array(); $preorder = scorm_get_preorder($preorder, $ancestorsroot[0]); $preordersize = count($preorder); if ($activity->id == $preorder[$preordersize - 1]->id || $activity->parent == '/' && !$childrenflag) { // scorm_seq_terminate_descent($ancestorsroot, $userid); TODO: undefined $seq->endsession = true; $seq->nextactivity = null; return $seq; } if (scorm_is_leaf($activity) || !$childrenflag) { if ($children[$childrensize - 1]->id == $activity->id) { $seq = scorm_seq_flow_tree_traversal($parent, $direction, false, null, $seq, $userid); if ($seq->nextactivity->launch == null) { $seq = scorm_seq_flow_tree_traversal($seq->nextactivity, $direction, true, null, $seq, $userid); } return $seq; } else { $position = 0; foreach ($children as $sco) { if ($sco->id == $activity->id) { break; } $position++; } if ($position != $childrensize - 1) { $seq->nextactivity = $children[$position + 1]; $seq->traversaldir = $direction; return $seq; } else { $siblings = scorm_get_siblings($activity); $children = scorm_get_children($siblings[0]); $seq->nextactivity = $children[0]; return $seq; } } } else { $children = scorm_get_available_children($activity); if (!empty($children)) { $seq->traversaldir = $direction; $seq->nextactivity = $children[0]; return $seq; } else { $seq->traversaldir = null; $seq->nextactivity = null; $seq->exception = 'SB.2.1-2'; return $seq; } } } else { if ($direction == 'backward') { if ($activity->parent == '/') { $seq->traversaldir = null; $seq->nextactivity = null; $seq->exception = 'SB.2.1-3'; return $seq; } if (scorm_is_leaf($activity) || !$childrenflag) { if (!$revdirection) { if (isset($parent->forwardonly) && ($parent->forwardonly == true && !$skip)) { $seq->traversaldir = null; $seq->nextactivity = null; $seq->exception = 'SB.2.1-4'; return $seq; } } if ($children[0]->id == $activity->id) { $seq = scorm_seq_flow_tree_traversal($parent, 'backward', false, null, $seq, $userid); return $seq; } else { $ancestors = scorm_get_ancestors($activity); $ancestorsroot = array_reverse($ancestors); $preorder = array(); $preorder = scorm_get_preorder($preorder, $ancestorsroot[0]); $position = 0; foreach ($preorder as $sco) { if ($sco->id == $activity->id) { break; } $position++; } if (isset($preorder[$position])) { $seq->nextactivity = $preorder[$position - 1]; $seq->traversaldir = $direction; } return $seq; } } else { $children = scorm_get_available_children($activity); if (!empty($children)) { if (isset($parent->flow) && $parent->flow == true) { $seq->traversaldir = 'forward'; $seq->nextactivity = $children[0]; return $seq; } else { $seq->traversaldir = 'backward'; $seq->nextactivity = $children[count($children) - 1]; return $seq; } } else { $seq->traversaldir = null; $seq->nextactivity = null; $seq->exception = 'SB.2.1-2'; return $seq; } } } } }
function scorm_select_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', 'selectiontiming'); switch ($r->value) { case 'oneachnewattempt': case 'never': break; case 'once': if (!scorm_seq_is('activityprogressstatus', $scoid, $userid)) { if (scorm_seq_is('selectioncountsstatus', $scoid, $userid)) { $childlist = ''; $res = get_record('scorm_scoes_track', 'scoid', $scoid, 'userid', $userid, 'element', 'selectioncount'); $i = $res->value - 1; $children = scorm_get_children($sco); while ($i >= 0) { $pos = array_rand($children); array_push($childlist, $children[$pos]); array_splice($children, $pos, 1); $i--; } sort($childlist); $clist = serialize($childlist); scorm_seq_set('availablechildren', $scoid, $userid, false); scorm_seq_set('availablechildren', $scoid, $userid, $clist); } } break; } } } }
function scorm_get_preorder($preorder = array(), $sco) { if ($sco != null) { array_push($preorder, $sco); $children = scorm_get_children($sco); foreach ($children as $child) { scorm_get_preorder($sco); } } else { return $preorder; } }
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); }