/** * Unmarshall an extended version of an assessmentItemRef DOMElement into * a ExtendedAssessmentItemRef object. * * @param \DOMElement $element * @return \qtism\data\ExtendedAssessmentItemRef A ExtendedAssessmentItemRef object. */ protected function unmarshall(DOMElement $element) { $baseComponent = parent::unmarshall($element); $identifier = $baseComponent->getIdentifier(); $href = $baseComponent->getHref(); $compactAssessmentItemRef = new ExtendedAssessmentItemRef($identifier, $href); $compactAssessmentItemRef->setRequired($baseComponent->isRequired()); $compactAssessmentItemRef->setFixed($baseComponent->isFixed()); $compactAssessmentItemRef->setPreConditions($baseComponent->getPreConditions()); $compactAssessmentItemRef->setBranchRules($baseComponent->getBranchRules()); $compactAssessmentItemRef->setItemSessionControl($baseComponent->getItemSessionControl()); $compactAssessmentItemRef->setTimeLimits($baseComponent->getTimeLimits()); $compactAssessmentItemRef->setTemplateDefaults($baseComponent->getTemplateDefaults()); $compactAssessmentItemRef->setWeights($baseComponent->getWeights()); $compactAssessmentItemRef->setVariableMappings($baseComponent->getVariableMappings()); $compactAssessmentItemRef->setCategories($baseComponent->getCategories()); // ResponseDeclarations. $responseDeclarationElts = self::getChildElementsByTagName($element, 'responseDeclaration'); $responseDeclarations = new ResponseDeclarationCollection(); foreach ($responseDeclarationElts as $responseDeclarationElt) { $marshaller = $this->getMarshallerFactory()->createMarshaller($responseDeclarationElt); $responseDeclarations[] = $marshaller->unmarshall($responseDeclarationElt); } $compactAssessmentItemRef->setResponseDeclarations($responseDeclarations); // OutcomeDeclarations. $outcomeDeclarationElts = self::getChildElementsByTagName($element, 'outcomeDeclaration'); $outcomeDeclarations = new OutcomeDeclarationCollection(); foreach ($outcomeDeclarationElts as $outcomeDeclarationElt) { $marshaller = $this->getMarshallerFactory()->createMarshaller($outcomeDeclarationElt); $outcomeDeclarations[] = $marshaller->unmarshall($outcomeDeclarationElt); } $compactAssessmentItemRef->setOutcomeDeclarations($outcomeDeclarations); // TemplateDeclarations. $templateDeclarationElts = self::getChildElementsByTagName($element, 'templateDeclaration'); $templateDeclarations = new TemplateDeclarationCollection(); foreach ($templateDeclarationElts as $templateDeclarationElt) { $marshaller = $this->getMarshallerFactory()->createMarshaller($templateDeclarationElt); $templateDeclarations[] = $marshaller->unmarshall($templateDeclarationElt); } $compactAssessmentItemRef->setTemplateDeclarations($templateDeclarations); // TemplateProcessing. $templateProcessingElts = self::getChildElementsByTagName($element, 'templateProcessing'); if (count($templateProcessingElts) === 1) { $marshaller = $this->getMarshallerFactory()->createMarshaller($templateProcessingElts[0]); $compactAssessmentItemRef->setTemplateProcessing($marshaller->unmarshall($templateProcessingElts[0])); } // ResponseProcessing. $responseProcessingElts = self::getChildElementsByTagName($element, 'responseProcessing'); if (count($responseProcessingElts) === 1) { $marshaller = $this->getMarshallerFactory()->createMarshaller($responseProcessingElts[0]); $compactAssessmentItemRef->setResponseProcessing($marshaller->unmarshall($responseProcessingElts[0])); } // ModalFeedbacks (transformed in ModalFeedbackRules). $modalFeedbackElts = self::getChildElementsByTagName($element, 'modalFeedbackRule'); $modalFeedbackRules = new ModalFeedbackRuleCollection(); foreach ($modalFeedbackElts as $modalFeedbackElt) { $marshaller = $this->getMarshallerFactory()->createMarshaller($modalFeedbackElt); $modalFeedbackRules[] = $marshaller->unmarshall($modalFeedbackElt); } $compactAssessmentItemRef->setModalFeedbackRules($modalFeedbackRules); // Shufflings. $shufflingElts = self::getChildElementsByTagName($element, 'shuffling'); $shufflings = new ShufflingCollection(); foreach ($shufflingElts as $shufflingElt) { $marshaller = $this->getMarshallerFactory()->createMarshaller($shufflingElt); $shufflings[] = $marshaller->unmarshall($shufflingElt); } $compactAssessmentItemRef->setShufflings($shufflings); if (($adaptive = static::getDOMElementAttributeAs($element, 'adaptive', 'boolean')) !== null) { $compactAssessmentItemRef->setAdaptive($adaptive); } if (($timeDependent = static::getDOMElementAttributeAs($element, 'timeDependent', 'boolean')) !== null) { $compactAssessmentItemRef->setTimeDependent($timeDependent); } else { $msg = "The mandatory attribute 'timeDependent' is missing from element '" . $element->localName . "'."; throw new UnmarshallingException($msg, $element); } if (($endAttemptIdentifiers = self::getDOMElementAttributeAs($element, 'endAttemptIdentifiers')) !== null) { $identifiersArray = explode(" ", $endAttemptIdentifiers); if (count($identifiersArray) > 0) { $compactAssessmentItemRef->setEndAttemptIdentifiers(new IdentifierCollection($identifiersArray)); } } return $compactAssessmentItemRef; }
/** * @depends testMarshallMinimal */ public function testMarshallShufflingGroups() { $factory = new CompactMarshallerFactory(); $component = new ExtendedAssessmentItemRef('Q01', './q01.xml'); $group1 = new ShufflingGroup(new IdentifierCollection(array('id1', 'id2', 'id3'))); $group2 = new ShufflingGroup(new IdentifierCollection(array('id4', 'id5', 'id6'))); $shufflingGroups = new ShufflingGroupCollection(array($group1, $group2)); $shufflings = new ShufflingCollection(array(new Shuffling('RESPONSE', $shufflingGroups))); $component->setShufflings($shufflings); $marshaller = $factory->createMarshaller($component); $element = $marshaller->marshall($component); $this->assertInstanceOf('\\DOMElement', $element); $this->assertEquals('assessmentItemRef', $element->nodeName); $this->assertEquals('Q01', $element->getAttribute('identifier')); $this->assertEquals('./q01.xml', $element->getAttribute('href')); $shufflingElts = $element->getElementsByTagName('shuffling'); $this->assertEquals(1, $shufflingElts->length); $this->assertEquals('RESPONSE', $shufflingElts->item(0)->getAttribute('responseIdentifier')); $shufflingGroupElts = $shufflingElts->item(0)->getElementsByTagName('shufflingGroup'); $this->assertEquals(2, $shufflingGroupElts->length); $this->assertEquals('id1 id2 id3', $shufflingGroupElts->item(0)->getAttribute('identifiers')); $this->assertEquals('id4 id5 id6', $shufflingGroupElts->item(1)->getAttribute('identifiers')); }
/** * Dereference the file referenced by an assessmentItemRef and add * outcome/responseDeclarations to the compact one. * * @param \qtism\data\ExtendedAssessmentItemRef $compactAssessmentItemRef A previously instantiated ExtendedAssessmentItemRef object. * @param \qtism\data\storage\FileResolver $resolver The Resolver to be used to resolver AssessmentItemRef's href attribute. * @throws \qtism\data\storage\xml\XmlStorageException If an error occurs (e.g. file not found at URI or unmarshalling issue) during the dereferencing. */ protected static function resolveAssessmentItemRef(ExtendedAssessmentItemRef $compactAssessmentItemRef, FileResolver $resolver) { try { $href = $resolver->resolve($compactAssessmentItemRef->getHref()); $doc = new XmlDocument(); $doc->load($href); $item = $doc->getDocumentComponent(); foreach ($item->getResponseDeclarations() as $resp) { $compactAssessmentItemRef->addResponseDeclaration($resp); } foreach ($item->getOutcomeDeclarations() as $out) { $compactAssessmentItemRef->addOutcomeDeclaration($out); } foreach ($item->getTemplateDeclarations() as $tpl) { $compactAssessmentItemRef->addTemplateDeclaration($tpl); } foreach ($item->getModalFeedbackRules() as $modalFeedbackRule) { $compactAssessmentItemRef->addModalFeedbackRule($modalFeedbackRule); } if ($item->hasResponseProcessing() === true) { $compactAssessmentItemRef->setResponseProcessing($item->getResponseProcessing()); } if ($item->hasTemplateProcessing() === true) { $compactAssessmentItemRef->setTemplateProcessing($item->getTemplateProcessing()); } $compactAssessmentItemRef->setShufflings($item->getShufflings()); $compactAssessmentItemRef->setAdaptive($item->isAdaptive()); $compactAssessmentItemRef->setTimeDependent($item->isTimeDependent()); $compactAssessmentItemRef->setEndAttemptIdentifiers($item->getEndAttemptIdentifiers()); } catch (Exception $e) { $msg = "An error occured while unreferencing file '{$href}'."; throw new XmlStorageException($msg, XmlStorageException::RESOLUTION, $e); } }