ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilTestRandomQuestionSetPoolDeriver.php
Go to the documentation of this file.
1 <?php
2 
26 {
27  protected ilDBInterface $db;
29  protected ilObjTest $testOBJ;
31 
36 
40  protected $ownerId;
41 
46 
47  public function __construct(ilDBInterface $ilDB, ilComponentRepository $component_repository, ilObjTest $testOBJ)
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 
188  protected function duplicateTaxonomies($poolQidByTestQidMap, ilObjQuestionPool $pool): ilQuestionPoolDuplicatedTaxonomiesKeysMap
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 }
Readable part of repository interface to ilComponentDataDB.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
copyQuestionsToPool(ilObjQuestionPool $pool, $questions)
derive(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
setTitle(string $title)
static resetOriginalId(int $questionId)
duplicateTaxonomies($poolQidByTestQidMap, ilObjQuestionPool $pool)
getQuestionsForPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
__construct(ilDBInterface $ilDB, ilComponentRepository $component_repository, ilObjTest $testOBJ)
static saveOriginalId(int $questionId, int $originalId)
getAssignmentsOfItem(int $a_item_id)
Get assignments for item.
updateRelatedSourcePoolDefinitions(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $derivedPoolId, $nonAvailablePoolId)
buildOriginalTaxonomyFilterForDerivedPool(ilQuestionPoolDuplicatedTaxonomiesKeysMap $taxKeysMap, $mappedTaxonomyFilter)
static _instantiateQuestion(int $question_id)
createNewPool(ilTestRandomQuestionSetNonAvailablePool $nonAvailablePool)
filterForQuestionRelatedTaxonomies($taxonomyIds, $relatedQuestionIds)