public function testSanitizeQtiXml() { $xmlStr = file_get_contents($this->getSamplePath('/authoring/sanitizeQtiXml.xml')); $xml = simplexml_load_string($xmlStr); $this->assertTrue(count($xml->xpath("//*[local-name() = 'itemBody']//*[@style]")) > 0); $sanitizedXmlStr = Authoring::sanitizeQtiXml($xmlStr); $sanitizedXml = simplexml_load_string($sanitizedXmlStr); $this->assertTrue(count($sanitizedXml->xpath("//*[local-name() = 'itemBody']//*[@style]")) === 0); return $sanitizedXmlStr; }
public function testSanitizeQtiXmlMultipleIds() { $xmlStr = file_get_contents($this->getSamplePath('/authoring/sanitizeQtiXmlMultipleIds.xml')); $xml = simplexml_load_string($xmlStr); $duplicate = array(); $ids = array(); foreach ($xml->xpath("//*[@id]") as $idElement) { $id = (string) $idElement['id']; if (!in_array($id, $ids)) { $ids[] = $id; } else { if (array_key_exists($id, $duplicate)) { $duplicate[$id]++; } else { $duplicate[$id] = 2; } } } $this->assertCount(3, $duplicate); $this->assertEquals(2, $duplicate['p001']); $this->assertEquals(3, $duplicate['p002']); $this->assertEquals(4, $duplicate['p003']); $sanitizedXmlStr = Authoring::sanitizeQtiXml($xmlStr); $sanitizedXml = simplexml_load_string($sanitizedXmlStr); $duplicate = array(); $ids = array(); foreach ($sanitizedXml->xpath("//*[@id]") as $idElement) { $id = (string) $idElement['id']; if (!in_array($id, $ids)) { $ids[] = $id; } else { if (array_key_exists($id, $duplicate)) { $duplicate[$id]++; } else { $duplicate[$id] = 2; } } } $this->assertCount(0, $duplicate); return $sanitizedXmlStr; }
public function saveItem() { $returnValue = array('success' => false); if ($this->hasRequestParameter('uri')) { $uri = urldecode($this->getRequestParameter('uri')); $xml = file_get_contents('php://input'); $rdfItem = new core_kernel_classes_Resource($uri); $itemService = taoItems_models_classes_ItemsService::singleton(); //check if the item is QTI item if ($itemService->hasItemModel($rdfItem, array(ItemModel::MODEL_URI))) { try { $sanitized = Authoring::sanitizeQtiXml($xml); Authoring::validateQtiXml($sanitized); //get the QTI xml $returnValue['success'] = $itemService->setItemContent($rdfItem, $sanitized); } catch (QtiModelException $e) { throw new \RuntimeException($e->getUserMessage(), 0, $e); } } } $this->returnJson($returnValue); }
protected function createQtiItemModel($qtiFile, $validate = true) { $qtiXml = Authoring::sanitizeQtiXml($qtiFile); //validate the file to import $qtiParser = new Parser($qtiXml); if ($validate) { $basePath = common_ext_ExtensionsManager::singleton()->getExtensionById('taoQtiItem')->getDir(); $qtiParser->validate(); if (!$qtiParser->isValid()) { $failedValidation = true; $eStrs = array(); foreach ($qtiParser->getErrors() as $libXmlError) { $eStrs[] = __('QTI-XML error at line %1$d "%2$s".', $libXmlError['line'], str_replace('[LibXMLError] ', '', trim($libXmlError['message']))); } // Make sure there are no duplicate... $eStrs = array_unique($eStrs); // Add sub-report. throw new ValidationException($qtiFile, $eStrs); } } $qtiItem = $qtiParser->load(); return $qtiItem; }
protected function createQtiItemModel($qtiFile, $validate = true) { $qtiXml = Authoring::sanitizeQtiXml($qtiFile); //validate the file to import $qtiParser = new Parser($qtiXml); if ($validate) { $qtiParser->validate(); if (!$qtiParser->isValid()) { $eStrs = array(); foreach ($qtiParser->getErrors() as $libXmlError) { $eStrs[] = __('QTI-XML error at line %1$d "%2$s".', $libXmlError['line'], str_replace('[LibXMLError] ', '', trim($libXmlError['message']))); } // Make sure there are no duplicate... $eStrs = array_unique($eStrs); // Add sub-report. throw new ValidationException($qtiFile, $eStrs); } } $qtiItem = $qtiParser->load(); if (!$qtiItem && count($qtiParser->getErrors())) { $errors = []; foreach ($qtiParser->getErrors() as $error) { $errors[] = $error['message']; } throw new ValidationException($qtiFile, $errors); } return $qtiItem; }
/** * @param $xml * @param core_kernel_classes_Resource $rdfItem * @return bool * @throws exception\QtiModelException */ public function saveXmlItemToRdfItem($xml, core_kernel_classes_Resource $rdfItem) { $sanitized = Authoring::sanitizeQtiXml($xml); Authoring::validateQtiXml($sanitized); $qtiParser = new Parser($sanitized); $qtiItem = $qtiParser->load(); return $this->saveDataItemToRdfItem($qtiItem, $rdfItem); }