📄 sequencinglib.php
字号:
}}function scorm_seq_flow_activity_traversal ($activity, $userid, $direction, $childrenflag, $prevdirection, $seq,$userid){//returns the next activity on the tree, traversal direction, control returned to the LTS, (may) exception $activity = scorm_get_sco ($activity); $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; } $rulch = scorm_seq_rules_check($sco, 'skipped'); if ($rulch != null){ $seq = scorm_seq_flow_tree_traversal ($activity, $direction, false, $prevdirection, $seq,$userid);//endsession and exception if ($seq->identifiedactivity == null){ $seq->deliverable = false; $seq->nextactivity = $activity; return $seq; } else{ if ($prevdirection = 'backward' && $seq->traversaldir == 'backward'){ $seq = scorm_seq_flow_tree_traversal ($activity,$direction,false,null,$seq,$userid); $seq = scorm_seq_flow_activity($seq->identifiedactivity, $userid, $direction, $childrenflag, $prevdirection, $seq,$userid); } else{ $seq = scorm_seq_flow_tree_traversal ($activity,$direction,false,null,$seq,$userid); $seq = scorm_seq_flow_activity($seq->identifiedactivity, $userid, $direction, $childrenflag, $prevdirection, $seq,$userid); } 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($seq->identifiedactivity, $userid, 'forward', $childrenflag, 'backward', $seq,$userid); } else{ scorm_seq_flow_activity($seq->identifiedactivity, $userid, $direction, $childrenflag, null, $seq,$userid); } return $seq; } } $seq->deliverable = true; $seq->nextactivity = $activity; return $seq;}function scorm_seq_flow_tree_traversal ($activity,$direction,$childrenflag,$prevdirection,$seq,$userid){ $revdirection = false; $parent = scorm_get_parent ($activity); $children = scorm_get_available_children ($parent); $siz = sizeof ($children); if (($prevdirection != null && $prevdirection == 'backward') && ($children[$siz-1]->id == $activity->id)){ $direction = 'backward'; $children[0] = $activity; $revdirection = true; } if($direction = 'forward'){ $ancestors = scorm_get_ancestors($activity); $ancestorsroot = array_reverse($ancestors); $preorder = scorm_get_preorder ($ancestorsroot); $siz= sizeof ($preorder); if (($activity->id == $preorder[$siz-1]->id) || (($activity->parent == '/') && !($childrenflag))){ scorm_seq_terminate_descent($ancestorsroot,$userid); $seq->endsession = true; $seq->nextactivity = null; return $seq; } if (scorm_is_leaf ($activity) || !$childrenflag){ if ($children[$siz-1]->id == $activity->id){ $seq = scorm_seq_flow_tree_traversal ($parent, $direction, false, null, $seq,$userid); // I think it's not necessary to do a return in here } else{ $parent = scorm_get_parent($activity); $children = scorm_get_available_children($parent); $seq->traversaldir = $direction; $sib = scorm_get_siblings($activity); $pos = array_search($sib, $activity); if ($pos !== false) { if ($pos != sizeof ($sib)){ $seq->nextactivity = $sib [$pos+1]; return $seq; } else{ $ch = scorm_get_children($sib[0]); $seq->nextactivity = $ch[0]; return $seq; } } } } else{ if (!empty ($children)){ $seq->traversaldir = $direction; $seq->nextactivity = $children[0]; return $seq; } else{ $seq->traversaldir = null; $seq->nextactivity = $children[0]; $seq->exception = 'SB.2.1-2'; return $seq; } } } 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)) { $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); return $seq; } else{ $ancestors = scorm_get_ancestors($activity); $ancestorsroot = array_reverse ($ancestors); $preorder = scorm_get_preorder ($ancestorsroot); $pos = array_search($preorder, $children[$siz]); $preord = array_slice($preorder, 0, $pos-1); $revpreorder = array_reverse($preord); $position = array_search($revpreorder, $activity); $seq->nextactivity = $revpreorder[$pos+1]; $seq->traversaldir = $direction; return $seq; } } else{ if (!empty($children)){ $activity = scorm_get_sco($activity->id); if (isset($parent->flow) && ($parent->flow == true)) { $children = scorm_get_children ($activity); $seq->traversaldir = 'forward'; $seq->nextactivity = $children[0]; return $seq; } else{ $children = scorm_get_children ($activity); $seq->traversaldir = 'backward'; $seq->nextactivity = $children[sizeof($children)-1]; return $seq; } } else{ $seq->traversaldir = null; $seq->nextactivity = null; $seq->exception = 'SB.2.1-2'; return $seq; } } }}function scorm_check_activity ($activity,$userid){ $act = scorm_seq_rules_check($activity,'disabled'); if ($act != null){ return true; } if(scorm_limit_cond_check ($activity,$userid)){ return true; } return false;}function scorm_limit_cond_check ($activity,$userid){ if (isset($activity->tracked) && ($activity->tracked == 0)){ return false; } if (scorm_seq_is('active',$activity->id,$userid) || scorm_seq_is('suspended',$activity->id,$userid)){ return false; } if (!isset($activity->limitcontrol) || ($activity->limitcontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','activityattemptcount'); if (scorm_seq_is('activityprogressstatus',$activity->id,$userid) && ($r->value >=$activity->limitattempt)){ return true; } } if (!isset($activity->limitabsdurcontrol) || ($activity->limitabsdurcontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','activityabsoluteduration'); if (scorm_seq_is('activityprogressstatus',$activity->id,$userid) && ($r->value >=$activity->limitabsduration)){ return true; } } if (!isset($activity->limitexpdurcontrol) || ($activity->limitexpdurcontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','activityexperiencedduration'); if (scorm_seq_is('activityprogressstatus',$activity->id,$userid) && ($r->value >=$activity->limitexpduration)){ return true; } } if (!isset($activity->limitattabsdurcontrol) || ($activity->limitattabsdurcontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','attemptabsoluteduration'); if (scorm_seq_is('activityprogressstatus',$activity->id,$userid) && ($r->value >=$activity->limitattabsduration)){ return true; } } if (!isset($activity->limitattexpdurcontrol) || ($activity->limitattexpdurcontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','attemptexperiencedduration'); if (scorm_seq_is('activityprogressstatus',$activity->id,$userid) && ($r->value >=$activity->limitattexpduration)){ return true; } } if (!isset($activity->limitbegincontrol) || ($activity->limitbegincontrol == 1)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','begintime'); if (time()>=$activity->limitbegintime){ return true; } } if (!isset($activity->limitbegincontrol) || ($activity->limitbegincontrol == 1)){ if (time()<$activity->limitbegintime){ return true; } } if (!isset($activity->limitendcontrol) || ($activity->limitendcontrol == 1)){ if (time()>$activity->limitendtime){ return true; } } return false;}function scorm_seq_choice_sequencing($sco,$userid,$seq){ $avchildren = Array (); $comancestor = null; $traverse = null; if ($sco == null){ $seq->delivery = null; $seq->exception = 'SB.2.9-1'; return $seq; } $ancestors = scorm_get_ancestors($sco); $arrpath = array_reverse($ancestors); array_push ($arrpath,$sco);//path from the root to the target foreach ($arrpath as $activity){ if ($activity->parent != '/') { $avchildren = scorm_get_available_children (scorm_get_parent($activity)); $position = array_search($avchildren, $activity); if ($position !== false){ $seq->delivery = null; $seq->exception = 'SB.2.9-2'; return $seq; } } if (scorm_seq_rules_check($activity,'hidefromchoice' != null)){ $seq->delivery = null; $seq->exception = 'SB.2.9-3'; return $seq; } } if ($sco->parent != '/') { $parent = scorm_sco_get_parent ($sco); if ( isset($parent->choice) && ($parent->choice == false)){ $seq->delivery = null; $seq->exception = 'SB.2.9-4'; return $seq; } } if ($seq->currentactivity != null){ $commonpos = scorm_find_common_ancestor($ancestors,$seq->currentactivity); $comancestor = $arrpath [$commonpos]; } else{ $comancestor = $arrpath [0]; } if($seq->currentactivity === $sco) { break; } $sib = scorm_get_siblings($seq->currentactivity); $pos = array_search($sib, $sco); if ($pos !== false){ $siblings = array_slice($sib, 0, $pos-1); if (empty($siblings)){ $seq->delivery = null; $seq->exception = 'SB.2.9-5'; return $seq; } $children = scorm_get_children (scorm_get_parent ($sco)); $pos1 = array_search($children, $sco); $pos2 = array_search($seq->currentactivity, $sco); if ($pos1>$pos2){ $traverse = 'forward'; } else{ $traverse = 'backward'; } foreach ($siblings as $sibling){ $seq = scorm_seq_choice_activity_traversal($sibling,$userid,$seq,$traverse); if(!$seq->reachable){ $seq->delivery = null; return $seq; } } break; } if($seq->currentactivity == null || $seq->currentactivity == $comancestor){ $commonpos = scorm_find_common_ancestor($ancestors,$seq->currentactivity); $comtarget = array_slice($ancestors, 1,$commonpos-1);//path from the common ancestor to the target activity $comtarget = array_reverse($comtarget); if (empty($comtarget)){ $seq->delivery = null; $seq->exception = 'SB.2.9-5'; return $seq; } foreach ($comtarget as $act){ $seq = scorm_seq_choice_activity_traversal($act,$userid,$seq,'forward'); if(!$seq->reachable){ $seq->delivery = null; return $seq; } $act = scorm_get_sco ($acti->id); if(scorm_seq_is('active',$act->id,$userid) && ($act->id != $comancestor->id && $act->preventactivation)){//adlseq:can i write it like another property for the $seq object? $seq->delivery = null; $seq->exception = 'SB.2.9-6'; return $seq; } } break; } if ($comancestor->id == $sco->id){ $ancestorscurrent = scorm_get_ancestors($seq->currentactivity); $possco = array_search ($ancestorscurrent, $sco); $curtarget = array_slice($ancestorscurrent,0,$possco);//path from the current activity to the target if (empty($curtarget)){ $seq->delivery = null; $seq->exception = 'SB.2.9-5'; return $seq; } $i=0; foreach ($curtarget as $activ){ $i++; if ($i != sizeof($curtarget)){ if ( isset($activ->choiceexit) && ($activ->choiceexit == false)){ $seq->delivery = null; $seq->exception = 'SB.2.9-7';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -