Esempio n. 1
0
 /**
  * Register all needed information about the TestPart involved in a given
  * $routeItem.
  *
  * @param \qtism\runtime\tests\RouteItem $routeItem A RouteItem object.
  */
 protected function registerTestPart(RouteItem $routeItem)
 {
     // Register the RouteItem in the testPartMap.
     $testPart = $routeItem->getTestPart();
     if (isset($this->testPartMap[$testPart]) === false) {
         $this->testPartMap[$testPart] = array();
     }
     $target = $this->testPartMap[$testPart];
     $target[] = $routeItem;
     $this->testPartMap[$testPart] = $target;
     // Register the RouteItem in the testPartIdentifierMap.
     $id = $testPart->getIdentifier();
     if (isset($this->testPartIdentifierMap[$id]) === false) {
         $this->testPartIdentifierMap[$id] = array();
     }
     $this->testPartIdentifierMap[$id][] = $routeItem;
 }
 /**
  * Gets the tags describing a particular item with an assessment test
  * @param RouteItem $routeItem
  * @return array
  */
 public function getItemTags(RouteItem $routeItem)
 {
     $test = $routeItem->getAssessmentTest();
     $testPart = $routeItem->getTestPart();
     $sections = $routeItem->getAssessmentSections();
     $sectionId = key(current($sections));
     $itemRef = $routeItem->getAssessmentItemRef();
     $itemId = $itemRef->getIdentifier();
     $occurrence = $routeItem->getOccurence();
     $tags = [$itemId, $itemId . '#' . $occurrence, $sectionId, $testPart->getIdentifier(), $test->getIdentifier(), $itemRef->getHref()];
     if ($this->isRunning() === true) {
         $tags[] = $this->getItemAttemptTag($routeItem);
     }
     return $tags;
 }
Esempio n. 3
0
 /**
  * Write a route item in the current binary stream.
  *
  * @param \qtism\runtime\storage\common\AssessmentTestSeeker $seeker An AssessmentTestSeeker object in order to know tree position for involved QTI Components.
  * @param \qtism\runtime\tests\RouteItem $routeItem A RouteItem object.
  * @throws \qtism\runtime\storage\binary\QtiBinaryStreamAccessException
  */
 public function writeRouteItem(AssessmentTestSeeker $seeker, RouteItem $routeItem)
 {
     try {
         $this->writeTinyInt($routeItem->getOccurence());
         $this->writeShort($seeker->seekPosition($routeItem->getAssessmentItemRef()));
         $this->writeShort($seeker->seekPosition($routeItem->getTestPart()));
         $assessmentSections = $routeItem->getAssessmentSections();
         $this->writeTinyInt(count($assessmentSections));
         foreach ($assessmentSections as $assessmentSection) {
             $this->writeShort($seeker->seekPosition($assessmentSection));
         }
         $branchRules = $routeItem->getBranchRules();
         $this->writeTinyInt(count($branchRules));
         foreach ($branchRules as $branchRule) {
             $this->writeShort($seeker->seekPosition($branchRule));
         }
         $preConditions = $routeItem->getPreConditions();
         $this->writeTinyInt(count($preConditions));
         foreach ($preConditions as $preCondition) {
             $this->writeShort($seeker->seekPosition($preCondition));
         }
     } catch (BinaryStreamAccessException $e) {
         $msg = "An error occured while writing a route item.";
         throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e);
     } catch (OutOfBoundsException $e) {
         $msg = "A QTI Component position was not found in the assessmentTest tree structure.";
         throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e);
     }
 }
 /**
  * Write a route item in the current binary stream.
  * 
  * @param AssessmentTestSeeker $seeker An AssessmentTestSeeker object in order to know tree position for involved QTI Components.
  * @param RouteItem $routeItem A RouteItem object.
  * @throws QtiBinaryStreamAccessException
  */
 public function writeRouteItem(AssessmentTestSeeker $seeker, RouteItem $routeItem)
 {
     try {
         $this->writeTinyInt($routeItem->getOccurence());
         $this->writeShort($seeker->seekPosition($routeItem->getAssessmentItemRef()));
         if (QtiBinaryConstants::QTI_BINARY_STORAGE_VERSION <= 2) {
             // Prior to version 3, only a single assessmentSection might be bound
             // to the RouteItem.
             $this->writeShort($seeker->seekPosition($routeItem->getAssessmentSection()));
         }
         $this->writeShort($seeker->seekPosition($routeItem->getTestPart()));
         if (QtiBinaryConstants::QTI_BINARY_STORAGE_VERSION >= 3) {
             $assessmentSections = $routeItem->getAssessmentSections();
             // From version 3, multiple assessmentSections might be bound
             // to the RouteItem.
             $this->writeTinyInt(count($assessmentSections));
             foreach ($assessmentSections as $assessmentSection) {
                 $this->writeShort($seeker->seekPosition($assessmentSection));
             }
         }
         $branchRules = $routeItem->getBranchRules();
         $this->writeTinyInt(count($branchRules));
         foreach ($branchRules as $branchRule) {
             $this->writeShort($seeker->seekPosition($branchRule));
         }
         $preConditions = $routeItem->getPreConditions();
         $this->writeTinyInt(count($preConditions));
         foreach ($preConditions as $preCondition) {
             $this->writeShort($seeker->seekPosition($preCondition));
         }
     } catch (BinaryStreamAccessException $e) {
         $msg = "An error occured while writing a route item.";
         throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e);
     } catch (OutOfBoundsException $e) {
         $msg = "A QTI Component position was not found in the assessmentTest tree structure.";
         throw new QtiBinaryStreamAccessException($msg, $this, QtiBinaryStreamAccessException::ROUTE_ITEM, $e);
     }
 }
 /**
  * Checks if an item has been completed
  * @param RouteItem $routeItem
  * @param AssessmentItemSession $itemSession
  * @return bool
  */
 public static function isItemCompleted(RouteItem $routeItem, AssessmentItemSession $itemSession)
 {
     $completed = false;
     if ($routeItem->getTestPart()->getNavigationMode() === NavigationMode::LINEAR) {
         // In linear mode, we consider the item completed if it was presented.
         if ($itemSession->isPresented() === true) {
             $completed = true;
         }
     } else {
         // In nonlinear mode we consider:
         // - an adaptive item completed if it's completion status is 'completed'.
         // - a non-adaptive item to be completed if it is responded.
         $isAdaptive = $itemSession->getAssessmentItem()->isAdaptive();
         if ($isAdaptive === true && $itemSession['completionStatus']->getValue() === AssessmentItemSession::COMPLETION_STATUS_COMPLETED) {
             $completed = true;
         } else {
             if ($isAdaptive === false && $itemSession->isResponded() === true) {
                 $completed = true;
             }
         }
     }
     return $completed;
 }