1<?php 2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */ 3 4require_once 'Modules/Test/classes/class.ilTestExport.php'; 5 6/** 7 * @author Björn Heyser <bheyser@databay.de> 8 * @version $Id$ 9 * 10 * @package Modules/Test 11 */ 12class ilTestExportRandomQuestionSet extends ilTestExport 13{ 14 /** 15 * @var ilTestRandomQuestionSetSourcePoolDefinitionList 16 */ 17 protected $srcPoolDefList; 18 19 /** 20 * @var array[ilTestRandomQuestionSetStagingPoolQuestionList] 21 */ 22 protected $stagingPoolQuestionListByPoolId; 23 24 protected function initXmlExport() 25 { 26 global $DIC; 27 $ilDB = $DIC['ilDB']; 28 $ilPluginAdmin = $DIC['ilPluginAdmin']; 29 30 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php'; 31 $srcPoolDefFactory = new ilTestRandomQuestionSetSourcePoolDefinitionFactory( 32 $ilDB, 33 $this->test_obj 34 ); 35 36 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php'; 37 $this->srcPoolDefList = new ilTestRandomQuestionSetSourcePoolDefinitionList( 38 $ilDB, 39 $this->test_obj, 40 $srcPoolDefFactory 41 ); 42 43 $this->srcPoolDefList->loadDefinitions(); 44 45 // fau: fixRandomTestExportPages - use the complete random question list 46 // ilObjTest::exportPagesXML() uses $this->questions 47 // ilObjTest::loadQuestions() loads only those of the current active_id of ilUser 48 $this->test_obj->questions = $this->getQuestionIds(); 49 // fau. 50 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php'; 51 52 $this->stagingPoolQuestionListByPoolId = array(); 53 } 54 55 protected function populateQuestionSetConfigXml(ilXmlWriter $xmlWriter) 56 { 57 $xmlWriter->xmlStartTag('RandomQuestionSetConfig'); 58 $this->populateCommonSettings($xmlWriter); 59 $this->populateQuestionStages($xmlWriter); 60 $this->populateSelectionDefinitions($xmlWriter); 61 $xmlWriter->xmlEndTag('RandomQuestionSetConfig'); 62 } 63 64 protected function populateCommonSettings(ilXmlWriter $xmlWriter) 65 { 66 global $DIC; 67 $tree = $DIC['tree']; 68 $ilDB = $DIC['ilDB']; 69 $ilPluginAdmin = $DIC['ilPluginAdmin']; 70 71 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php'; 72 $questionSetConfig = new ilTestRandomQuestionSetConfig($tree, $ilDB, $ilPluginAdmin, $this->test_obj); 73 $questionSetConfig->loadFromDb(); 74 75 $xmlWriter->xmlElement('RandomQuestionSetSettings', array( 76 'amountMode' => $questionSetConfig->getQuestionAmountConfigurationMode(), 77 'questAmount' => $questionSetConfig->getQuestionAmountPerTest(), 78 'homogeneous' => $questionSetConfig->arePoolsWithHomogeneousScoredQuestionsRequired(), 79 'synctimestamp' => $questionSetConfig->getLastQuestionSyncTimestamp() 80 )); 81 } 82 83 protected function populateQuestionStages(ilXmlWriter $xmlWriter) 84 { 85 $xmlWriter->xmlStartTag('RandomQuestionStage'); 86 87 foreach ($this->srcPoolDefList->getInvolvedSourcePoolIds() as $poolId) { 88 $questionList = $this->getLoadedStagingPoolQuestionList($poolId); 89 90 $xmlWriter->xmlStartTag('RandomQuestionStagingPool', array('poolId' => $poolId)); 91 $xmlWriter->xmlData(implode(',', $questionList->getQuestions())); 92 $xmlWriter->xmlEndTag('RandomQuestionStagingPool'); 93 } 94 95 $xmlWriter->xmlEndTag('RandomQuestionStage'); 96 } 97 98 protected function populateSelectionDefinitions(ilXmlWriter $xmlWriter) 99 { 100 $xmlWriter->xmlStartTag('RandomQuestionSelectionDefinitions'); 101 102 foreach ($this->srcPoolDefList as $definition) { 103 $attributes = array( 104 'id' => $definition->getId(), 105 'ref_id' => $definition->getPoolRefId(), 106 'poolId' => $definition->getPoolId(), 107 'poolQuestCount' => $definition->getPoolQuestionCount(), 108 'questAmount' => $definition->getQuestionAmount(), 109 'position' => $definition->getSequencePosition() 110 ); 111 112 // #21330 113 $mappedTaxFilter = $definition->getMappedTaxonomyFilter(); 114 if (is_array($mappedTaxFilter) && count($mappedTaxFilter) > 0) { 115 $attributes['taxFilter'] = serialize($mappedTaxFilter); 116 } 117 118 $xmlWriter->xmlStartTag('RandomQuestionSelectionDefinition', $attributes); 119 $xmlWriter->xmlElement('RandomQuestionSourcePoolTitle', null, $definition->getPoolTitle()); 120 $xmlWriter->xmlElement('RandomQuestionSourcePoolPath', null, $definition->getPoolPath()); 121 $xmlWriter->xmlEndTag('RandomQuestionSelectionDefinition'); 122 } 123 124 $xmlWriter->xmlEndTag('RandomQuestionSelectionDefinitions'); 125 } 126 127 protected function getQuestionsQtiXml() 128 { 129 $questionQtiXml = ''; 130 131 foreach ($this->srcPoolDefList->getInvolvedSourcePoolIds() as $poolId) { 132 $questionList = $this->getLoadedStagingPoolQuestionList($poolId); 133 134 foreach ($questionList as $questionId) { 135 $questionQtiXml .= $this->getQuestionQtiXml($questionId); 136 } 137 } 138 139 return $questionQtiXml; 140 } 141 142 /** 143 * @return array 144 */ 145 protected function getQuestionIds() 146 { 147 $questionIds = array(); 148 149 foreach ($this->srcPoolDefList->getInvolvedSourcePoolIds() as $poolId) { 150 $questionList = $this->getLoadedStagingPoolQuestionList($poolId); 151 152 foreach ($questionList as $questionId) { 153 $questionIds[] = $questionId; 154 } 155 } 156 157 return $questionIds; 158 } 159 160 /** 161 * @param $poolId 162 * @return ilTestRandomQuestionSetStagingPoolQuestionList 163 */ 164 protected function getLoadedStagingPoolQuestionList($poolId) 165 { 166 if (!isset($this->stagingPoolQuestionListByPoolId[$poolId])) { 167 global $DIC; 168 $ilDB = $DIC['ilDB']; 169 $ilPluginAdmin = $DIC['ilPluginAdmin']; 170 171 $questionList = new ilTestRandomQuestionSetStagingPoolQuestionList($ilDB, $ilPluginAdmin); 172 $questionList->setTestId($this->test_obj->getTestId()); 173 $questionList->setPoolId($poolId); 174 $questionList->loadQuestions(); 175 176 $this->stagingPoolQuestionListByPoolId[$poolId] = $questionList; 177 } 178 179 return $this->stagingPoolQuestionListByPoolId[$poolId]; 180 } 181} 182