3 declare(strict_types=1);
49 require_once(
"SeqActivity.php");
51 require_once(
"SeqRule.php");
52 require_once(
"SeqRuleset.php");
54 require_once(
"SeqCondition.php");
55 require_once(
"SeqConditionSet.php");
57 require_once(
"SeqObjective.php");
58 require_once(
"SeqObjectiveMap.php");
60 require_once(
"SeqRollupRule.php");
61 require_once(
"SeqRollupRuleset.php");
63 require_once(
"ADLAuxiliaryResource.php");
70 $doc =
new DomDocument();
72 $organizations = $doc->getElementsByTagName(
"organizations");
75 $item = $organizations->item(0);
77 $default = preg_replace(
'/(%20)+/',
' ', trim($item->getAttribute(
"default")));
81 $organization = $doc->getElementsByTagName(
"organization");
84 foreach ($organization as $element) {
85 if (preg_replace(
'/(%20)+/',
' ', trim($element->getAttribute(
"identifier"))) == $default) {
86 $default_organization = $element;
91 $seqCollection = $doc->getElementsByTagName(
"sequencingCollection")->item(0);
93 $root = $this->
buildNode($default_organization, $seqCollection, $doc);
96 $objectivesGlobalToSystem = $default_organization->getAttributeNS(
"http://www.adlnet.org/xsd/adlseq_v1p3",
"objectivesGlobalToSystem");
98 $org = preg_replace(
'/(%20)+/',
' ', trim($default_organization->getAttribute(
"identifier")));
103 if ($objectivesGlobalToSystem ===
"false") {
108 $dataGlobalToSystem = $default_organization->getAttributeNS(
"http://www.adlnet.org/xsd/adlcp_v1p3",
"sharedDataGlobalToSystem");
111 $dataglobaltosystem = 1;
113 if ($dataGlobalToSystem ===
"false") {
114 $dataglobaltosystem = 0;
118 $c_root[
'_SeqActivity'] = $root;
120 $ret[
'global'] = $globaltosystem;
121 $ret[
'dataglobal'] = $dataglobaltosystem;
122 $ret[
'tree'] = $c_root;
135 $act->setID(preg_replace(
'/(%20)+/',
' ', trim($node->getAttribute(
"identifier"))));
137 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($node->getAttribute(
"identifierref")));
139 $act->setResourceID($tempVal);
142 $tempVal = $node->getAttribute(
"isvisible");
145 $act->setIsVisible(self::convert_to_bool($tempVal));
151 $children = $node->childNodes;
153 for ($i = 0; $i < $children->length; $i++) {
154 $curNode = $children->item($i);
157 if ($curNode->nodeType == XML_ELEMENT_NODE) {
159 if ($curNode->localName ===
"item") {
162 $nestedAct = $this->
buildNode($curNode, $seq, $doc);
163 if ($nestedAct !=
null) {
164 $act->AddChild((
object) $nestedAct);
166 } elseif ($curNode->localName ===
"title") {
167 $act->setTitle(self::lookupElement($curNode,
null));
168 } elseif ($curNode->localName ===
"completionThreshold") {
169 $tempVal = $curNode->getAttribute(
"minProgressMeasure");
172 $act->setCompletionThreshold($tempVal);
173 } elseif ($curNode->nodeValue !=
null && $curNode->nodeValue !=
'') {
174 $act->setCompletionThreshold((
float) $curNode->nodeValue);
177 $tempVal = $curNode->getAttribute(
"progressWeight");
180 $act->setProgressWeight($tempVal);
182 $tempVal = $curNode->getAttribute(
"completedByMeasure");
185 $act->setCompletedByMeasure(self::convert_to_bool($tempVal));
187 } elseif ($curNode->localName ===
"sequencing") {
190 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"IDRef")));
197 $sequencing = $seq->getElementsByTagName(
"sequencing");
200 foreach ($sequencing as $element) {
201 if (preg_replace(
'/(%20)+/',
' ', trim($element->getAttribute(
"ID"))) == $tempVal) {
202 $seqGlobal = $element;
207 $seqInfo = $seqGlobal->cloneNode(
true);
210 $seqChildren = $curNode->childNodes;
211 for ($j = 0; $j < $seqChildren->length; $j++) {
213 $curChild = $seqChildren->item($j);
214 if ($curChild->nodeType == XML_ELEMENT_NODE) {
217 $seqInfo->appendChild($curChild);
229 $item = $children->item($i)->nodeValue;
240 $children = $iNode->childNodes;
241 for ($i = 0; $i < $children->length; $i++) {
242 $curNode = $children->item($i);
243 if ($curNode->nodeType == XML_ELEMENT_NODE) {
244 if ($curNode->localName ===
"controlMode") {
246 $tempVal = $curNode->getAttribute(
"choice");
248 $ioAct->setControlModeChoice(self::convert_to_bool($tempVal));
251 $tempVal = $curNode->getAttribute(
"choiceExit");
253 $ioAct->setControlModeChoiceExit(self::convert_to_bool($tempVal));
257 $tempVal = $curNode->getAttribute(
"flow");
259 $ioAct->setControlModeFlow(self::convert_to_bool($tempVal));
263 $tempVal = $curNode->getAttribute(
"forwardOnly");
265 $ioAct->setControlForwardOnly(self::convert_to_bool($tempVal));
269 $tempVal = $curNode->getAttribute(
"useCurrentAttemptObjectiveInfo");
271 $ioAct->setUseCurObjective(self::convert_to_bool($tempVal));
275 $tempVal = $curNode->getAttribute(
"useCurrentAttemptProgressInfo");
277 $ioAct->setUseCurProgress(self::convert_to_bool($tempVal));
279 } elseif ($curNode->localName ===
"sequencingRules") {
280 $ioAct = self::getSequencingRules($curNode, $ioAct);
281 } elseif ($curNode->localName ===
"limitConditions") {
283 $tempVal = $curNode->getAttribute(
"attemptLimit");
285 $ioAct->setAttemptLimit($tempVal);
289 $tempVal = $curNode->getAttribute(
"attemptAbsoluteDurationLimit");
291 $ioAct->setAttemptAbDur($tempVal);
295 $tempVal = $curNode->getAttribute(
"attemptExperiencedDurationLimit");
297 $ioAct->setAttemptExDur($tempVal);
301 $tempVal = $curNode->getAttribute(
"activityAbsoluteDurationLimit");
303 $ioAct->setActivityAbDur($tempVal);
307 $tempVal = $curNode->getAttribute(
"activityExperiencedDurationLimit");
309 $ioAct->setActivityExDur($tempVal);
313 $tempVal = $curNode->getAttribute(
"beginTimeLimit");
315 $ioAct->setBeginTimeLimit($tempVal);
319 $tempVal = $curNode->getAttribute(
"endTimeLimit");
321 $ioAct->setEndTimeLimit($tempVal);
323 } elseif ($curNode->localName ===
"auxiliaryResources") {
324 $ioAct = self::getAuxResources($curNode, $ioAct);
325 } elseif ($curNode->localName ===
"rollupRules") {
326 $ioAct = self::getRollupRules($curNode, $ioAct);
327 } elseif ($curNode->localName ===
"objectives" && $curNode->namespaceURI ===
"http://www.imsglobal.org/xsd/imsss") {
328 $ioAct = self::getObjectives($curNode, $ioAct);
329 } elseif ($curNode->localName ===
"objectives" && $curNode->namespaceURI ===
"http://www.adlnet.org/xsd/adlseq_v1p3") {
330 $ioAct = self::getADLSEQObjectives($curNode, $ioAct);
331 } elseif ($curNode->localName ===
"randomizationControls") {
333 $tempVal = $curNode->getAttribute(
"randomizationTiming");
335 $ioAct->setRandomTiming($tempVal);
339 $tempVal = $curNode->getAttribute(
"selectCount");
341 $ioAct->setSelectCount($tempVal);
345 $tempVal = $curNode->getAttribute(
"reorderChildren");
347 $ioAct->setReorderChildren(self::convert_to_bool($tempVal));
351 $tempVal = $curNode->getAttribute(
"selectionTiming");
353 $ioAct->setSelectionTiming($tempVal);
355 } elseif ($curNode->localName ===
"deliveryControls") {
357 $tempVal = $curNode->getAttribute(
"tracked");
359 $ioAct->setIsTracked(self::convert_to_bool($tempVal));
363 $tempVal = $curNode->getAttribute(
"completionSetByContent");
365 $ioAct->setSetCompletion(self::convert_to_bool($tempVal));
369 $tempVal = $curNode->getAttribute(
"objectiveSetByContent");
371 $ioAct->setSetObjective(self::convert_to_bool($tempVal));
373 } elseif ($curNode->localName ===
"constrainedChoiceConsiderations") {
375 $tempVal = $curNode->getAttribute(
"preventActivation");
377 $ioAct->setPreventActivation(self::convert_to_bool($tempVal));
381 $tempVal = $curNode->getAttribute(
"constrainChoice");
383 $ioAct->setConstrainChoice(self::convert_to_bool($tempVal));
385 } elseif ($curNode->localName ===
"rollupConsiderations") {
387 $tempVal = $curNode->getAttribute(
"requiredForSatisfied");
389 $ioAct->setRequiredForSatisfied($tempVal);
393 $tempVal = $curNode->getAttribute(
"requiredForNotSatisfied");
395 $ioAct->setRequiredForNotSatisfied($tempVal);
399 $tempVal = $curNode->getAttribute(
"requiredForCompleted");
401 $ioAct->setRequiredForCompleted($tempVal);
405 $tempVal = $curNode->getAttribute(
"requiredForIncomplete");
407 $ioAct->setRequiredForIncomplete($tempVal);
411 $tempVal = $curNode->getAttribute(
"measureSatisfactionIfActive");
413 $ioAct->setSatisfactionIfActive(self::convert_to_bool($tempVal));
432 $children = $iNode->childNodes;
433 for ($i = 0; $i < $children->length; $i++) {
434 $curNode = $children->item($i);
435 if ($curNode->nodeType == XML_ELEMENT_NODE) {
436 if ($curNode->localName ===
"primaryObjective" || $curNode->localName ===
"objective") {
438 if ($curNode->localName ===
"primaryObjective") {
439 $obj->mContributesToRollup =
true;
443 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"objectiveID")));
445 $obj->mObjID = $tempVal;
449 $tempVal = $curNode->getAttribute(
"satisfiedByMeasure");
451 $obj->mSatisfiedByMeasure = self::convert_to_bool($tempVal);
454 $tempVal = self::lookupElement($curNode,
"minNormalizedMeasure");
456 $obj->mMinMeasure = (float) $tempVal;
460 $maps = self::getObjectiveMaps($curNode);
466 $c_obj[
'_SeqObjective'] = $obj;
480 $children = $iNode->childNodes;
481 for ($i = 0; $i < $children->length; $i++) {
482 $curNode = $children->item($i);
483 if ($curNode->nodeType == XML_ELEMENT_NODE) {
484 if ($curNode->localName ===
"objective") {
486 $adlseqobjid = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"objectiveID")));
491 $seqobj = $value[
'_SeqObjective'];
492 if ($seqobj->mObjID == $adlseqobjid) {
493 $curseqobj = $seqobj;
494 $curseqobjindex = $j;
500 if ($curseqobj !=
null) {
502 $curseqobj = self::getADLSeqMaps($curNode, $curseqobj);
503 $seqobj = $curseqobj;
504 $objectives[$curseqobjindex][
'_SeqObjective'] = $seqobj;
517 if (count($curseqobj->mMaps) ==
null) {
518 $curseqobj->mMaps = array();
520 $maps = $curseqobj->mMaps;
522 $children = $iNode->childNodes;
523 for ($i = 0; $i < $children->length; $i++) {
524 $curNode = $children->item($i);
525 if ($curNode->nodeType == XML_ELEMENT_NODE) {
526 if ($curNode->localName ===
"mapInfo") {
528 $curadltargetobjid = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"targetObjectiveID")));
530 $matchingmapindex = -1;
531 foreach ($maps as $j => $value) {
532 if ($value[
'_SeqObjectiveMap']->mGlobalObjID == $curadltargetobjid) {
533 $map = $value[
'_SeqObjectiveMap'];
534 $matchingmapindex = $j;
538 $map = self::fillinADLSeqMaps($curNode, $map);
540 $c_map[
'_SeqObjectiveMap'] = $map;
541 if ($matchingmapindex > -1) {
542 $maps[$matchingmapindex] = $c_map;
549 $curseqobj->mMaps = $maps;
555 if ($map->mGlobalObjID ==
null) {
556 $map->mGlobalObjID = preg_replace(
'/(%20)+/',
' ', trim($iNode->getAttribute(
"targetObjectiveID")));
559 $tempVal = $iNode->getAttribute(
"readRawScore");
561 $map->mReadRawScore = self::convert_to_bool($tempVal);
564 $tempVal = $iNode->getAttribute(
"readMinScore");
566 $map->mReadMinScore = self::convert_to_bool($tempVal);
569 $tempVal = $iNode->getAttribute(
"readMaxScore");
571 $map->mReadMaxScore = self::convert_to_bool($tempVal);
574 $tempVal = $iNode->getAttribute(
"readCompletionStatus");
576 $map->mReadCompletionStatus = self::convert_to_bool($tempVal);
579 $tempVal = $iNode->getAttribute(
"readProgressMeasure");
581 $map->mReadProgressMeasure = self::convert_to_bool($tempVal);
584 $tempVal = $iNode->getAttribute(
"writeRawScore");
586 $map->mWriteRawScore = self::convert_to_bool($tempVal);
589 $tempVal = $iNode->getAttribute(
"writeMinScore");
591 $map->mWriteMinScore = self::convert_to_bool($tempVal);
594 $tempVal = $iNode->getAttribute(
"writeMaxScore");
596 $map->mWriteMaxScore = self::convert_to_bool($tempVal);
599 $tempVal = $iNode->getAttribute(
"writeCompletionStatus");
601 $map->mWriteCompletionStatus = self::convert_to_bool($tempVal);
604 $tempVal = $iNode->getAttribute(
"writeProgressMeasure");
606 $map->mWriteProgressMeasure = self::convert_to_bool($tempVal);
616 $children = $iNode->childNodes;
617 for ($i = 0; $i < $children->length; $i++) {
618 $curNode = $children->item($i);
619 if ($curNode->nodeType == XML_ELEMENT_NODE) {
620 if ($curNode->localName ===
"mapInfo") {
624 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"targetObjectiveID")));
626 $map->mGlobalObjID = $tempVal;
630 $tempVal = $curNode->getAttribute(
"readSatisfiedStatus");
632 $map->mReadStatus = self::convert_to_bool($tempVal);
636 $tempVal = $curNode->getAttribute(
"readNormalizedMeasure");
638 $map->mReadMeasure = self::convert_to_bool($tempVal);
642 $tempVal = $curNode->getAttribute(
"writeSatisfiedStatus");
644 $map->mWriteStatus = self::convert_to_bool($tempVal);
648 $tempVal = $curNode->getAttribute(
"writeNormalizedMeasure");
650 $map->mWriteMeasure = self::convert_to_bool($tempVal);
653 $c_map[
'_SeqObjectiveMap'] = $map;
658 if (count($maps) ==
null) {
668 $rollupRules = array();
671 $tempVal = $iNode->getAttribute(
"rollupObjectiveSatisfied");
673 $ioAct->setIsObjRolledUp(self::convert_to_bool($tempVal));
677 $tempVal = $iNode->getAttribute(
"objectiveMeasureWeight");
679 $ioAct->setObjMeasureWeight($tempVal);
682 $tempVal = $iNode->getAttribute(
"rollupProgressCompletion");
684 $ioAct->setIsProgressRolledUp(self::convert_to_bool($tempVal));
686 $children = $iNode->childNodes;
687 for ($i = 0; $i < $children->length; $i++) {
688 $curNode = $children->item($i);
689 if ($curNode->nodeType == XML_ELEMENT_NODE) {
690 if ($curNode->localName ===
"rollupRule") {
694 $tempVal = $curNode->getAttribute(
"childActivitySet");
696 $rule->mChildActivitySet = $tempVal;
699 $tempVal = $curNode->getAttribute(
"minimumCount");
701 $rule->mMinCount = $tempVal;
705 $tempVal = $curNode->getAttribute(
"minimumPercent");
707 $rule->mMinPercent = $tempVal;
710 $conditions = array();
711 $ruleInfo = $curNode->childNodes;
712 for ($j = 0; $j < $ruleInfo->length; $j++) {
713 $curRule = $ruleInfo->item($j);
715 if ($curRule->nodeType == XML_ELEMENT_NODE) {
716 if ($curRule->localName ===
"rollupConditions") {
717 $tempVal = $curRule->getAttribute(
"conditionCombination");
719 $rule->mConditions[
'_SeqConditionSet']->mCombination = $tempVal;
721 $rule->mConditions[
'_SeqConditionSet']->mCombination =
COMBINATION_ANY;
723 $conds = $curRule->childNodes;
724 for ($k = 0; $k < $conds->length; $k++) {
725 $con = $conds->item($k);
726 if ($con->nodeType == XML_ELEMENT_NODE) {
727 if ($con->localName ===
"rollupCondition") {
730 $tempVal = $con->getAttribute(
"condition");
732 $cond->mCondition = $tempVal;
735 $tempVal = $con->getAttribute(
"operator");
737 if ($tempVal ===
'not') {
744 $c_cond[
'_SeqCondition'] = $cond;
745 $conditions[] = $c_cond;
749 } elseif ($curRule->localName ===
"rollupAction") {
750 $tempVal = $curRule->getAttribute(
"action");
752 $rule->setRollupAction($tempVal);
758 $rule->mConditions[
'_SeqConditionSet']->mConditions = $conditions;
762 $c_rule[
'_SeqRollupRule'] = $rule;
763 $rollupRules[] = $c_rule;
768 if ($rollupRules !=
null) {
772 $c_rules[
'_SeqRollupRuleset'] = $rules;
773 $ioAct->setRollupRules($c_rules);
787 $exitRules = array();
788 $postRules = array();
791 $children = $iNode->childNodes;
794 for ($i = 0; $i < $children->length; $i++) {
795 $curNode = $children->item($i);
796 if ($curNode->nodeType == XML_ELEMENT_NODE) {
797 if ($curNode->localName ===
"preConditionRule" || $curNode->localName ===
"exitConditionRule" || $curNode->localName ===
"postConditionRule") {
799 $ruleInfo = $curNode->childNodes;
800 for ($j = 0; $j < $ruleInfo->length; $j++) {
801 $curRule = $ruleInfo->item($j);
803 if ($curRule->nodeType == XML_ELEMENT_NODE) {
804 if ($curRule->localName ===
"ruleConditions") {
805 $rule->mConditions = self::extractSeqRuleConditions($curRule);
806 } elseif ($curRule->localName ===
"ruleAction") {
807 $tempVal = $curRule->getAttribute(
"action");
809 $rule->mAction = $tempVal;
814 if ($rule->mConditions !=
null && $rule->mAction !=
null) {
816 if ($curNode->localName ===
"preConditionRule") {
819 $c_rule[
'_SeqRule'] = $rule;
820 $preRules[] = $c_rule;
822 if ($curNode->localName ===
"exitConditionRule") {
825 $c_rule[
'_SeqRule'] = $rule;
826 $exitRules[] = $c_rule;
828 if ($curNode->localName ===
"postConditionRule") {
831 $c_rule[
'_SeqRule'] = $rule;
832 $postRules[] = $c_rule;
839 if (count($preRules) > 0) {
842 $c_rules[
'_SeqRuleset'] = $rules;
843 $ioAct->setPreSeqRules($c_rules);
846 if (count($exitRules) > 0) {
849 $c_rules[
'_SeqRuleset'] = $rules;
850 $ioAct->setExitSeqRules($c_rules);
852 if (count($postRules) > 0) {
855 $c_rules[
'_SeqRuleset'] = $rules;
856 $ioAct->setPostSeqRules($c_rules);
868 $conditions = array();
869 $tempVal = $iNode->getAttribute(
"conditionCombination");
871 $condSet->mCombination = $tempVal;
875 $condInfo = $iNode->childNodes;
876 for ($i = 0; $i < $condInfo->length; $i++) {
877 $curCond = $condInfo->item($i);
878 if ($curCond->nodeType == XML_ELEMENT_NODE) {
879 if ($curCond->localName ===
"ruleCondition") {
883 $tempVal = $curCond->getAttribute(
"condition");
885 $cond->mCondition = $tempVal;
889 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curCond->getAttribute(
"referencedObjective")));
891 $cond->mObjID = $tempVal;
895 $tempVal = $curCond->getAttribute(
"measureThreshold");
897 $cond->mThreshold = $tempVal;
901 $tempVal = $curCond->getAttribute(
"operator");
903 if ($tempVal ===
'not') {
911 $c_cond[
'_SeqCondition'] = $cond;
912 $conditions[] = $c_cond;
917 if (count($conditions) > 0) {
918 $condSet->mConditions = $conditions;
920 $condSet->mConditions =
null;
923 $c_condSet[
'_SeqConditionSet'] = $condSet;
933 $children = $iNode->childNodes;
936 for ($i = 0; $i < $children->length; $i++) {
937 $curNode = $children->item($i);
938 if ($curNode->nodeType == XML_ELEMENT_NODE) {
939 if ($curNode->localName ===
"auxiliaryResource") {
944 $tempVal = $curNode->getAttribute(
"purpose");
946 $res->mType = $tempVal;
949 $tempVal = preg_replace(
'/(%20)+/',
' ', trim($curNode->getAttribute(
"auxiliaryResourceID")));
951 $res->mResourceID = $tempVal;
958 $c_auxRes[
'_ADLAuxiliaryResource'] = $auxRes;
959 $ioAct->setAuxResources($c_auxRes);
967 return strtoupper($string) !==
"FALSE";
971 private static function lookupElement(
object $iNode, ?
string $iElement): ?string
977 if ($iNode !=
null && $iElement !=
null) {
978 $children = $iNode->childNodes;
979 for ($i = 0; $i < $children->length; $i++) {
980 $curNode = $children->item($i);
981 if (($curNode->nodeType == XML_ELEMENT_NODE)) {
982 if ($curNode->localName == $iElement) {
987 if ($curNode !=
null) {
988 $comp = $curNode->localName;
990 if ($comp != $iElement) {
1002 if ($curNode !=
null) {
1003 $children = $curNode->childNodes;
1004 if ($children !=
null) {
1005 for ($i = 0; $i < $children->length; $i++) {
1006 $curNode = $children->item($i);
1008 if (($curNode->nodeType == XML_TEXT_NODE) || ($curNode->nodeType == XML_CDATA_SECTION_NODE)) {
1009 $value = $value . $curNode->nodeValue;
static getLogger(string $a_component_id)
Get component logger.
static convert_to_bool(string $string)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getRollupRules(object $iNode, object $ioAct)
static getAuxResources(object $iNode, object $ioAct)
extractSeqInfo(object $iNode, object $ioAct)
static fillinADLSeqMaps(object $iNode, object $map)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static getObjectives(object $iNode, object $ioAct)
static getADLSEQObjectives(object $iNode, object $ioAct)
buildNode(object $node, ?object $seq, object $doc)
static getObjectiveMaps(object $iNode)
static extractSeqRuleConditions(object $iNode)
buildNodeSeqTree(string $file)
static lookupElement(object $iNode, ?string $iElement)
static getADLSeqMaps(object $iNode, object $curseqobj)
static getSequencingRules(object $iNode, object $ioAct)