ILIAS  release_8 Revision v8.24
class.ilTestRandomQuestionSetPoolDeriver.php
Go to the documentation of this file.
1<?php
2
26{
27 protected ilDBInterface $db;
31
36
40 protected $ownerId;
41
46
48 {
49 $this->db = $ilDB;
50 $this->component_repository = $component_repository;
51 $this->testOBJ = $testOBJ;
52 $this->poolFactory = new ilQuestionPoolFactory();
53 }
54
58 public function getTargetContainerRef(): int
59 {
61 }
62
67 {
68 $this->targetContainerRef = $targetContainerRef;
69 }
70
74 public function getOwnerId(): int
75 {
76 return $this->ownerId;
77 }
78
82 public function setOwnerId($ownerId)
83 {
84 $this->ownerId = $ownerId;
85 }
86
91 {
93 }
94
99 {
100 $this->sourcePoolDefinitionList = $sourcePoolDefinitionList;
101 }
102
103 protected function getQuestionsForPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool): array
104 {
106 $this->db,
107 $this->component_repository
108 );
109
110 $questionList->setTestObjId($this->testOBJ->getId());
111 $questionList->setTestId($this->testOBJ->getTestId());
112 $questionList->setPoolId($nonAvailablePool->getId());
113
114 $questionList->loadQuestions();
115
116 $questions = array();
117 $list = $questionList->getQuestions();
118 foreach ($list as $questionId) {
119 $questions[] = assQuestion::_instantiateQuestion($questionId);
120 }
121
122 return $questions;
123 }
124
126 {
127 $pool = $this->poolFactory->createNewInstance($this->getTargetContainerRef());
128
129 if (strlen($nonAvailablePool->getTitle())) {
130 $pool->setTitle($nonAvailablePool->getTitle());
131 $pool->update();
132 }
133
134 return $pool;
135 }
136
137 protected function copyQuestionsToPool(ilObjQuestionPool $pool, $questions): array
138 {
139 $poolQidByTestQidMap = array();
140
141 foreach ($questions as $questionOBJ) {
142 /* @var assQuestion $questionOBJ */
143
144 $testQuestionId = $questionOBJ->getId();
145 $poolQuestionId = $questionOBJ->duplicate(false, '', '', $this->getOwnerId(), $pool->getId());
146
147 $poolQidByTestQidMap[$testQuestionId] = $poolQuestionId;
148 }
149
150 return $poolQidByTestQidMap;
151 }
152
153 protected function updateTestQuestionStage($poolQidByTestQidMap)
154 {
155 foreach ($poolQidByTestQidMap as $testQid => $poolQid) {
157 assQuestion::saveOriginalId($testQid, $poolQid);
158 }
159 }
160
161 protected function filterForQuestionRelatedTaxonomies($taxonomyIds, $relatedQuestionIds): array
162 {
163 require_once 'Services/Taxonomy/classes/class.ilTaxNodeAssignment.php';
164
165 $filteredTaxIds = array();
166
167 foreach ($taxonomyIds as $taxonomyId) {
168 $taxNodeAssignment = new ilTaxNodeAssignment(
169 $this->testOBJ->getType(),
170 $this->testOBJ->getId(),
171 'quest',
172 $taxonomyId
173 );
174
175 foreach ($relatedQuestionIds as $questionId) {
176 $assignedTaxNodes = $taxNodeAssignment->getAssignmentsOfItem($questionId);
177
178 if (count($assignedTaxNodes)) {
179 $filteredTaxIds[] = $taxonomyId;
180 break;
181 }
182 }
183 }
184
185 return $filteredTaxIds;
186 }
187
189 {
190 require_once 'Modules/TestQuestionPool/classes/class.ilQuestionPoolTaxonomiesDuplicator.php';
191 $taxDuplicator = new ilQuestionPoolTaxonomiesDuplicator();
192 $taxDuplicator->setSourceObjId($this->testOBJ->getId());
193 $taxDuplicator->setSourceObjType($this->testOBJ->getType());
194 $taxDuplicator->setTargetObjId($pool->getId());
195 $taxDuplicator->setTargetObjType($pool->getType());
196 $taxDuplicator->setQuestionIdMapping($poolQidByTestQidMap);
197
198 $taxDuplicator->duplicate($this->filterForQuestionRelatedTaxonomies(
199 $taxDuplicator->getAllTaxonomiesForSourceObject(),
200 array_keys($poolQidByTestQidMap)
201 ));
202
203 return $taxDuplicator->getDuplicatedTaxonomiesKeysMap();
204 }
205
206 protected function buildOriginalTaxonomyFilterForDerivedPool(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $mappedTaxonomyFilter): array
207 {
208 $originalTaxonomyFilter = array();
209
210 foreach ($mappedTaxonomyFilter as $testTaxonomyId => $testTaxNodes) {
211 $poolTaxonomyId = $taxKeysMap->getMappedTaxonomyId($testTaxonomyId);
212 $originalTaxonomyFilter[$poolTaxonomyId] = array();
213
214 foreach ($testTaxNodes as $testTaxNode) {
215 $poolTaxNode = $taxKeysMap->getMappedTaxNodeId($testTaxNode);
216 $originalTaxonomyFilter[$poolTaxonomyId][] = $poolTaxNode;
217 }
218 }
219
220 return $originalTaxonomyFilter;
221 }
222
223 protected function updateRelatedSourcePoolDefinitions(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $derivedPoolId, $nonAvailablePoolId)
224 {
225 foreach ($this->getSourcePoolDefinitionList() as $definition) {
226 if ($definition->getPoolId() != $nonAvailablePoolId) {
227 continue;
228 }
229
230 $definition->setPoolId($derivedPoolId);
231
232 $definition->setOriginalTaxonomyFilter($this->buildOriginalTaxonomyFilterForDerivedPool(
233 $taxKeysMap,
234 $definition->getMappedTaxonomyFilter()
235 ));
236
237 $definition->saveToDb();
238 }
239 }
240
246 {
247 $pool = $this->createNewPool($nonAvailablePool);
248 $questions = $this->getQuestionsForPool($nonAvailablePool);
249
250 $poolQidByTestQidMap = $this->copyQuestionsToPool($pool, $questions);
251
252 $this->updateTestQuestionStage($poolQidByTestQidMap);
253
254 $duplicatedTaxKeysMap = $this->duplicateTaxonomies($poolQidByTestQidMap, $pool);
255
256 $this->updateRelatedSourcePoolDefinitions($duplicatedTaxKeysMap, $pool->getId(), $nonAvailablePool->getId());
257
258 return $pool;
259 }
260}
static _instantiateQuestion(int $question_id)
static saveOriginalId(int $questionId, int $originalId)
static resetOriginalId(int $questionId)
setTitle(string $title)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
filterForQuestionRelatedTaxonomies($taxonomyIds, $relatedQuestionIds)
duplicateTaxonomies($poolQidByTestQidMap, ilObjQuestionPool $pool)
__construct(ilDBInterface $ilDB, ilComponentRepository $component_repository, ilObjTest $testOBJ)
getQuestionsForPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
updateRelatedSourcePoolDefinitions(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $derivedPoolId, $nonAvailablePoolId)
buildOriginalTaxonomyFilterForDerivedPool(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $mappedTaxonomyFilter)
createNewPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
copyQuestionsToPool(ilObjQuestionPool $pool, $questions)
derive(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
Readable part of repository interface to ilComponentDataDB.
Interface ilDBInterface.