Example #1
0
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;
}
Example #2
0
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;
                }
            }
        }
    }
}
Example #3
0
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;
            }
        }
    }
}
Example #4
0
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;
    }
}
Example #5
0
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);
}