/** * * @param core_kernel_classes_Resource $test * @param array $itemUris * @return boolean */ public function save(core_kernel_classes_Resource $test, array $content) { $serializer = $this->getServiceLocator()->get(FileReferenceSerializer::SERVICE_ID); $serial = $test->getOnePropertyValue($this->getProperty(TEST_TESTCONTENT_PROP)); if (!is_null($serial)) { $directory = $serializer->unserializeDirectory($serial); } else { // null so create one $fss = $this->getServiceLocator()->get(FileSystemService::SERVICE_ID); $base = $fss->getDirectory($this->getOption(self::OPTION_FILESYSTEM)); $directory = $base->getDirectory(\tao_helpers_Uri::getUniqueId(\common_Utils::getNewUri())); $test->editPropertyValues($this->getProperty(TEST_TESTCONTENT_PROP), $serializer->serialize($directory)); } return $directory->getFile('content.json')->put(json_encode($content)); }
/** * Reference a Test Auxiliary File (e.g. media, stylesheet, ...) in the IMS Manifest. * * @param string $href The path (base path is the ZIP archive) to the auxiliary file in the ZIP archive. */ protected function referenceAuxiliaryFile($href) { $manifest = $this->getManifest(); $testIdentifier = tao_helpers_Uri::getUniqueId($this->getItem()->getUri()); $xpath = new DOMXPath($manifest); // Find the first <dependency> element. $dependencies = $xpath->query("//resource[@identifier='{$testIdentifier}']/dependency"); $firstDependencyElt = $dependencies->item(0); // Create an IMS Manifest <file> element. $fileElt = $manifest->createElement('file'); $fileElt->setAttribute('href', ltrim($href, '/')); $firstDependencyElt->parentNode->insertBefore($fileElt, $firstDependencyElt); }
/** * Short description of method getDefaultFilePath * * @access public * @author Somsack Sipasseuth, <*****@*****.**> * @return string */ public function getDefaultFilePath() { $returnValue = (string) ''; $returnValue = tao_helpers_Uri::getUniqueId($this->ownerInstance->getUri()) . '/' . tao_helpers_Uri::getUniqueId($this->property->getUri()); return (string) $returnValue; }
/** * Short description of method setItemContent * * @access public * @author Joel Bout, <*****@*****.**> * @param Resource item * @param string content * @param string lang * @param string commitMessage * @return boolean */ public function setItemContent(core_kernel_classes_Resource $item, $content, $lang = '', $commitMessage = '') { $returnValue = (bool) false; if (is_null($item) && !$this->isItemModelDefined($item)) { throw new common_exception_Error('No item or itemmodel in ' . __FUNCTION__); } $lang = empty($lang) ? $lang = $this->getSessionLg() : $lang; $itemModel = $item->getUniquePropertyValue($this->itemModelProperty); $dataFile = (string) $itemModel->getOnePropertyValue(new core_kernel_classes_Property(TAO_ITEM_MODEL_DATAFILE_PROPERTY)); if ($this->hasItemContent($item, $lang)) { $itemContents = $item->getPropertyValuesByLg($this->itemContentProperty, $lang); $itemContent = $itemContents->get(0); if (!core_kernel_file_File::isFile($itemContent)) { throw new common_Exception('Item ' . $item->getUri() . ' has none file itemContent'); } $file = new core_kernel_versioning_File($itemContent); $returnValue = $file->setContent($content); } else { $repository = $this->getDefaultFileSource(); $file = $repository->createFile($dataFile, tao_helpers_Uri::getUniqueId($item->getUri()) . DIRECTORY_SEPARATOR . 'itemContent' . DIRECTORY_SEPARATOR . $lang); $item->setPropertyValueByLg($this->itemContentProperty, $file->getUri(), $lang); $file->setContent($content); $returnValue = $file->add(true, true); } if ($commitMessage != 'HOLD_COMMIT') { //hack to control commit or not $returnValue = $file->commit($commitMessage); } return (bool) $returnValue; }
/** * Returns the items flysystem directory * * @param core_kernel_classes_Resource $item * @param string $language * @return \oat\oatbox\filesystem\Directory * @throws Exception * @throws common_Exception * @throws core_kernel_persistence_Exception */ public function getItemDirectory(core_kernel_classes_Resource $item, $language = '') { // Get file by language if ($language === '') { $files = $item->getPropertyValues($this->itemContentProperty); } else { $files = $item->getPropertyValuesByLg($this->itemContentProperty, $language)->toArray(); } // If multiple files then throw exception if (count($files) > 1) { common_Logger::i(print_r($files, true)); throw new common_Exception(__METHOD__ . ': Item ' . $item->getUri() . ' has multiple.'); } // If there is one file then return directory if (count($files) == 1) { $file = reset($files); $file = is_object($file) && $file instanceof core_kernel_classes_Resource ? $file->getUri() : (string) $file; return $this->getFileReferenceSerializer()->unserializeDirectory($file); } // Otherwise there is no file, create one and return directory $model = $this->getItemModel($item); if (is_null($model)) { throw new common_Exception('Call to ' . __FUNCTION__ . ' for item without model'); } // File does not exist, let's create it $actualLang = empty($language) ? $this->getSessionLg() : $language; $filePath = tao_helpers_Uri::getUniqueId($item->getUri()) . DIRECTORY_SEPARATOR . 'itemContent' . DIRECTORY_SEPARATOR . $actualLang; // Create item directory $itemDirectory = $this->getDefaultItemDirectory()->getDirectory($filePath); // Set uri file value as serial to item persistence $serial = $this->getFileReferenceSerializer()->serialize($itemDirectory); $item->setPropertyValueByLg($this->itemContentProperty, $serial, $actualLang); // Store file into persistence, purpose of serializer ? $dataFile = (string) $model->getOnePropertyValue($this->getProperty(TAO_ITEM_MODEL_DATAFILE_PROPERTY)); $this->getFileReferenceSerializer()->serialize($itemDirectory->getFile($dataFile)); return $itemDirectory; }
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(); }