示例#1
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;
                }
            }
        }
    }
}
示例#2
0
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);
                }
            }
        }
    }
}
示例#3
0
function scorm_get_ancestors($sco)
{
    if ($sco->parent != '/') {
        return array_push(scorm_get_ancestors(scorm_get_parent($sco)));
    } else {
        return $sco;
    }
}
示例#4
0
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;
}