📄 sequencinglib.php
字号:
return $seq; } } } break; } if (array_search ($ancestors, $comancestor)!== false){ $ancestorscurrent = scorm_get_ancestors($seq->currentactivity); $commonpos = scorm_find_common_ancestor($ancestors,$sco); $curcommon = array_slice($ancestorscurrent,0,$commonpos-1); if(empty($curcommon)){ $seq->delivery = null; $seq->exception = 'SB.2.9-5'; return $seq; } $constrained = null; foreach ($curcommon as $acti){ $acti = scorm_get_sco($acti->id); if ( isset($acti->choiceexit) && ($acti->choiceexit == false)){ $seq->delivery = null; $seq->exception = 'SB.2.9-7'; return $seq; } if ($constrained == null){ if($acti->constrainchoice == true){ $constrained = $acti; } } } if ($constrained != null){ $fwdir = scorm_get_preorder($constrained); if(array_search ($fwdir, $sco)!== false){ $traverse = 'forward'; } else{ $traverse = 'backward'; } $seq = scorm_seq_choice_flow ($constrained, $traverse, $seq); $actconsider = $seq->identifiedactivity; $avdescendents = Array(); $avdescendents= scorm_get_available_descendents ($actconsider); if (array_search ($avdescendents, $sco) !== false && $sco->id != $actconsider->id && $constrained->id != $sco->id ){ $seq->delivery = null; $seq->exception = 'SB.2.9-8'; return $seq; }//CONTINUE 11.5.5 } $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; } $fwdir = scorm_get_preorder($seq->currentactivity); if(array_search ($fwdir, $sco)!== false){ 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($act->id); if(scorm_seq_is('active',$act->id,$userid) && ($act->id != $comancestor->id && ($act->preventactivation == true))){ $seq->delivery = null; $seq->exception = 'SB.2.9-6'; return $seq; } } } else{ foreach ($comtarget as $act){ $act = scorm_get_sco($act->id); if(scorm_seq_is('active',$act->id,$userid) && ($act->id != $comancestor->id && ($act->preventactivation==true))){ $seq->delivery = null; $seq->exception = 'SB.2.9-6'; return $seq; } } } break; } if(scorm_is_leaf ($sco)){ $seq->delivery = $sco; $seq->exception = 'SB.2.9-6'; return $seq; } $seq = scorm_seq_flow ($sco,'forward',$seq,true,$userid); if ($seq->deliverable == false){ scorm_terminate_descendent_attempts($comancestor,$userid,$seq); scorm_seq_end_attempt($comancestor,$userid,$seq->attempt); $seq->currentactivity = $sco; $seq->delivery = null; $seq->exception = 'SB.2.9-9'; return $seq; } else{ return $seq; } }function scorm_seq_choice_flow ($constrained, $traverse, $seq){ $seq = scorm_seq_choice_flow_tree ($constrained, $traverse, $seq); if ($seq->identifiedactivity == null){ $seq->identifiedactivity = $constrained; return $seq; } else{ return $seq; }}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--; } } } }}function scorm_seq_choice_activity_traversal($activity,$userid,$seq,$direction){ if($direction == 'forward'){ $act = scorm_seq_rules_check($activity,'stopforwardtraversal'); if($act != null){ $seq->reachable = false; $seq->exception = 'SB.2.4-1'; return $seq; } $seq->reachable = false; return $seq; } if($direction == 'backward'){ $parentsco = scorm_get_parent($activity); if($parentsco!= null){ if (isset($parentsco->forwardonly) && ($parentsco->forwardonly == true)){ $seq->reachable = false; $seq->exception = 'SB.2.4-2'; return $seq; } else{ $seq->reachable = false; $seq->exception = 'SB.2.4-3'; return $seq; } } } $seq->reachable = true; return $seq;}//Delivery Request Processfunction scorm_sequencing_delivery($scoid,$userid,$seq){ if(!scorm_is_leaf ($seq->delivery)){ $seq->deliveryvalid = false; $seq->exception = 'DB.1.1-1'; return $seq; } $ancestors = scorm_get_ancestors($seq->delivery); $arrpath = array_reverse($ancestors); array_push ($arrpath,$seq->delivery);//path from the root to the target if (empty($arrpath)){ $seq->deliveryvalid = false; $seq->exception = 'DB.1.1-2'; return $seq; } foreach ($arrpath as $activity){ if(scorm_check_activity ($activity,$userid)){ $seq->deliveryvalid = false; $seq->exception = 'DB.1.1-3'; return $seq; } } $seq->deliveryvalid = true; return $seq;}function scorm_content_delivery_environment ($seq,$userid){ $act = $seq->currentactivity; if(scorm_seq_is('active',$act->id,$userid)){ $seq->exception = 'DB.2-1'; return $seq; } $track = get_record('scorm_scoes_track','scoid',$act->id,'userid',$userid,'element','suspendedactivity'); if ($track != null){ $seq = scorm_clear_suspended_activity($seq->delivery, $seq); } $seq = scorm_terminate_descendent_attempts ($seq->delivery,$userid,$seq); $ancestors = scorm_get_ancestors($seq->delivery); $arrpath = array_reverse($ancestors); array_push ($arrpath,$seq->delivery); foreach ($arrpath as $activity){ if(!scorm_seq_is('active',$activity->id,$userid)){ if(!isset($activity->tracked) || ($activity->tracked == 1)){ if(!scorm_seq_is('suspended',$activity->id,$userid)){ $r = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','activityattemptcount'); $r->value = ($r->value)+1; update_record ('scorm_scoes_track',$r); if ($r->value == 1){ scorm_seq_set('activityprogressstatus', $activity->id, $userid, 'true'); } scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'objectiveprogressstatus', 'false'); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'objectivesatisfiedstatus', 'false'); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'objectivemeasurestatus', 'false'); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'objectivenormalizedmeasure', 0.0); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'attemptprogressstatus', 'false'); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'attemptcompletionstatus', 'false'); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'attemptabsoluteduration', 0.0); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'attemptexperiencedduration', 0.0); scorm_insert_track($userid, $activity->scorm, $activity->id, 0, 'attemptcompletionamount', 0.0); } } scorm_seq_set('active', $activity->id, $userid, 'true'); } } $seq->delivery = $seq->currentactivity; scorm_seq_set('suspendedactivity', $activity->id, $userid, 'false'); //ONCE THE DELIVERY BEGINS (How should I check that?) if(isset($activity->tracked) || ($activity->tracked == 0)){ //How should I track the info and what should I do to not record the information for the activity during delivery? $atabsdur = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','attemptabsoluteduration'); $atexpdur = get_record('scorm_scoes_track','scoid',$activity->id,'userid',$userid,'element','attemptexperiencedduration'); } return $seq; }function scorm_clear_suspended_activity($act,$seq){ $currentact= $seq->currentactivity; $track = get_record('scorm_scoes_track','scoid',$currentact->id,'userid',$userid,'element','suspendedactivity'); if ($track != null){ $ancestors = scorm_get_ancestors($act); $commonpos = scorm_find_common_ancestor($ancestors,$currentact); if ($commonpos !== false) { if ($activitypath = array_slice($ancestors,0,$commonpos)) { if (!empty ($activitypath)){ foreach ($activitypath as $activity) { if (scorm_is_leaf($activity)){ scorm_seq_set('suspended',$activity->id,$userid,false); } else{ $children = scorm_get_children($activity); $bool= false; foreach ($children as $child){ if(scorm_seq_is('suspended',$child->id,$userid)){ $bool= true; } } if(!$bool){ scorm_seq_set('suspended',$activity->id,$userid,false); } } } } } } scorm_seq_set('suspendedactivity',$act->id,$userid,false); }}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_randomize_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','randomizationtiming'); switch($r->value) { case 'never': break; case 'oneachnewattempt': case 'once': if(!scorm_seq_is('activityprogressstatus',$scoid,$userid)){ if(scorm_seq_is('randomizechildren',$scoid,$userid)){ $childlist = array(); $res = scorm_get_available_children($sco); $i = sizeof($res)-1; $children = $res->value; while ($i>=0){ $pos = array_rand($children); array_push($childlist,$children [$pos]); array_splice($children,$pos,1); $i--; } $clist = serialize ($childlist); scorm_seq_set('availablechildren', $scoid, $userid, false); scorm_seq_set('availablechildren', $scoid, $userid, $clist); } } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -