ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilTestOutputGUI.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.ilTestPlayerAbstractGUI.php';
5
21{
26
30 public function executeCommand()
31 {
32 global $ilDB, $ilPluginAdmin, $lng, $ilTabs;
33
34 $this->checkReadAccess();
35
36 $ilTabs->clearTargets();
37
38 $cmd = $this->ctrl->getCmd();
39 $next_class = $this->ctrl->getNextClass($this);
40
41 $this->ctrl->saveParameter($this, "sequence");
42 $this->ctrl->saveParameter($this, "pmode");
43 $this->ctrl->saveParameter($this, "active_id");
44
46
47 $testSessionFactory = new ilTestSessionFactory($this->object);
48 $this->testSession = $testSessionFactory->getSession($_GET['active_id']);
49
50 $this->ensureExistingTestSession($this->testSession);
51
52 $this->initProcessLocker($this->testSession->getActiveId());
53
54 $testSequenceFactory = new ilTestSequenceFactory($ilDB, $lng, $ilPluginAdmin, $this->object);
55 $this->testSequence = $testSequenceFactory->getSequenceByTestSession($this->testSession);
56 $this->testSequence->loadFromDb();
57 $this->testSequence->loadQuestions();
58
59 require_once 'Modules/Test/classes/class.ilTestQuestionRelatedObjectivesList.php';
60 $this->questionRelatedObjectivesList = new ilTestQuestionRelatedObjectivesList();
61
62 include_once 'Services/jQuery/classes/class.iljQueryUtil.php';
64 include_once "./Services/YUI/classes/class.ilYuiUtil.php";
66
68
69 $cmd = $this->getCommand($cmd);
70
71 switch($next_class)
72 {
73 case 'ilassquestionpagegui':
74
75 $this->checkTestExecutable();
76
77 $questionId = $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement());
78
79 require_once "./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
80 $page_gui = new ilAssQuestionPageGUI($questionId);
81 $ret = $this->ctrl->forwardCommand($page_gui);
82 break;
83
84 case 'iltestsubmissionreviewgui':
85
86 $this->checkTestExecutable();
87
88 require_once './Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
89 $gui = new ilTestSubmissionReviewGUI($this, $this->object, $this->testSession);
90 $gui->setObjectiveOrientedContainer($this->getObjectiveOrientedContainer());
91 $ret = $this->ctrl->forwardCommand($gui);
92 break;
93
94 case 'ilassquestionhintrequestgui':
95
96 $this->checkTestExecutable();
97
98 $questionGUI = $this->object->createQuestionGUI(
99 "", $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement())
100 );
101
102 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
103 $questionHintTracking = new ilAssQuestionHintTracking(
104 $questionGUI->object->getId(), $this->testSession->getActiveId(), $this->testSession->getPass()
105 );
106
107 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
108 $gui = new ilAssQuestionHintRequestGUI($this, ilTestPlayerCommands::SHOW_QUESTION, $questionGUI, $questionHintTracking);
109
110 $ret = $this->ctrl->forwardCommand($gui);
111
112 break;
113
114 case 'iltestsignaturegui':
115
116 $this->checkTestExecutable();
117
118 require_once './Modules/Test/classes/class.ilTestSignatureGUI.php';
119 $gui = new ilTestSignatureGUI($this);
120 $ret = $this->ctrl->forwardCommand($gui);
121 break;
122
123 case 'iltestpasswordprotectiongui':
124
125 $this->checkTestExecutable();
126
127 require_once 'Modules/Test/classes/class.ilTestPasswordProtectionGUI.php';
128 $gui = new ilTestPasswordProtectionGUI($this->ctrl, $this->tpl, $this->lng, $this, $this->passwordChecker);
129 $ret = $this->ctrl->forwardCommand($gui);
130 break;
131
132 default:
133
135 {
136 $this->checkTestExecutable();
137 }
138
139 $cmd .= 'Cmd';
140 $ret =& $this->$cmd();
141 break;
142 }
143 return $ret;
144 }
145
146 protected function startTestCmd()
147 {
148 global $ilUser;
149
150 $_SESSION['tst_pass_finish'] = 0;
151
152 // ensure existing test session
153 $this->testSession->setUserId($ilUser->getId());
154 $this->testSession->setAnonymousId($_SESSION["tst_access_code"][$this->object->getTestId()]);
155 $this->testSession->setObjectiveOrientedContainerId($this->getObjectiveOrientedContainer()->getObjId());
156 $this->testSession->saveToDb();
157
158 $active_id = $this->testSession->getActiveId();
159 $this->ctrl->setParameter($this, "active_id", $active_id);
160
161 $shuffle = $this->object->getShuffleQuestions();
162 if ($this->object->isRandomTest())
163 {
165
166 $this->object->loadQuestions();
167 $shuffle = FALSE; // shuffle is already done during the creation of the random questions
168 }
169
170 assQuestion::_updateTestPassResults(
171 $active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(), null, $this->object->id
172 );
173
174 // ensure existing test sequence
175 if( !$this->testSequence->hasSequence() )
176 {
177 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
178 $this->testSequence->saveToDb();
179 }
180
181 $this->testSequence->loadFromDb();
182 $this->testSequence->loadQuestions();
183
184 if( $this->testSession->isObjectiveOriented() )
185 {
186 require_once 'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
187 $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->testSession);
188
189 $objectivesAdapter->notifyTestStart($this->testSession, $this->object->getId());
190 $objectivesAdapter->prepareTestPass($this->testSession, $this->testSequence);
191
192 $objectivesAdapter->buildQuestionRelatedObjectiveList(
193 $this->testSequence, $this->questionRelatedObjectivesList
194 );
195
196 if( $this->testSequence->hasOptionalQuestions() )
197 {
199
200 $this->testSequence->reorderOptionalQuestionsToSequenceEnd();
201 $this->testSequence->saveToDb();
202 }
203 }
204
205 $active_time_id = $this->object->startWorkingTime(
206 $this->testSession->getActiveId(), $this->testSession->getPass()
207 );
208 $_SESSION["active_time_id"] = $active_time_id;
209
210 $sequenceElement = $this->testSequence->getFirstSequence();
211
212 $this->ctrl->setParameter($this, 'sequence', $sequenceElement);
213 $this->ctrl->setParameter($this, 'pmode', '');
214
215 if ($this->object->getListOfQuestionsStart())
216 {
217 $this->ctrl->redirect($this, ilTestPlayerCommands::QUESTION_SUMMARY);
218 }
219
220 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
221 }
222
223 private function isValidSequenceElement($sequenceElement)
224 {
225 if( $sequenceElement === false )
226 {
227 return false;
228 }
229
230 if( $sequenceElement < 1 )
231 {
232 return false;
233 }
234
235 if( !$this->testSequence->getPositionOfSequence($sequenceElement) )
236 {
237 return false;
238 }
239
240 return true;
241 }
242
243 protected function showQuestionCmd()
244 {
245 $_SESSION['tst_pass_finish'] = 0;
246
247 $_SESSION["active_time_id"]= $this->object->startWorkingTime(
248 $this->testSession->getActiveId(), $this->testSession->getPass()
249 );
250
251 $sequenceElement = $this->getCurrentSequenceElement();
252
253 if( !$this->isValidSequenceElement($sequenceElement) )
254 {
255 $sequenceElement = $this->testSequence->getFirstSequence();
256 }
257
258 $this->testSession->setLastSequence($sequenceElement);
259 $this->testSession->saveToDb();
260
261
262 $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
263
264 if( !(int)$questionId && $this->testSession->isObjectiveOriented() )
265 {
267 }
268
269 $isQuestionWorkedThrough = assQuestion::_isWorkedThrough(
270 $this->testSession->getActiveId(), $questionId, $this->testSession->getPass()
271 );
272 $missingQuestionResultExists = assQuestion::missingResultRecordExists(
273 $this->testSession->getActiveId(), $this->testSession->getPass(),
274 $this->testSequence->getOrderedSequenceQuestions()
275 );
276
277 $presentationMode = $this->getPresentationModeParameter();
278 $instantResponse = $this->getInstantResponseParameter();
279
280 if( !$presentationMode )
281 {
282 $presentationMode = $this->getQuestionsDefaultPresentationMode($isQuestionWorkedThrough);
283 }
284
285 if( $this->isParticipantsAnswerFixed($questionId) )
286 {
288 $instantResponse = true;
289 }
290
291 $questionGui = $this->getQuestionGuiInstance($questionId);
292
293 if( !($questionGui instanceof assQuestionGUI) )
294 {
295 $this->handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement);
296 }
297
298 $questionGui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequenceElement));
299 $questionGui->setQuestionCount($this->testSequence->getUserQuestionCount());
300
301 require_once 'Modules/Test/classes/class.ilTestQuestionHeaderBlockBuilder.php';
302 $headerBlockBuilder = new ilTestQuestionHeaderBlockBuilder($this->lng);
303 $headerBlockBuilder->setHeaderMode($this->object->getTitleOutput());
304 $headerBlockBuilder->setQuestionTitle($questionGui->object->getTitle());
305 $headerBlockBuilder->setQuestionPoints($questionGui->object->getPoints());
306 $headerBlockBuilder->setQuestionPosition($this->testSequence->getPositionOfSequence($sequenceElement));
307 $headerBlockBuilder->setQuestionCount($this->testSequence->getUserQuestionCount());
308 $headerBlockBuilder->setQuestionPostponed($this->testSequence->isPostponedQuestion($questionId));
309 $headerBlockBuilder->setQuestionObligatory(
310 $this->object->areObligationsEnabled() && ilObjTest::isQuestionObligatory($questionGui->object->getId())
311 );
312 if( $this->testSession->isObjectiveOriented() )
313 {
314 require_once 'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
315 $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->testSession);
316 $objectivesAdapter->buildQuestionRelatedObjectiveList($this->testSequence, $this->questionRelatedObjectivesList);
317 $this->questionRelatedObjectivesList->loadObjectivesTitles();
318
319 $objectivesString = $this->questionRelatedObjectivesList->getQuestionRelatedObjectiveTitles($questionId);
320 $headerBlockBuilder->setQuestionRelatedObjectives($objectivesString);
321 }
322 $questionGui->setQuestionHeaderBlockBuilder($headerBlockBuilder);
323
324 $this->prepareTestPage($presentationMode, $sequenceElement, $questionId);
325
326 $navigationToolbarGUI = $this->getTestNavigationToolbarGUI();
327 $navigationToolbarGUI->setFinishTestButtonEnabled(true);
328
329 $this->ctrl->setParameter($this, 'sequence', $sequenceElement);
330 $this->ctrl->setParameter($this, 'pmode', $presentationMode);
331 $formAction = $this->ctrl->getFormAction($this, ilTestPlayerCommands::SUBMIT_INTERMEDIATE_SOLUTION);
332
333 switch($presentationMode)
334 {
336
337 $navigationToolbarGUI->setDisabledStateEnabled(true);
338
339 $this->showQuestionEditable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
340
341 break;
342
344
345 $navigationToolbarGUI->setFinishTestButtonPrimary(!$missingQuestionResultExists);
346
347 if( $this->testSequence->isQuestionOptional($questionGui->object->getId()) )
348 {
350 }
351
352 $this->showQuestionViewable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
353
354 break;
355
356 default:
357
358 require_once 'Modules/Test/exceptions/class.ilTestException.php';
359 throw new ilTestException('no presentation mode given');
360 }
361
362 $navigationToolbarGUI->build();
363 $this->populateTestNavigationToolbar($navigationToolbarGUI);
364
366 $sequenceElement, $presentationMode == ilTestPlayerAbstractGUI::PRESENTATION_MODE_EDIT
367 );
368
369 if ($instantResponse)
370 {
372 $questionGui, $presentationMode == ilTestPlayerAbstractGUI::PRESENTATION_MODE_VIEW
373 );
374 }
375 }
376
377 protected function editSolutionCmd()
378 {
379 $this->ctrl->setParameter($this, 'pmode', ilTestPlayerAbstractGUI::PRESENTATION_MODE_EDIT);
380 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
381 }
382
383 protected function submitSolutionAndNextCmd()
384 {
385 if( $this->object->isForceInstantFeedbackEnabled() )
386 {
387 return $this->submitSolutionCmd();
388 }
389
390 if( $this->saveQuestionSolution(true, false) )
391 {
392 $questionId = $this->testSequence->getQuestionForSequence(
394 );
395
396 $this->getQuestionInstance($questionId)->removeIntermediateSolution(
397 $this->testSession->getActiveId(), $this->testSession->getPass()
398 );
399
400 $nextSequenceElement = $this->testSequence->getNextSequence($this->getCurrentSequenceElement());
401
402 if(!$this->isValidSequenceElement($nextSequenceElement))
403 {
404 $nextSequenceElement = $this->testSequence->getFirstSequence();
405 }
406
407 $this->testSession->setLastSequence($nextSequenceElement);
408 $this->testSession->saveToDb();
409
410 $this->ctrl->setParameter($this, 'sequence', $nextSequenceElement);
411 $this->ctrl->setParameter($this, 'pmode', '');
412 }
413
414 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
415 }
416
417 protected function submitSolutionCmd()
418 {
419 if( $this->saveQuestionSolution(true, false) )
420 {
421 $questionId = $this->testSequence->getQuestionForSequence(
423 );
424
425 $this->getQuestionInstance($questionId)->removeIntermediateSolution(
426 $this->testSession->getActiveId(), $this->testSession->getPass()
427 );
428
429 if( $this->object->isForceInstantFeedbackEnabled() )
430 {
431 $this->ctrl->setParameter($this, 'instresp', 1);
432
433 $this->testSequence->setQuestionChecked($questionId);
434 $this->testSequence->saveToDb();
435 }
436
437 if( $this->getNextCommandParameter() )
438 {
439 if( $this->getNextSequenceParameter() )
440 {
441 $this->ctrl->setParameter($this, 'sequence', $this->getNextSequenceParameter());
442 $this->ctrl->setParameter($this, 'pmode', '');
443 }
444
445 $this->ctrl->redirect($this, $this->getNextCommandParameter());
446 }
447
448 $this->ctrl->setParameter($this, 'pmode', ilTestPlayerAbstractGUI::PRESENTATION_MODE_VIEW);
449 }
450
451 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
452 }
453
454 protected function discardSolutionCmd()
455 {
456 $currentSequenceElement = $this->getCurrentSequenceElement();
457
458 $currentQuestionOBJ = $this->getQuestionInstance(
459 $this->testSequence->getQuestionForSequence($currentSequenceElement)
460 );
461
462 $currentQuestionOBJ->resetUsersAnswer(
463 $this->testSession->getActiveId(), $this->testSession->getPass()
464 );
465
466 $this->ctrl->saveParameter($this, 'sequence');
467
468 $this->ctrl->setParameter($this, 'pmode', ilTestPlayerAbstractGUI::PRESENTATION_MODE_VIEW);
469
470 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
471 }
472
473 protected function skipQuestionCmd()
474 {
475 $curSequenceElement = $this->getCurrentSequenceElement();
476 $nextSequenceElement = $this->testSequence->getNextSequence($curSequenceElement);
477
478 if(!$this->isValidSequenceElement($nextSequenceElement))
479 {
480 $nextSequenceElement = $this->testSequence->getFirstSequence();
481 }
482
483 if( $this->object->isPostponingEnabled() )
484 {
485 $this->testSequence->postponeSequence($curSequenceElement);
486 $this->testSequence->saveToDb();
487 }
488
489 $this->ctrl->setParameter($this, 'sequence', $nextSequenceElement);
490 $this->ctrl->setParameter($this, 'pmode', '');
491
492 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
493 }
494
495 protected function nextQuestionCmd()
496 {
497 $sequenceElement = $this->testSequence->getNextSequence(
499 );
500
501 if(!$this->isValidSequenceElement($sequenceElement))
502 {
503 $sequenceElement = $this->testSequence->getFirstSequence();
504 }
505
506 $this->ctrl->setParameter($this, 'sequence', $sequenceElement);
507 $this->ctrl->setParameter($this, 'pmode', '');
508
509 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
510 }
511
512 protected function previousQuestionCmd()
513 {
514 $sequenceElement = $this->testSequence->getPreviousSequence(
516 );
517
518 if(!$this->isValidSequenceElement($sequenceElement))
519 {
520 $sequenceElement = $this->testSequence->getLastSequence();
521 }
522
523 $this->ctrl->setParameter($this, 'sequence', $sequenceElement);
524 $this->ctrl->setParameter($this, 'pmode', '');
525
526 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
527 }
528
529 protected function isFirstQuestionInSequence($sequenceElement)
530 {
531 return $sequenceElement == $this->testSequence->getFirstSequence();
532 }
533
534 protected function isLastQuestionInSequence($sequenceElement)
535 {
536 return $sequenceElement == $this->testSequence->getLastSequence();
537 }
538
544 protected function canSaveResult()
545 {
546 return !$this->object->endingTimeReached() && !$this->isMaxProcessingTimeReached() && !$this->isNrOfTriesReached();
547 }
548
552 protected function getCurrentQuestionId()
553 {
554 return $this->testSequence->getQuestionForSequence($_GET["sequence"]);
555 }
556
560 public function saveQuestionSolution($authorized = true, $force = false)
561 {
562 $this->updateWorkingTime();
563 $this->saveResult = FALSE;
564 if (!$force)
565 {
566 $formtimestamp = $_POST["formtimestamp"];
567 if (strlen($formtimestamp) == 0) $formtimestamp = $_GET["formtimestamp"];
568 if ($formtimestamp != $_SESSION["formtimestamp"])
569 {
570 $_SESSION["formtimestamp"] = $formtimestamp;
571 }
572 else
573 {
574 return FALSE;
575 }
576 }
577 // save question solution
578 if ($this->canSaveResult() || $force)
579 {
580 // but only if the ending time is not reached
581 $q_id = $this->testSequence->getQuestionForSequence($_GET["sequence"]);
582 if (is_numeric($q_id) && (int)$q_id)
583 {
584 $questionOBJ = $this->getQuestionInstance($q_id);
585 $pass = NULL;
586 $active_id = $this->testSession->getActiveId();
587 if ($this->object->isRandomTest())
588 {
589 $pass = $this->object->_getPass($active_id);
590 }
591 $this->saveResult = $questionOBJ->persistWorkingState(
592 $active_id, $pass, $this->object->areObligationsEnabled(), $authorized
593 );
594
595 if( $authorized && $this->testSession->isObjectiveOriented() )
596 {
597 require_once 'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
598 $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->testSession);
599 $objectivesAdapter->updateQuestionResult($this->testSession, $questionOBJ);
600 }
601
602 if( $authorized && $this->object->isSkillServiceToBeConsidered() )
603 {
604 $this->handleSkillTriggering($this->testSession);
605 }
606 }
607 }
608
609 if ($this->saveResult == FALSE)
610 {
611 $this->ctrl->setParameter($this, "save_error", "1");
612 $_SESSION["previouspost"] = $_POST;
613 }
614
615 return $this->saveResult;
616 }
617
618 protected function showInstantResponseCmd()
619 {
620 $questionId = $this->testSequence->getQuestionForSequence(
622 );
623
624 if( !$this->isParticipantsAnswerFixed($questionId) )
625 {
627 $this->object->isInstantFeedbackAnswerFixationEnabled()
628 );
629
630 $this->testSequence->setQuestionChecked($questionId);
631 $this->testSequence->saveToDb();
632 }
633
634 $this->ctrl->setParameter($this, 'instresp', 1);
635 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
636 }
637
638 protected function handleQuestionActionCmd()
639 {
640 $questionId = $this->testSequence->getQuestionForSequence(
642 );
643
644 if( !$this->isParticipantsAnswerFixed($questionId) )
645 {
646 $this->updateWorkingTime();
647 $this->saveQuestionSolution(false);
648 }
649
650 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
651 }
652
654 {
655 if ($this->testSession->getActiveId() > 0)
656 {
657 if ($this->testSequence->hasRandomQuestionsForPass($this->testSession->getActiveId(), $this->testSession->getPass()) > 0)
658 {
659 // Something went wrong. Maybe the user pressed the start button twice
660 // Questions already exist so there is no need to create new questions
661
662 global $ilLog, $ilUser;
663
664 $ilLog->write(
665 __METHOD__.' Random Questions allready exists for user '.
666 $ilUser->getId().' in test '.$this->object->getTestId()
667 );
668
669 return true;
670 }
671 }
672 else
673 {
674 // This may not happen! If it happens, raise a fatal error...
675
676 global $ilLog, $ilUser;
677
678 $ilLog->write(__METHOD__.' '.sprintf(
679 $this->lng->txt("error_random_question_generation"), $ilUser->getId(), $this->object->getTestId()
680 ));
681
682 return true;
683 };
684
685 return false;
686 }
687
689 {
690 global $tree, $ilDB, $ilPluginAdmin;
691
692 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php';
693 $questionSetConfig = new ilTestRandomQuestionSetConfig($tree, $ilDB, $ilPluginAdmin, $this->object);
694 $questionSetConfig->loadFromDb();
695
696 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
697 $sourcePoolDefinitionFactory = new ilTestRandomQuestionSetSourcePoolDefinitionFactory($ilDB, $this->object);
698
699 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
700 $sourcePoolDefinitionList = new ilTestRandomQuestionSetSourcePoolDefinitionList($ilDB, $this->object, $sourcePoolDefinitionFactory);
701 $sourcePoolDefinitionList->loadDefinitions();
702
703 $this->processLocker->requestRandomPassBuildLock($sourcePoolDefinitionList->hasTaxonomyFilters());
704
706 {
707 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
708 $stagingPoolQuestionList = new ilTestRandomQuestionSetStagingPoolQuestionList($ilDB, $ilPluginAdmin);
709
710 require_once 'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
711 $questionSetBuilder = ilTestRandomQuestionSetBuilder::getInstance($ilDB, $this->object, $questionSetConfig, $sourcePoolDefinitionList, $stagingPoolQuestionList);
712
713 $questionSetBuilder->performBuild($this->testSession);
714 }
715
716 $this->processLocker->releaseRandomPassBuildLock();
717 }
718
722 protected function resumePlayerCmd()
723 {
724 $this->handleUserSettings();
725
726 $active_id = $this->testSession->getActiveId();
727 $this->ctrl->setParameter($this, "active_id", $active_id);
728
729 $active_time_id = $this->object->startWorkingTime($active_id, $this->testSession->getPass());
730 $_SESSION["active_time_id"] = $active_time_id;
731 $_SESSION['tst_pass_finish'] = 0;
732
733 if ($this->object->isRandomTest())
734 {
735 if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass()))
736 {
737 // create a new set of random questions
739 }
740 }
741
742 $shuffle = $this->object->getShuffleQuestions();
743 if ($this->object->isRandomTest())
744 {
745 $shuffle = FALSE;
746 }
747
748 assQuestion::_updateTestPassResults(
749 $active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(), null, $this->object->id
750 );
751
752 // ensure existing test sequence
753 if( !$this->testSequence->hasSequence() )
754 {
755 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
756 $this->testSequence->saveToDb();
757 }
758
759 if ($this->object->getListOfQuestionsStart())
760 {
761 $this->ctrl->redirect($this, ilTestPlayerCommands::QUESTION_SUMMARY);
762 }
763
764 $this->ctrl->setParameter($this, 'sequence', $this->testSession->getLastSequence());
765 $this->ctrl->setParameter($this, 'pmode', '');
766 $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
767 }
768
769 protected function isShowingPostponeStatusReguired($questionId)
770 {
771 return $this->testSequence->isPostponedQuestion($questionId);
772 }
773
775 {
776 global $ilDB, $ilUser;
777
778 $assSettings = new ilSetting('assessment');
779
780 include_once ("./Modules/Test/classes/class.ilObjAssessmentFolder.php");
781 $isAssessmentLogEnabled = ilObjAssessmentFolder::_enabledAssessmentLogging();
782
783 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionUserSolutionAdopter.php';
784 $userSolutionAdopter = new ilAssQuestionUserSolutionAdopter($ilDB, $assSettings, $isAssessmentLogEnabled);
785
786 $userSolutionAdopter->setUserId($ilUser->getId());
787 $userSolutionAdopter->setActiveId($this->testSession->getActiveId());
788 $userSolutionAdopter->setTargetPass($this->testSequence->getPass());
789 $userSolutionAdopter->setQuestionIds($this->testSequence->getOptionalQuestions());
790
791 $userSolutionAdopter->perform();
792 }
793
794 abstract protected function populateQuestionOptionalMessage();
795
796 protected function isOptionalQuestionAnsweringConfirmationRequired($sequenceKey)
797 {
798 if( $this->testSequence->isAnsweringOptionalQuestionsConfirmed() )
799 {
800 return false;
801 }
802
803 $questionId = $this->testSequence->getQuestionForSequence($sequenceKey);
804
805 if( !$this->testSequence->isQuestionOptional($questionId) )
806 {
807 return false;
808 }
809
810 return true;
811 }
812
814 {
815 return true;
816 }
817
819 {
820 ilUtil::sendFailure(sprintf($this->lng->txt('tst_objective_oriented_test_pass_without_questions'), $this->object->getTitle()), true);
821
822 $this->backToInfoScreenCmd();
823 }
824}
$_GET["client_id"]
$_SESSION["AccountId"]
Basic GUI class for assessment questions.
static missingResultRecordExists($activeId, $pass, $questionIds)
static _isWorkedThrough($active_id, $question_id, $pass=NULL)
Returns true if the question was worked through in the given pass Worked through means that the user ...
Question page GUI class.
static getInstance(ilTestSession $a_test_session)
_enabledAssessmentLogging()
check wether assessment logging is enabled or not
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
ILIAS Setting Class.
Base Exception for all Exceptions relating to Modules/Test.
Output class for assessment test execution.
isLastQuestionInSequence($sequenceElement)
isOptionalQuestionAnsweringConfirmationRequired($sequenceKey)
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
resumePlayerCmd()
Resume a test at the last position.
populateQuestionOptionalMessage()
isShowingPostponeStatusReguired($questionId)
executeCommand()
Execute Command.
isValidSequenceElement($sequenceElement)
isFirstQuestionInSequence($sequenceElement)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
Output class for assessment test execution.
handleSkillTriggering(ilTestSession $testSession)
populateQuestionNavigation($sequenceElement, $disabled)
prepareTestPage($presentationMode, $sequenceElement, $questionId)
handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement)
getQuestionInstance($questionId, $fromCache=true)
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
getQuestionGuiInstance($questionId, $fromCache=true)
ensureExistingTestSession(ilTestSession $testSession)
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not
handleUserSettings()
Handles some form parameters on starting and resuming a test.
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
getQuestionsDefaultPresentationMode($isQuestionWorkedThrough)
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbarGUI)
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
static getInstance(ilDB $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
getCommand($cmd)
Retrieves the ilCtrl command.
Signature Plugin Class.
Class ilTestSubmissionReviewGUI.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static initConnectionWithAnimation()
Init YUI Connection module.
static initjQuery($a_tpl=null)
Init jQuery.
$_POST['username']
Definition: cron.php:12
$cmd
Definition: sahs_server.php:35
global $ilDB
global $ilUser
Definition: imgupload.php:15