public function storeApipAccessibilityContent(\core_kernel_classes_Resource $item, \DOMDocument $originalDoc)
 {
     $itemService = taoItems_models_classes_ItemsService::singleton();
     if (($apipContent = Apip::extractApipAccessibility($originalDoc)) !== null) {
         // Call ApipService to store the data separately.
         $finalLocation = $itemService->getItemFolder($item) . 'apip.xml';
         file_put_contents($finalLocation, $apipContent->saveXML());
         \common_Logger::i("APIP content stored at '{$finalLocation}'.");
     }
 }
 public function testMergeApipAccessibilityEmptyContent()
 {
     $apip = new \DOMDocument('1.0', 'UTF-8');
     $apip->load(dirname(__FILE__) . '/../samples/apip/empty_apip_accessibility.xml');
     $qti = new \DOMDocument('1.0', 'UTF-8');
     $qti->load(dirname(__FILE__) . '/../samples/apip/apip_choice_not_apip.xml');
     Apip::mergeApipAccessibility($qti, $apip);
     // Check that the root namespace is correct i.e. it is now an APIP item.
     $this->assertEquals('http://www.imsglobal.org/xsd/apip/apipv1p0/qtiitem/imsqti_v2p1', $qti->documentElement->namespaceURI);
     // Check that an APIP accessibility element is there.
     $apipAccessibilityElts = $qti->documentElement->getElementsByTagName('apipAccessibility');
     $this->assertEquals(1, $apipAccessibilityElts->length);
     $this->assertEquals('http://www.imsglobal.org/xsd/apip/apipv1p0/imsapip_qtiv1p0', $apipAccessibilityElts->item(0)->namespaceURI);
 }
 /**
  * Overriden export from QTI items.
  *
  * @param array $options An array of options.
  * @see taoItems_models_classes_ItemExporter::export()
  */
 public function export($options = array())
 {
     $asApip = isset($options['apip']) && $options['apip'] === true;
     $lang = \common_session_SessionManager::getSession()->getDataLanguage();
     $basePath = $this->buildBasePath();
     $dataFile = (string) $this->getItemModel()->getOnePropertyValue(new core_kernel_classes_Property(TAO_ITEM_MODEL_DATAFILE_PROPERTY));
     $content = $this->getItemService()->getItemContent($this->getItem());
     $resolver = new ItemMediaResolver($this->getItem(), $lang);
     // get the local resources and add them
     foreach ($this->getAssets($this->getItem(), $lang) as $assetUrl) {
         $mediaAsset = $resolver->resolve($assetUrl);
         $mediaSource = $mediaAsset->getMediaSource();
         if (get_class($mediaSource) !== 'oat\\tao\\model\\media\\sourceStrategy\\HttpSource') {
             $srcPath = $mediaSource->download($mediaAsset->getMediaIdentifier());
             $fileInfo = $mediaSource->getFileInfo($mediaAsset->getMediaIdentifier());
             $filename = $fileInfo['filePath'];
             $replacement = $mediaAsset->getMediaIdentifier();
             if ($mediaAsset->getMediaIdentifier() !== $fileInfo['uri']) {
                 $replacement = $filename;
             }
             $destPath = ltrim($filename, '/');
             if (file_exists($srcPath)) {
                 $this->addFile($srcPath, $basePath . '/' . $destPath);
                 $content = str_replace($assetUrl, $replacement, $content);
             } else {
                 throw new \Exception('Missing resource ' . $srcPath);
             }
         }
     }
     if ($asApip === true) {
         // 1. let's merge qti.xml and apip.xml.
         // 2. retrieve apip related assets.
         $apipService = ApipService::singleton();
         $apipContentDoc = $apipService->getApipAccessibilityContent($this->getItem());
         if ($apipContentDoc === null) {
             \common_Logger::i("No APIP accessibility content found for item '" . $this->getItem()->getUri() . "', default inserted.");
             $apipContentDoc = $apipService->getDefaultApipAccessibilityContent($this->getItem());
         }
         $qtiItemDoc = new DOMDocument('1.0', 'UTF-8');
         $qtiItemDoc->formatOutput = true;
         $qtiItemDoc->loadXML($content);
         // Let's merge QTI and APIP Accessibility!
         Apip::mergeApipAccessibility($qtiItemDoc, $apipContentDoc);
         $content = $qtiItemDoc->saveXML();
         $fileHrefElts = $qtiItemDoc->getElementsByTagName('fileHref');
         for ($i = 0; $i < $fileHrefElts->length; $i++) {
             $fileHrefElt = $fileHrefElts->item($i);
             $destPath = $basePath . '/' . $fileHrefElt->nodeValue;
             $sourcePath = $this->getItemLocation() . $fileHrefElt->nodeValue;
             $this->addFile($sourcePath, $destPath);
         }
     }
     // add xml file
     $this->getZip()->addFromString($basePath . '/' . $dataFile, $content);
 }