ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5
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 
4 require_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 
45  $this->initAssessmentSettings();
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  {
626  $this->saveQuestionSolution(
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 }
isShowingPostponeStatusReguired($questionId)
isValidSequenceElement($sequenceElement)
ILIAS Setting Class.
populateQuestionOptionalMessage()
$_POST['username']
Definition: cron.php:12
$_SESSION["AccountId"]
Signature Plugin Class.
$_GET["client_id"]
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
static getInstance(ilDB $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
Output class for assessment test execution.
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not ...
$cmd
Definition: sahs_server.php:35
isLastQuestionInSequence($sequenceElement)
isFirstQuestionInSequence($sequenceElement)
executeCommand()
Execute Command.
resumePlayerCmd()
Resume a test at the last position.
handleUserSettings()
Handles some form parameters on starting and resuming a test.
_enabledAssessmentLogging()
check wether assessment logging is enabled or not
Question page GUI class.
Base Exception for all Exceptions relating to Modules/Test.
prepareTestPage($presentationMode, $sequenceElement, $questionId)
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
ensureExistingTestSession(ilTestSession $testSession)
static getInstance(ilTestSession $a_test_session)
isOptionalQuestionAnsweringConfirmationRequired($sequenceKey)
handleSkillTriggering(ilTestSession $testSession)
Class ilTestSubmissionReviewGUI.
getCommand($cmd)
Retrieves the ilCtrl command.
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbarGUI)
Basic GUI class for assessment questions.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
global $ilUser
Definition: imgupload.php:15
populateQuestionNavigation($sequenceElement, $disabled)
global $ilDB
getQuestionGuiInstance($questionId, $fromCache=true)
static initjQuery($a_tpl=null)
Init jQuery.
getQuestionInstance($questionId, $fromCache=true)
getQuestionsDefaultPresentationMode($isQuestionWorkedThrough)
handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement)
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
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 ...
static initConnectionWithAnimation()
Init YUI Connection module.
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
Output class for assessment test execution.
static missingResultRecordExists($activeId, $pass, $questionIds)