public function getQtiResultXml($deliveryId, $resultId) { $delivery = new \core_kernel_classes_Resource($deliveryId); $resultService = $this->getServiceLocator()->get(ResultServerService::SERVICE_ID); $resultServer = $resultService->getResultStorage($deliveryId); $crudService = new CrudResultsService(); $dom = new \DOMDocument('1.0', 'UTF-8'); $dom->formatOutput = true; $itemResults = $crudService->format($resultServer, $resultId, CrudResultsService::GROUP_BY_ITEM); $testResults = $crudService->format($resultServer, $resultId, CrudResultsService::GROUP_BY_TEST); $assessmentResultElt = $dom->createElementNS(self::QTI_NS, 'assessmentResult'); $dom->appendChild($assessmentResultElt); /** Context */ $contextElt = $dom->createElementNS(self::QTI_NS, 'context'); $contextElt->setAttribute('sourcedId', \tao_helpers_Uri::getUniqueId($resultServer->getTestTaker($resultId))); $assessmentResultElt->appendChild($contextElt); /** Test Result */ foreach ($testResults as $testResultIdentifier => $testResult) { $identifierParts = explode('.', $testResultIdentifier); $testIdentifier = array_pop($identifierParts); $testResultElement = $dom->createElementNS(self::QTI_NS, 'testResult'); $testResultElement->setAttribute('identifier', $testIdentifier); $testResultElement->setAttribute('datestamp', \tao_helpers_Date::displayeDate($testResult[0]['epoch'], \tao_helpers_Date::FORMAT_ISO8601)); /** Item Variable */ foreach ($testResult as $itemVariable) { $isResponseVariable = $itemVariable['type']->getUri() === 'http://www.tao.lu/Ontologies/TAOResult.rdf#ResponseVariable'; $testVariableElement = $dom->createElementNS(self::QTI_NS, $isResponseVariable ? 'responseVariable' : 'outcomeVariable'); $testVariableElement->setAttribute('identifier', $itemVariable['identifier']); $testVariableElement->setAttribute('cardinality', $itemVariable['cardinality']); $testVariableElement->setAttribute('baseType', $itemVariable['basetype']); $valueElement = $this->createCDATANode($dom, 'value', trim($itemVariable['value'])); if ($isResponseVariable) { $candidateResponseElement = $dom->createElementNS(self::QTI_NS, 'candidateResponse'); $candidateResponseElement->appendChild($valueElement); $testVariableElement->appendChild($candidateResponseElement); } else { $testVariableElement->appendChild($valueElement); } $testResultElement->appendChild($testVariableElement); } $assessmentResultElt->appendChild($testResultElement); } /** Item Result */ foreach ($itemResults as $itemResultIdentifier => $itemResult) { // Retrieve identifier. $identifierParts = explode('.', $itemResultIdentifier); $occurenceNumber = array_pop($identifierParts); $refIdentifier = array_pop($identifierParts); $itemElement = $dom->createElementNS(self::QTI_NS, 'itemResult'); $itemElement->setAttribute('identifier', $refIdentifier); $itemElement->setAttribute('datestamp', \tao_helpers_Date::displayeDate($itemResult[0]['epoch'], \tao_helpers_Date::FORMAT_ISO8601)); $itemElement->setAttribute('sessionStatus', 'final'); /** Item variables */ foreach ($itemResult as $key => $itemVariable) { $isResponseVariable = $itemVariable['type']->getUri() === 'http://www.tao.lu/Ontologies/TAOResult.rdf#ResponseVariable'; if ($itemVariable['identifier'] == 'comment') { /** Comment */ $itemVariableElement = $dom->createElementNS(self::QTI_NS, 'candidateComment', $itemVariable['value']); } else { /** Item variable */ $itemVariableElement = $dom->createElementNS(self::QTI_NS, $isResponseVariable ? 'responseVariable' : 'outcomeVariable'); $itemVariableElement->setAttribute('identifier', $itemVariable['identifier']); $itemVariableElement->setAttribute('cardinality', $itemVariable['cardinality']); $itemVariableElement->setAttribute('baseType', $itemVariable['basetype']); /** Split multiple response */ $itemVariable['value'] = trim($itemVariable['value'], '[]'); if ($itemVariable['cardinality'] !== Cardinality::getNameByConstant(Cardinality::SINGLE)) { $values = explode(';', $itemVariable['value']); $returnValue = []; foreach ($values as $value) { $returnValue[] = $this->createCDATANode($dom, 'value', $value); } } else { $returnValue = $this->createCDATANode($dom, 'value', $itemVariable['value']); } /** Get response parent element */ if ($isResponseVariable) { /** Response variable */ $responseElement = $dom->createElementNS(self::QTI_NS, 'candidateResponse'); } else { /** Outcome variable */ $responseElement = $itemVariableElement; } /** Write a response node foreach answer */ if (is_array($returnValue)) { foreach ($returnValue as $valueElement) { $responseElement->appendChild($valueElement); } } else { $responseElement->appendChild($returnValue); } if ($isResponseVariable) { $itemVariableElement->appendChild($responseElement); } } $itemElement->appendChild($itemVariableElement); } $assessmentResultElt->appendChild($itemElement); } return $dom->saveXML(); }
public function __construct() { parent::__construct(); $this->service = CrudResultsService::singleton(); }