ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilTestRandomQuestionSetConfig.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once 'Modules/Test/classes/class.ilTestQuestionSetConfig.php';
5
15{
18
23
28
32 private $questionAmountPerTest = null;
33
38
39 //fau: fixRandomTestBuildable - variable for messages
40 private $buildableMessages = array();
41 // fau.
42
50 {
52 }
53
58 {
59 $this->requirePoolsWithHomogeneousScoredQuestions = $requirePoolsWithHomogeneousScoredQuestions;
60 }
61
66 {
68 }
69
74 {
75 $this->questionAmountConfigurationMode = $questionAmountConfigurationMode;
76 }
77
82 {
84 }
85
90 {
92 }
93
98 {
100 }
101
102 public function isValidQuestionAmountConfigurationMode($amountMode)
103 {
104 switch ($amountMode) {
107
108 return true;
109 }
110
111 return false;
112 }
113
118 {
119 $this->questionAmountPerTest = $questionAmountPerTest;
120 }
121
125 public function getQuestionAmountPerTest()
126 {
128 }
129
134 {
135 $this->lastQuestionSyncTimestamp = $lastQuestionSyncTimestamp;
136 }
137
142 {
144 }
145
146 //fau: fixRandomTestBuildable - function to get messages
147 public function getBuildableMessages()
148 {
150 }
151 // fau.
152
153 // -----------------------------------------------------------------------------------------------------------------
154
161 public function initFromArray($dataArray)
162 {
163 foreach ($dataArray as $field => $value) {
164 switch ($field) {
165 case 'req_pools_homo_scored': $this->setPoolsWithHomogeneousScoredQuestionsRequired($value); break;
166 case 'quest_amount_cfg_mode': $this->setQuestionAmountConfigurationMode($value); break;
167 case 'quest_amount_per_test': $this->setQuestionAmountPerTest($value); break;
168 case 'quest_sync_timestamp': $this->setLastQuestionSyncTimestamp($value); break;
169 }
170 }
171 }
172
178 public function loadFromDb()
179 {
180 $res = $this->db->queryF(
181 "SELECT * FROM tst_rnd_quest_set_cfg WHERE test_fi = %s",
182 array('integer'),
183 array($this->testOBJ->getTestId())
184 );
185
186 while ($row = $this->db->fetchAssoc($res)) {
187 $this->initFromArray($row);
188
189 return true;
190 }
191
192 return false;
193 }
194
200 public function saveToDb()
201 {
202 if ($this->dbRecordExists($this->testOBJ->getTestId())) {
203 $this->updateDbRecord($this->testOBJ->getTestId());
204 } else {
205 $this->insertDbRecord($this->testOBJ->getTestId());
206 }
207 }
208
214 public function cloneToDbForTestId($testId)
215 {
216 $this->insertDbRecord($testId);
217 }
218
222 public function deleteFromDb()
223 {
224 $this->db->manipulateF(
225 "DELETE FROM tst_rnd_quest_set_cfg WHERE test_fi = %s",
226 array('integer'),
227 array($this->testOBJ->getTestId())
228 );
229 }
230
231 // -----------------------------------------------------------------------------------------------------------------
232
239 private function dbRecordExists($testId)
240 {
241 $res = $this->db->queryF(
242 "SELECT COUNT(*) cnt FROM tst_rnd_quest_set_cfg WHERE test_fi = %s",
243 array('integer'),
244 array($testId)
245 );
246
247 $row = $this->db->fetchAssoc($res);
248
249 return (bool) $row['cnt'];
250 }
251
258 private function updateDbRecord($testId)
259 {
260 $this->db->update(
261 'tst_rnd_quest_set_cfg',
262 array(
263 'req_pools_homo_scored' => array('integer', (int) $this->arePoolsWithHomogeneousScoredQuestionsRequired()),
264 'quest_amount_cfg_mode' => array('text', $this->getQuestionAmountConfigurationMode()),
265 'quest_amount_per_test' => array('integer', (int) $this->getQuestionAmountPerTest()),
266 'quest_sync_timestamp' => array('integer', (int) $this->getLastQuestionSyncTimestamp())
267 ),
268 array(
269 'test_fi' => array('integer', $testId)
270 )
271 );
272 }
273
280 private function insertDbRecord($testId)
281 {
282 $this->db->insert('tst_rnd_quest_set_cfg', array(
283 'test_fi' => array('integer', $testId),
284 'req_pools_homo_scored' => array('integer', (int) $this->arePoolsWithHomogeneousScoredQuestionsRequired()),
285 'quest_amount_cfg_mode' => array('text', $this->getQuestionAmountConfigurationMode()),
286 'quest_amount_per_test' => array('integer', (int) $this->getQuestionAmountPerTest()),
287 'quest_sync_timestamp' => array('integer', (int) $this->getLastQuestionSyncTimestamp())
288 ));
289 }
290
291 // -----------------------------------------------------------------------------------------------------------------
292
293 public function isQuestionSetConfigured() : bool
294 {
295 return (
296 $this->getLastQuestionSyncTimestamp() != 0
297 && $this->isQuestionAmountConfigComplete()
298 && $this->hasSourcePoolDefinitions()
299 && $this->isQuestionSetBuildable()
300 );
301 }
302
303 public function isQuestionAmountConfigComplete()
304 {
306 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
307
308 $sourcePoolDefinitionList->loadDefinitions();
309
310 foreach ($sourcePoolDefinitionList as $definition) {
313 if ($definition->getQuestionAmount() < 1) {
314 return false;
315 }
316 }
317 } elseif ($this->getQuestionAmountPerTest() < 1) {
318 return false;
319 }
320
321 return true;
322 }
323
324 public function hasSourcePoolDefinitions()
325 {
326 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
327
328 return $sourcePoolDefinitionList->savedDefinitionsExist();
329 }
330
331 public function isQuestionSetBuildable()
332 {
333 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
334 $sourcePoolDefinitionList->loadDefinitions();
335
336 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
337 $stagingPoolQuestionList = new ilTestRandomQuestionSetStagingPoolQuestionList($this->db, $this->pluginAdmin);
338
339 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
340 $questionSetBuilder = ilTestRandomQuestionSetBuilder::getInstance($this->db, $this->testOBJ, $this, $sourcePoolDefinitionList, $stagingPoolQuestionList);
341
342 //fau: fixRandomTestBuildable - get messages if set is not buildable
343 $buildable = $questionSetBuilder->checkBuildable();
344 $this->buildableMessages = $questionSetBuilder->getCheckMessages();
345 return $buildable;
346 // fau.
347
348 return $questionSetBuilder->checkBuildable();
349 }
350
352 {
353 if ($this->dbRecordExists($this->testOBJ->getTestId())) {
354 return true;
355 }
356
357 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
358
359 if ($sourcePoolDefinitionList->savedDefinitionsExist()) {
360 return true;
361 }
362
363 return false;
364 }
365
367 {
368 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
369 $sourcePoolDefinitionList->deleteDefinitions();
370
371 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolBuilder.php';
373 $this->db,
374 $this->testOBJ
375 );
376 $stagingPool->reset();
377
379
380 $this->deleteFromDb();
381 }
382
384 {
385 $this->testOBJ->setResultFilterTaxIds(array());
386 $this->testOBJ->saveToDb(true);
387 }
388
394 public function cloneQuestionSetRelatedData(ilObjTest $cloneTestOBJ)
395 {
396 // clone general config
397
398 $this->loadFromDb();
399 $this->cloneToDbForTestId($cloneTestOBJ->getTestId());
400
401 // clone source pool definitions (selection rules)
402
403 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
404 $sourcePoolDefinitionList->loadDefinitions();
405 $definitionIdMap = $sourcePoolDefinitionList->cloneDefinitionsForTestId($cloneTestOBJ->getTestId());
406 $this->registerClonedSourcePoolDefinitionIdMapping($cloneTestOBJ, $definitionIdMap);
407
408 // build new question stage for cloned test
409
410 $sourcePoolDefinitionList = $this->buildSourcePoolDefinitionList($cloneTestOBJ);
411 $stagingPool = $this->buildStagingPoolBuilder($cloneTestOBJ);
412
413 $sourcePoolDefinitionList->loadDefinitions();
414 $stagingPool->rebuild($sourcePoolDefinitionList);
415 $sourcePoolDefinitionList->saveDefinitions();
416
417 $this->updateLastQuestionSyncTimestampForTestId($cloneTestOBJ->getTestId(), time());
418 }
419
420 private function registerClonedSourcePoolDefinitionIdMapping(ilObjTest $cloneTestOBJ, $definitionIdMap)
421 {
422 global $DIC;
423 $ilLog = $DIC['ilLog'];
424
425 require_once 'Services/CopyWizard/classes/class.ilCopyWizardOptions.php';
427
428 foreach ($definitionIdMap as $originalDefinitionId => $cloneDefinitionId) {
429 $originalKey = $this->testOBJ->getRefId() . '_rndSelDef_' . $originalDefinitionId;
430 $mappedKey = $cloneTestOBJ->getRefId() . '_rndSelDef_' . $cloneDefinitionId;
431 $cwo->appendMapping($originalKey, $mappedKey);
432 $ilLog->write(__METHOD__ . ": Added random selection definition id mapping $originalKey <-> $mappedKey");
433 }
434 }
435
437 {
438 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
439 $sourcePoolDefinitionFactory = new ilTestRandomQuestionSetSourcePoolDefinitionFactory(
440 $this->db,
442 );
443
444 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
445 $sourcePoolDefinitionList = new ilTestRandomQuestionSetSourcePoolDefinitionList(
446 $this->db,
447 $testOBJ,
448 $sourcePoolDefinitionFactory
449 );
450
451 return $sourcePoolDefinitionList;
452 }
453
455 {
456 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolBuilder.php';
457 $stagingPool = new ilTestRandomQuestionSetStagingPoolBuilder($this->db, $testOBJ);
458
459 return $stagingPool;
460 }
461
462 // -----------------------------------------------------------------------------------------------------------------
463
465 {
466 $this->db->update(
467 'tst_rnd_quest_set_cfg',
468 array(
469 'quest_sync_timestamp' => array('integer', (int) $timestamp)
470 ),
471 array(
472 'test_fi' => array('integer', $testId)
473 )
474 );
475 }
476
478 {
479 return true;
480 }
481
482 // -----------------------------------------------------------------------------------------------------------------
483
485 {
486 return $this->testOBJ->getAvailableQuestionpools(
487 true,
489 false,
490 true,
491 true
492 );
493 }
494
496 {
497 return (bool) count($this->getSelectableQuestionPools());
498 }
499
500 // -----------------------------------------------------------------------------------------------------------------
501
502 public function areDepenciesBroken()
503 {
504 return (bool) $this->testOBJ->isTestFinalBroken();
505 }
506
508 {
509 return $lng->txt('tst_old_style_rnd_quest_set_broken');
510 }
511
512 public function isValidRequestOnBrokenQuestionSetDepencies($nextClass, $cmd)
513 {
514 //vd($nextClass, $cmd);
515
516 switch ($nextClass) {
517 case 'ilobjectmetadatagui':
518 case 'ilpermissiongui':
519
520 return true;
521
522 case 'ilobjtestgui':
523 case '':
524
525 $cmds = array(
526 'infoScreen', 'participants', 'npSetFilter', 'npResetFilter',
527 //'deleteAllUserResults', 'confirmDeleteAllUserResults',
528 //'deleteSingleUserResults', 'confirmDeleteSelectedUserData', 'cancelDeleteSelectedUserData'
529 );
530
531 if (in_array($cmd, $cmds)) {
532 return true;
533 }
534
535 break;
536 }
537
538 return false;
539 }
540
542 {
543 return array(
544 'assQuestions', 'settings', 'manscoring', 'scoringadjust', 'statistics', 'history', 'export'
545 );
546 }
547
548 // -----------------------------------------------------------------------------------------------------------------
549
551 {
552 $definitionList = $this->buildSourcePoolDefinitionList($this->testOBJ);
553 $definitionList->loadDefinitions();
554
555 $poolTitles = array();
556
557 foreach ($definitionList as $definition) {
558 /* @var ilTestRandomQuestionSetSourcePoolDefinition $definition */
559
560 $refId = current(ilObject::_getAllReferences($definition->getPoolId()));
561 $href = ilLink::_getLink($refId, 'qpl');
562 $title = $definition->getPoolTitle();
563
564 $poolTitles[$definition->getPoolId()] = "<a href=\"$href\" alt=\"$title\">$title</a>";
565 }
566
567 return implode(', ', $poolTitles);
568 }
569}
foreach($mandatory_scripts as $file) $timestamp
Definition: buildRTE.php:81
An exception for terminatinating execution or to throw for unit testing.
static _getInstance($a_copy_id)
Get instance of copy wizard options.
language handling
getTestId()
Gets the database id of the additional test data.
getRefId()
get reference id @access public
static _getAllReferences($a_id)
get all reference ids of object
Administration class for plugins.
static getInstance(ilDBInterface $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
cloneToDbForTestId($testId)
saves the question set config for test with given id to the database
initFromArray($dataArray)
initialises the current object instance with values from matching properties within the passed array
dbRecordExists($testId)
checks wether a question set config for current test exists in the database
__construct(ilTree $tree, ilDBInterface $db, ilPluginAdmin $pluginAdmin, ilObjTest $testOBJ)
removeQuestionSetRelatedData()
removes all question set config related data
saveToDb()
saves the question set config for current test to the database
setQuestionAmountConfigurationMode($questionAmountConfigurationMode)
setLastQuestionSyncTimestamp($lastQuestionSyncTimestamp)
cloneQuestionSetRelatedData(ilObjTest $cloneTestOBJ)
removes all question set config related data for cloned/copied test
registerClonedSourcePoolDefinitionIdMapping(ilObjTest $cloneTestOBJ, $definitionIdMap)
loadFromDb()
loads the question set config for current test from the database
doesQuestionSetRelatedDataExist()
checks wether question set config related data exists or not
resetQuestionSetRelatedTestSettings()
resets all test settings that depends on a non changed question set config
deleteFromDb()
deletes the question set config for current test from the database
updateDbRecord($testId)
updates the record in the database that corresponds to the question set config for the current test
setPoolsWithHomogeneousScoredQuestionsRequired($requirePoolsWithHomogeneousScoredQuestions)
insertDbRecord($testId)
inserts a new record for the question set config for the current test into the database
Tree class data representation in hierachical trees using the Nested Set Model with Gaps by Joe Celco...
global $DIC
Definition: goto.php:24
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
$lng
foreach($_POST as $key=> $value) $res
$refId
Definition: xapitoken.php:40