public function testSimple() { $baseValues = new ExpressionCollection(); $baseValues[] = new BaseValue(BaseType::FLOAT, 0.5); $baseValues[] = new BaseValue(BaseType::INTEGER, 25); $baseValues[] = new BaseValue(BaseType::FLOAT, 0.5); $sum = new Sum($baseValues); $iterator = new QtiComponentIterator($sum); $iterations = 0; foreach ($iterator as $k => $i) { $this->assertSame($sum, $iterator->parent()); $this->assertSame($baseValues[$iterations], $i); $this->assertSame($sum, $iterator->getCurrentContainer()); $this->assertEquals($k, $i->getQtiClassName()); $iterations++; } $this->assertSame(null, $iterator->parent()); }
public function beforeSave(QtiComponent $documentComponent, $uri) { // Take care of rubricBlock explosion. Transform // actual rubricBlocks in rubricBlockRefs. if ($this->mustExplodeRubricBlocks() === true) { // Get all rubricBlock elements... $iterator = new QtiComponentIterator($documentComponent, array('rubricBlock')); $sectionCount = new SplObjectStorage(); foreach ($iterator as $rubricBlock) { // $section contains the assessmentSection the rubricBlock is related to. $section = $iterator->parent(); // determine the occurence number of the rubricBlock relative to its section. if (isset($sectionCount[$section]) === false) { $sectionCount[$section] = 0; } $sectionCount[$section] = $sectionCount[$section] + 1; $occurence = $sectionCount[$section]; // determine a suitable file name for the external rubricBlock definition. $rubricBlockRefId = 'RB_' . $section->getIdentifier() . '_' . $occurence; $href = './rubricBlock_' . $rubricBlockRefId . '.xml'; $doc = new XmlDocument(); $doc->setDocumentComponent($rubricBlock); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); // replace the rubric block with a reference. $sectionRubricBlocks = $section->getRubricBlocks(); $sectionRubricBlocks->remove($rubricBlock); $sectionRubricBlockRefs = $section->getRubricBlockRefs(); $sectionRubricBlockRefs[] = new RubricBlockRef($rubricBlockRefId, $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external rubrickBlock definition(s)."; throw new XmlStorageException($msg, $e); } } } }
/** * @see \qtism\data\storage\xml\XmlDocument::beforeSave() */ public function beforeSave(QtiComponent $documentComponent, $uri) { // Take care of rubricBlock explosion. Transform actual rubricBlocks in rubricBlockRefs. if ($this->mustExplodeRubricBlocks() === true) { // Get all rubricBlock elements... $iterator = new QtiComponentIterator($documentComponent, array('rubricBlock')); $sectionCount = new SplObjectStorage(); foreach ($iterator as $rubricBlock) { // $section contains the assessmentSection the rubricBlock is related to. $section = $iterator->parent(); // determine the occurence number of the rubricBlock relative to its section. if (isset($sectionCount[$section]) === false) { $sectionCount[$section] = 0; } $sectionCount[$section] = $sectionCount[$section] + 1; $occurence = $sectionCount[$section]; // determine a suitable file name for the external rubricBlock definition. $rubricBlockRefId = 'RB_' . $section->getIdentifier() . '_' . $occurence; $href = './rubricBlock_' . $rubricBlockRefId . '.xml'; $doc = new XmlDocument(); $doc->setDocumentComponent($rubricBlock); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); // replace the rubric block with a reference. $sectionRubricBlocks = $section->getRubricBlocks(); $sectionRubricBlocks->remove($rubricBlock); $sectionRubricBlockRefs = $section->getRubricBlockRefs(); $sectionRubricBlockRefs[] = new RubricBlockRef($rubricBlockRefId, $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external rubrickBlock definition(s)."; throw new XmlStorageException($msg, XmlStorageException::UNKNOWN, $e); } } } // Take care of testFeedback explosion. Transform actual testFeedbacks in testFeedbackRefs. if ($this->mustExplodeTestFeedbacks() === true) { $iterator = new QtiComponentIterator($documentComponent, array('testFeedback')); $testPartCount = new SplObjectStorage(); $testCount = 0; foreach ($iterator as $testFeedback) { $parent = $iterator->parent(); if ($parent instanceof TestPart) { if (isset($testPartCount[$parent]) === false) { $testPartCount[$parent] = 0; } $testPartCount[$parent] = $testPartCount[$parent] + 1; $occurence = $testPartCount[$parent]; } else { // It's a testFeedback related to an assessmentTest. $testCount += 1; $occurence = $testCount; } $parentId = $parent->getIdentifier(); $href = "./testFeedback_TF_{$parentId}_{$occurence}.xml"; // Generate the document. $doc = new XmlDocument(); $doc->setDocumentComponent($testFeedback); try { $pathinfo = pathinfo($uri); $doc->save($pathinfo['dirname'] . DIRECTORY_SEPARATOR . $href); $parent->getTestFeedbacks()->remove($testFeedback); $testFeedbackRefs = $parent->getTestFeedbackRefs(); $testFeedbackRefs[] = new TestFeedbackRef($testFeedback->getIdentifier(), $testFeedback->getOutcomeIdentifier(), $testFeedback->getAccess(), $testFeedback->getShowHide(), $href); } catch (XmlStorageException $e) { $msg = "An error occured while creating external testFeedback definition(s)."; throw new XmlStorageException($msg, XmlStorageException::UNKNOWN, $e); } } } }
/** * Resolve include components. * * After the item has been loaded using the load or loadFromString method, * the include components can be resolved by calling this method. Files will * be included following the rules described by the XInclude specification. * * @param boolean $validate Whether or not validate files being included. * @throws \LogicException If the method is called prior the load or loadFromString method was called. * @throws \qtism\data\storage\xml\XmlStorageException If an error occured while parsing or validating files to be included. */ public function xInclude($validate = false) { if (($root = $this->getDocumentComponent()) !== false) { $baseUri = str_replace('\\', '/', $this->getDomDocument()->documentElement->baseURI); $pathinfo = pathinfo($baseUri); $basePath = $pathinfo['dirname']; $iterator = new QtiComponentIterator($root, array('include')); foreach ($iterator as $include) { $parent = $iterator->parent(); // Is the parent something we can deal with for replacement? $reflection = new ReflectionClass($parent); if ($reflection->hasMethod('getContent') === true && $parent->getContent() instanceof QtiComponentCollection) { $href = $include->getHref(); if (Url::isRelative($href) === true) { $href = Url::rtrim($basePath) . '/' . Url::ltrim($href); $doc = new XmlDocument(); $doc->load($href, $validate); $includeRoot = $doc->getDocumentComponent(); if ($includeRoot instanceof Flow) { // Derive xml:base... $xmlBase = Url::ltrim(str_replace($basePath, '', $href)); $xmlBasePathInfo = pathinfo($xmlBase); if ($xmlBasePathInfo['dirname'] !== '.') { $includeRoot->setXmlBase($xmlBasePathInfo['dirname'] . '/'); } } $parent->getContent()->replace($include, $includeRoot); } } } } else { $msg = "Cannot include fragments prior to loading any file."; throw new LogicException($msg); } }