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_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 #3
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 #4
0
function scorm_seq_choice_flow_tree($constrained, $traverse, $seq)
{
    $islast = false;
    $parent = scorm_get_parent($constrained);
    if ($traverse == 'forward') {
        $preord = scorm_get_preorder($constrained);
        if (sizeof($preorder) == 0 || sizeof($preorder) == 0 && ($preorder[0]->id = $constrained->id)) {
            $islast = true;
            //the function is the last activity available
        }
        if ($constrained->parent == '/' || $islast) {
            $seq->nextactivity = null;
            return $seq;
        }
        $avchildren = scorm_get_available_children($parent);
        //available children
        if ($avchildren[sizeof($avchildren) - 1]->id == $constrained->id) {
            $seq = scorm_seq_choice_flow_tree($parent, 'forward', $seq);
            return $seq;
        } else {
            $i = 0;
            while ($i < sizeof($avchildren)) {
                if ($avchildren[$i]->id == $constrained->id) {
                    $seq->nextactivity = $avchildren[$i + 1];
                    return $seq;
                } else {
                    $i++;
                }
            }
        }
    }
    if ($traverse == 'backward') {
        if ($constrained->parent == '/') {
            $seq->nextactivity = null;
            return $seq;
        }
        $avchildren = scorm_get_available_children($parent);
        //available children
        if ($avchildren[0]->id == $constrained->id) {
            $seq = scorm_seq_choice_flow_tree($parent, 'backward', $seq);
            return $seq;
        } else {
            $i = sizeof($avchildren) - 1;
            while ($i >= 0) {
                if ($avchildren[$i]->id == $constrained->id) {
                    $seq->nextactivity = $avchildren[$i - 1];
                    return $seq;
                } else {
                    $i--;
                }
            }
        }
    }
}