4 require_once
'./Modules/Test/classes/inc.AssessmentConstants.php';
5 require_once
'./Modules/Test/classes/class.ilTestPlayerCommands.php';
6 require_once
'./Modules/Test/classes/class.ilTestServiceGUI.php';
7 require_once
'./Modules/TestQuestionPool/classes/class.assQuestion.php';
8 require_once
'./Services/UIComponent/Button/classes/class.ilSubmitButton.php';
9 require_once
'Modules/Test/classes/class.ilTestPlayerNavButton.php';
70 $this->ref_id =
$_GET[
"ref_id"];
73 $rbacsystem = $DIC[
'rbacsystem'];
76 require_once
'Modules/Test/classes/class.ilTestPasswordChecker.php';
79 $this->processLocker = null;
80 $this->testSession = null;
81 $this->assSettings = null;
87 $rbacsystem = $DIC[
'rbacsystem'];
89 if (!$rbacsystem->checkAccess(
"read", $this->object->getRefId())) {
91 $this->
ilias->raiseError($this->lng->txt(
"cannot_execute_test"), $this->
ilias->error_obj->MESSAGE);
97 $executable = $this->
object->isExecutable($this->testSession, $this->testSession->getUserId());
99 if (!$executable[
'executable']) {
101 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
109 if ($testSession->
getUserId() != $DIC->user()->getId()) {
110 throw new ilTestException(
'active id given does not relate to current user!');
139 $ilDB = $DIC[
'ilDB'];
141 require_once
'Modules/Test/classes/class.ilTestProcessLockerFactory.php';
143 $this->processLocker = $processLockerFactory->withContextId((
int) $activeId)->getLocker();
154 include_once(
"./Services/Tagging/classes/class.ilTaggingGUI.php");
156 $tagging_gui->setObject($this->object->getId(), $this->
object->getType());
157 $tagging_gui->saveInput();
158 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
167 $this->
object->updateWorkingTime(
$_SESSION[
"active_time_id"]);
170 $_SESSION[
"active_time_id"] = $this->
object->startWorkingTime(
171 $this->testSession->getActiveId(),
172 $this->testSession->getPass()
186 $this->testSession->getActiveId(),
187 $this->testSession->getPass()
201 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
215 $active_id = $this->testSession->getActiveId();
216 $starting_time = $this->
object->getStartingTimeOfUser($active_id);
217 if ($starting_time ===
false) {
220 return $this->
object->isMaxProcessingTimeReached($starting_time, $active_id);
226 $show_question_inline_score =
false;
227 if ($this->object->getAnswerFeedbackPoints()) {
228 $show_question_inline_score =
true;
229 return $show_question_inline_score;
231 return $show_question_inline_score;
236 $this->tpl->setCurrentBlock(
'test_nav_toolbar');
237 $this->tpl->setVariable(
'TEST_NAV_TOOLBAR', $toolbarGUI->getHTML());
238 $this->tpl->parseCurrentBlock();
267 $button->setId(
'bottomnextbutton');
269 $this->tpl->setCurrentBlock(
"next_bottom");
270 $this->tpl->setVariable(
"BTN_NEXT", $button->render());
271 $this->tpl->parseCurrentBlock();
277 $button->setId(
'nextbutton');
279 $this->tpl->setCurrentBlock(
"next");
280 $this->tpl->setVariable(
"BTN_NEXT", $button->render());
281 $this->tpl->parseCurrentBlock();
287 $button->setId(
'bottomprevbutton');
289 $this->tpl->setCurrentBlock(
"prev_bottom");
290 $this->tpl->setVariable(
"BTN_PREV", $button->render());
291 $this->tpl->parseCurrentBlock();
297 $button->setId(
'prevbutton');
299 $this->tpl->setCurrentBlock(
"prev");
300 $this->tpl->setVariable(
"BTN_PREV", $button->render());
301 $this->tpl->parseCurrentBlock();
313 $button->setPrimary($primaryNext);
314 $button->setRightGlyph(
'glyphicon glyphicon-arrow-right');
318 $button->setCaption(
'next_question');
319 $button->addCSSClass(
'ilTstNavElem');
332 $button->setLeftGlyph(
'glyphicon glyphicon-arrow-left');
336 $button->setCaption(
'previous_question');
337 $button->addCSSClass(
'ilTstNavElem');
344 $solutionValues = $question_gui->object->getSolutionValues(
345 $this->testSession->getActiveId(),
350 $question_gui->object->fetchIndexedValuesFromValuePairs($solutionValues)
353 $this->tpl->setCurrentBlock(
"specific_feedback");
354 $this->tpl->setVariable(
"SPECIFIC_FEEDBACK", $feedback);
355 $this->tpl->parseCurrentBlock();
362 if (strlen($feedback)) {
368 $this->tpl->setCurrentBlock(
"answer_feedback");
369 $this->tpl->setVariable(
"ANSWER_FEEDBACK", $feedback);
370 $this->tpl->setVariable(
"ILC_FB_CSS_CLASS", $cssClass);
371 $this->tpl->parseCurrentBlock();
377 $scoreInformation = sprintf(
378 $this->lng->txt(
"you_received_a_of_b_points"),
383 $this->tpl->setCurrentBlock(
"received_points_information");
384 $this->tpl->setVariable(
"RECEIVED_POINTS_INFORMATION", $scoreInformation);
385 $this->tpl->parseCurrentBlock();
390 if (strlen($solutionoutput)) {
391 $this->tpl->setCurrentBlock(
"solution_output");
392 $this->tpl->setVariable(
"CORRECT_SOLUTION", $this->lng->txt(
"tst_best_solution_is"));
393 $this->tpl->setVariable(
"QUESTION_FEEDBACK", $solutionoutput);
394 $this->tpl->parseCurrentBlock();
400 $this->tpl->setCurrentBlock(
"SyntaxStyle");
401 $this->tpl->setVariable(
402 "LOCATION_SYNTAX_STYLESHEET",
405 $this->tpl->parseCurrentBlock();
410 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
411 $this->tpl->setCurrentBlock(
"ContentStyle");
412 $this->tpl->setVariable(
413 "LOCATION_CONTENT_STYLESHEET",
416 $this->tpl->parseCurrentBlock();
426 if ($this->testSession->isAnonymousUser()) {
427 $this->testSession->setAccessCodeToSession(
$_POST[
'anonymous_id']);
430 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
442 $isFirstTestStartRequest =
false;
444 $this->processLocker->executeTestStartLockOperation(
function () use ($testStartLock, &$isFirstTestStartRequest) {
445 if ($this->testSession->lookupTestStartLock() != $testStartLock) {
446 $this->testSession->persistTestStartLock($testStartLock);
447 $isFirstTestStartRequest =
true;
451 if ($isFirstTestStartRequest) {
456 $this->ctrl->setParameterByClass(
'ilObjTestGUI',
'lock', $testStartLock);
457 $this->ctrl->redirectByClass(
"ilobjtestgui",
"redirectToInfoScreen");
464 } elseif (isset(
$_GET[
'lock']) && strlen(
$_GET[
'lock'])) {
465 return $_GET[
'lock'];
481 if ($this->object->checkMaximumAllowedUsers() ==
false) {
485 if ($this->testSession->isAnonymousUser() && !$this->testSession->getActiveId()) {
486 $accessCode = $this->testSession->createNewAccessCode();
488 $this->testSession->setAccessCodeToSession($accessCode);
489 $this->testSession->setAnonymousId($accessCode);
490 $this->testSession->saveToDb();
495 $this->testSession->unsetAccessCodeInSession();
501 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_anonymous_code_presentation.html",
"Modules/Test");
502 $this->tpl->setCurrentBlock(
"adm_content");
503 $this->tpl->setVariable(
"TEXT_ANONYMOUS_CODE_CREATED", $this->lng->txt(
"tst_access_code_created"));
504 $this->tpl->setVariable(
"TEXT_ANONYMOUS_CODE", $this->testSession->getAccessCodeFromSession());
505 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
507 $this->tpl->setVariable(
"TXT_CONFIRM", $this->lng->txt(
"continue_work"));
508 $this->tpl->parseCurrentBlock();
524 if (
$_POST[
"chb_javascript"]) {
525 $ilUser->writePref(
"tst_javascript", 1);
527 $ilUser->writePref(
"tst_javascript", 0);
531 if ($this->object->getNrOfTries() != 1) {
532 if ($this->object->getUsePreviousAnswers() == 1) {
533 if (
$_POST[
"chb_use_previous_answers"]) {
534 $ilUser->writePref(
"tst_use_previous_answers", 1);
536 $ilUser->writePref(
"tst_use_previous_answers", 0);
548 $active_id = $this->testSession->getActiveId();
553 $this->testSession->setLastFinishedPass($this->testSession->getPass());
554 $this->testSession->increaseTestPass();
558 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_redirect_autosave.html",
"Modules/Test");
559 $this->tpl->setVariable(
"TEXT_REDIRECT", $this->lng->txt(
"redirectAfterSave"));
560 $this->tpl->setVariable(
"URL",
$url);
565 $active_id = $this->testSession->getActiveId();
570 $this->testSession->setLastFinishedPass($this->testSession->getPass());
571 $this->testSession->increaseTestPass();
575 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_redirect_autosave.html",
"Modules/Test");
576 $this->tpl->setVariable(
"TEXT_REDIRECT", $this->lng->txt(
"redirectAfterSave"));
577 $this->tpl->setVariable(
"URL",
$url);
600 $res = is_int($db_res);
603 $result = $this->lng->txt(
"autosave_success");
605 $result = $this->lng->txt(
"autosave_failed");
637 $this->testSession->getActiveId(),
638 $this->testSession->getPass()
641 $result[
'isAnswered'] = $state[
'authorized'];
642 $result[
'isAnswerChanged'] = $state[
'intermediate'];
666 $show_side_list =
$ilUser->getPref(
'side_list_of_questions');
667 $ilUser->writePref(
'side_list_of_questions', !$show_side_list);
684 $questionId = $this->testSequence->getQuestionForSequence(
688 $this->
object->setQuestionSetSolved(1, $questionId, $this->testSession->getUserId());
706 $questionId = $this->testSequence->getQuestionForSequence(
710 $this->
object->setQuestionSetSolved(0, $questionId, $this->testSession->getUserId());
726 protected function confirmFinishTestCmd()
734 require_once
'Services/Utilities/classes/class.ilConfirmationGUI.php';
736 $confirmation->setFormAction($this->ctrl->getFormAction($this,
'confirmFinish'));
737 $confirmation->setHeaderText($this->lng->txt(
"tst_finish_confirmation_question"));
738 $confirmation->setConfirm($this->lng->txt(
"tst_finish_confirm_button"),
'confirmFinish');
748 $active_id = $this->testSession->getActiveId();
766 if ($this->object->areObligationsEnabled() && !$allObligationsAnswered) {
767 if ($this->object->getListOfQuestions()) {
777 if ($this->object->getEnableExamview() && !isset(
$_GET[
'reviewed']) && $requires_confirmation) {
778 $this->ctrl->redirectByClass(
'ilTestSubmissionReviewGUI',
"show");
783 if (($requires_confirmation) && ($actualpass == $this->object->getNrOfTries() - 1)) {
785 return $this->confirmFinishTestCmd();
789 if (($actualpass == $this->object->getNrOfTries() - 1) && (!$requires_confirmation)) {
791 #$ilAuth->setIdle(ilSession::getIdleValue(), false); 792 #$ilAuth->setExpire(0); 793 switch ($this->object->getMailNotification()) {
795 $this->
object->sendSimpleNotification($active_id);
798 $this->
object->sendAdvancedNotification($active_id);
808 if ($this->object->getMailNotificationType() == 1) {
809 switch ($this->object->getMailNotification()) {
811 $this->
object->sendSimpleNotification($active_id);
814 $this->
object->sendAdvancedNotification($active_id);
829 require_once
'Modules/Test/classes/class.ilTestPassFinishTasks.php';
837 $activeId = $this->testSession->getActiveId();
838 $lastFinishedPass = $this->testSession->getLastFinishedPass();
842 $this->ctrl->redirectByClass(
'ilTestSignatureGUI',
'invokeSignaturePlugin');
846 if (!
$_GET[
'skipfinalstatement']) {
847 if ($this->object->getShowFinalStatement()) {
853 $redirection_mode = $this->
object->getRedirectionMode();
854 $redirection_url = $this->
object->getRedirectionUrl();
855 if ($redirection_url && $redirection_mode) {
857 if ($this->object->getKioskMode()) {
871 if (!$this->object->getSignSubmission()) {
875 if (!is_null(
ilSession::get(
"signed_{$activeId}_{$lastFinishedPass}"))) {
880 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
882 $activePlugins = $ilPluginAdmin->getActivePluginsForSlot(
IL_COMP_MODULE,
'Test',
'tsig');
884 if (!count($activePlugins)) {
899 $ilObjDataCache = $DIC[
'ilObjDataCache'];
901 require_once
'Modules/Test/classes/class.ilTestResultHeaderLabelBuilder.php';
904 $objectivesList = null;
907 $testSequence = $this->testSequenceFactory->getSequenceByActiveIdAndPass($this->testSession->getActiveId(), $this->testSession->getPass());
911 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
915 $objectivesList->loadObjectivesTitles();
917 $testResultHeaderLabelBuilder->setObjectiveOrientedContainerId($this->testSession->getObjectiveOrientedContainerId());
918 $testResultHeaderLabelBuilder->setUserId($this->testSession->getUserId());
919 $testResultHeaderLabelBuilder->setTestObjId($this->object->getId());
920 $testResultHeaderLabelBuilder->setTestRefId($this->object->getRefId());
921 $testResultHeaderLabelBuilder->initObjectiveOrientedMode();
924 $results = $this->
object->getTestResult(
931 require_once
'class.ilTestEvaluationGUI.php';
933 $results_output = $testevaluationgui->getPassListOfAnswers(
943 $testResultHeaderLabelBuilder
946 require_once
'./Modules/Test/classes/class.ilTestArchiver.php';
953 if (!is_dir($path)) {
956 $filename = realpath($path) .
'/exam_N' . $inst_id .
'-' . $this->
object->getId()
957 .
'-' . $active .
'-' .
$pass .
'.pdf';
962 $archiver->handInParticipantSubmission($active,
$pass,
$filename, $results_output);
968 $questions = $this->
object->getQuestions();
969 foreach ($questions as $question_id) {
970 $question_object = $this->
object->getQuestionDataset($question_id);
971 if ($question_object->type_tag ==
'assFileUpload') {
990 $handle = opendir($candidate_path);
991 while ($handle !==
false && ($file = readdir($handle)) !==
false) {
993 $filename_start =
'file_' . $active .
'_' .
$pass .
'_';
995 if (strpos($file, $filename_start) === 0) {
996 $archiver->handInParticipantQuestionMaterial($active,
$pass, $question_id, $file, $file);
1002 $passdata = $this->
object->getTestResult(
1008 $overview = $testevaluationgui->getPassListOfAnswers(
1018 $testResultHeaderLabelBuilder
1030 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
1032 $testPassesSelector->setActiveId($this->testSession->getActiveId());
1033 $testPassesSelector->setLastFinishedPass($this->testSession->getLastFinishedPass());
1035 if (count($testPassesSelector->getReportablePasses())) {
1037 $this->ctrl->redirectByClass(array(
'ilTestResultsGUI',
'ilTestEvalObjectiveOrientedGUI'));
1040 $this->ctrl->redirectByClass(array(
'ilTestResultsGUI',
'ilMyTestResultsGUI',
'ilTestEvaluationGUI'));
1048 $this->ctrl->redirectByClass(
'ilObjTestGUI',
'redirectToInfoScreen');
1056 $template =
new ilTemplate(
"tpl.il_as_tst_final_statement.html",
true,
true,
"Modules/Test");
1057 $this->ctrl->setParameter($this,
"skipfinalstatement", 1);
1059 $template->setVariable(
"FINALSTATEMENT", $this->object->prepareTextareaOutput($this->object->getFinalStatement(),
true));
1060 $template->setVariable(
"BUTTON_CONTINUE", $this->lng->txt(
"btn_next"));
1069 $template =
new ilTemplate(
'tpl.il_as_tst_kiosk_head.html',
true,
true,
'Modules/Test');
1070 if ($this->object->getShowKioskModeTitle()) {
1071 $template->setCurrentBlock(
"kiosk_show_title");
1072 $template->setVariable(
"TEST_TITLE", $this->object->getTitle());
1073 $template->parseCurrentBlock();
1075 if ($this->object->getShowKioskModeParticipant()) {
1076 $template->setCurrentBlock(
"kiosk_show_participant");
1077 $template->setVariable(
"PARTICIPANT_NAME_TXT", $this->lng->txt(
"login_as"));
1078 $template->setVariable(
"PARTICIPANT_NAME",
$ilUser->getFullname());
1079 $template->setVariable(
"PARTICIPANT_LOGIN",
$ilUser->getLogin());
1080 $template->setVariable(
"PARTICIPANT_MATRICULATION",
$ilUser->getMatriculation());
1081 $template->setVariable(
"PARTICIPANT_EMAIL",
$ilUser->getEmail());
1082 $template->parseCurrentBlock();
1084 if ($this->object->isShowExamIdInTestPassEnabled()) {
1086 $this->testSession->getActiveId(),
1087 $this->testSession->getPass(),
1088 $this->
object->getId()
1091 $template->setCurrentBlock(
"kiosk_show_exam_id");
1092 $template->setVariable(
"EXAM_ID_TXT", $this->lng->txt(
"exam_id"));
1093 $template->setVariable(
"EXAM_ID", $exam_id);
1094 $template->parseCurrentBlock();
1096 return $template->get();
1106 $ilNavigationHistory = $DIC[
'ilNavigationHistory'];
1108 $ilNavigationHistory->addItem(
1109 $this->testSession->getRefId(),
1123 if ($this->object->endingTimeReached()) {
1129 $this->ctrl->setParameter($this,
"sequence", $sequenceElement);
1134 if ($this->object->getKioskMode()) {
1138 $this->tpl->setVariable(
"TEST_ID", $this->object->getTestId());
1139 $this->tpl->setVariable(
"LOGIN",
$ilUser->getLogin());
1140 $this->tpl->setVariable(
"SEQ_ID", $sequenceElement);
1141 $this->tpl->setVariable(
"QUEST_ID", $questionId);
1143 if ($this->object->getEnableProcessingTime()) {
1147 $this->tpl->setVariable(
"PAGETITLE",
"- " . $this->object->getTitle());
1149 if ($this->object->isShowExamIdInTestPassEnabled() && !$this->
object->getKioskMode()) {
1150 $this->tpl->setCurrentBlock(
'exam_id_footer');
1152 $this->testSession->getActiveId(),
1153 $this->testSession->getPass(),
1154 $this->
object->getId()
1156 $this->tpl->setVariable(
'EXAM_ID_TXT', $this->lng->txt(
'exam_id'));
1157 $this->tpl->parseCurrentBlock();
1160 if ($this->object->getListOfQuestions()) {
1161 $this->
showSideList($presentationMode, $sequenceElement);
1172 $questionNavigationGUI->setQuestionWorkedThrough($isQuestionWorkedThrough);
1179 $answerFeedbackEnabled = (
1180 $instantResponse && $this->
object->getSpecificAnswerFeedback()
1184 $this->testSession->getActiveId(), #active_id
1185 $this->testSession->getPass(), #pass
1186 false, #graphical_output
1187 false, #result_output
1188 true, #show_question_only
1189 $answerFeedbackEnabled, #show_feedback
1190 false, #show_correct_solution
1191 false, #show_manual_scoring
1192 true #show_question_text
1198 $this->testSession->getActiveId(),
1202 $this->tpl->setCurrentBlock(
'readonly_css_class');
1203 $this->tpl->touchBlock(
'readonly_css_class');
1204 $this->tpl->parseCurrentBlock();
1206 $this->tpl->setVariable(
'QUESTION_OUTPUT', $pageoutput);
1208 $this->tpl->setVariable(
"FORMACTION", $formAction);
1209 $this->tpl->setVariable(
"ENCTYPE",
'enctype="' . $questionGui->
getFormEncodingType() .
'"');
1210 $this->tpl->setVariable(
"FORM_TIMESTAMP", time());
1216 $questionGui->object->getId(),
1219 if ($isQuestionWorkedThrough) {
1220 $questionNavigationGUI->setDiscardSolutionButtonEnabled(
true);
1224 } elseif ($this->object->isPostponingEnabled()) {
1225 $questionNavigationGUI->setSkipQuestionLinkTarget(
1233 $answerFeedbackEnabled = (
1234 $instantResponse && $this->
object->getSpecificAnswerFeedback()
1237 if (isset(
$_GET[
'save_error']) &&
$_GET[
'save_error'] == 1 && isset(
$_SESSION[
'previouspost'])) {
1238 $userPostSolution =
$_SESSION[
'previouspost'];
1241 $userPostSolution =
false;
1249 $qstConfig = $questionGui->object->getTestPresentationConfig();
1252 $qstConfig->setWorkedThrough($isQuestionWorkedThrough);
1253 $qstConfig->setIsUnchangedAnswerPossible($this->object->getMCScoring());
1256 if ($qstConfig->isPreviousPassSolutionReuseAllowed()) {
1258 if ($passIndex < $this->testSession->getPass()) {
1259 $qstConfig->setSolutionInitiallyPrefilled(
true);
1262 $passIndex = $this->testSession->getPass();
1269 $formAction, #form_action
1270 $this->testSession->getActiveId(), #active_id
1274 $isPostponed, #is_postponed
1275 $userPostSolution, #user_post_solution
1276 $answerFeedbackEnabled #answer_feedback == inline_specific_feedback
1287 $this->populateQuestionEditControl($questionGui);
1294 require_once
'./Modules/Test/classes/class.ilObjTest.php';
1297 $currentSolutionAvailable = $questionGui->object->authorizedOrIntermediateSolutionExists(
1298 $this->testSession->getActiveId(),
1299 $this->testSession->getPass()
1302 if (!$currentSolutionAvailable) {
1303 $previousPass = $questionGui->object->getSolutionMaxPass(
1304 $this->testSession->getActiveId()
1307 $previousSolutionAvailable = $questionGui->object->authorizedSolutionExists(
1308 $this->testSession->getActiveId(),
1312 if ($previousSolutionAvailable) {
1313 return $previousPass;
1318 return $this->testSession->getPass();
1333 $this->ctrl->saveParameter($this,
'sequence');
1356 $user = $this->
object->getInvitedUsers(
$ilUser->getId());
1357 if (!is_array($user) || count($user) != 1) {
1359 $this->ctrl->redirectByClass(
"ilobjtestgui",
"backToRepository");
1362 $user = array_pop($user);
1364 if (strcmp($user[
"clientip"],
"") != 0 && strcmp($user[
"clientip"],
$_SERVER[
"REMOTE_ADDR"]) != 0) {
1366 $this->ctrl->redirectByClass(
"ilobjtestgui",
"backToRepository");
1378 and $this->
object->startingTimeReached()
1379 and !$this->
object->endingTimeReached();
1387 return $this->
object->hasNrOfTriesRestriction() && $this->
object->isNrOfTriesReached($this->testSession->getPass());
1398 $this->testSession->increasePass();
1399 $this->testSession->setLastSequence(0);
1400 $this->testSession->saveToDb();
1424 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_submit_answers_confirm.html",
"Modules/Test");
1425 $this->tpl->setCurrentBlock(
"adm_content");
1426 if ($this->object->isTestFinished($this->testSession->getActiveId())) {
1427 $this->tpl->setCurrentBlock(
"not_submit_allowed");
1428 $this->tpl->setVariable(
"TEXT_ALREADY_SUBMITTED", $this->lng->txt(
"tst_already_submitted"));
1429 $this->tpl->setVariable(
"BTN_OK", $this->lng->txt(
"tst_show_answer_sheet"));
1431 $this->tpl->setCurrentBlock(
"submit_allowed");
1432 $this->tpl->setVariable(
"TEXT_CONFIRM_SUBMIT_RESULTS", $this->lng->txt(
"tst_confirm_submit_answers"));
1433 $this->tpl->setVariable(
"BTN_OK", $this->lng->txt(
"tst_submit_results"));
1435 $this->tpl->setVariable(
"BTN_BACK", $this->lng->txt(
"back"));
1436 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this,
"finalSubmission"));
1437 $this->tpl->parseCurrentBlock();
1445 $starting_time = $this->
object->getStartingTimeOfUser($active_id);
1446 $processing_time = $this->
object->getProcessingTimeInSeconds($active_id);
1447 $processing_time_minutes = floor($processing_time / 60);
1448 $processing_time_seconds = $processing_time - $processing_time_minutes * 60;
1449 $str_processing_time =
"";
1450 if ($processing_time_minutes > 0) {
1451 $str_processing_time = $processing_time_minutes .
" " . ($processing_time_minutes == 1 ? $this->lng->txt(
"minute") : $this->lng->txt(
"minutes"));
1453 if ($processing_time_seconds > 0) {
1454 if (strlen($str_processing_time) > 0) {
1455 $str_processing_time .=
" " . $this->lng->txt(
"and") .
" ";
1457 $str_processing_time .= $processing_time_seconds .
" " . ($processing_time_seconds == 1 ? $this->lng->txt(
"second") : $this->lng->txt(
"seconds"));
1459 $time_left = $starting_time + $processing_time - time();
1460 $time_left_minutes = floor($time_left / 60);
1461 $time_left_seconds = $time_left - $time_left_minutes * 60;
1462 $str_time_left =
"";
1463 if ($time_left_minutes > 0) {
1464 $str_time_left = $time_left_minutes .
" " . ($time_left_minutes == 1 ? $this->lng->txt(
"minute") : $this->lng->txt(
"minutes"));
1466 if ($time_left < 300) {
1467 if ($time_left_seconds > 0) {
1468 if (strlen($str_time_left) > 0) {
1469 $str_time_left .=
" " . $this->lng->txt(
"and") .
" ";
1471 $str_time_left .= $time_left_seconds .
" " . ($time_left_seconds == 1 ? $this->lng->txt(
"second") : $this->lng->txt(
"seconds"));
1474 $date = getdate($starting_time);
1476 $datenow = getdate();
1477 $this->tpl->setCurrentBlock(
"enableprocessingtime");
1478 $this->tpl->setVariable(
1479 "USER_WORKING_TIME",
1481 $this->lng->txt(
"tst_time_already_spent"),
1482 $formattedStartingTime,
1483 $str_processing_time
1486 $this->tpl->setVariable(
"USER_REMAINING_TIME", sprintf($this->lng->txt(
"tst_time_already_spent_left"), $str_time_left));
1487 $this->tpl->parseCurrentBlock();
1490 require_once
"./Services/jQuery/classes/class.iljQueryUtil.php";
1492 $template =
new ilTemplate(
"tpl.workingtime.js",
true,
true,
'Modules/Test');
1493 $template->setVariable(
"STRING_MINUTE", $this->lng->txt(
"minute"));
1494 $template->setVariable(
"STRING_MINUTES", $this->lng->txt(
"minutes"));
1495 $template->setVariable(
"STRING_SECOND", $this->lng->txt(
"second"));
1496 $template->setVariable(
"STRING_SECONDS", $this->lng->txt(
"seconds"));
1497 $template->setVariable(
"STRING_TIMELEFT", $this->lng->txt(
"tst_time_already_spent_left"));
1498 $template->setVariable(
"AND", strtolower($this->lng->txt(
"and")));
1499 $template->setVariable(
"YEAR", $date[
"year"]);
1500 $template->setVariable(
"MONTH", $date[
"mon"] - 1);
1501 $template->setVariable(
"DAY", $date[
"mday"]);
1502 $template->setVariable(
"HOUR", $date[
"hours"]);
1503 $template->setVariable(
"MINUTE", $date[
"minutes"]);
1504 $template->setVariable(
"SECOND", $date[
"seconds"]);
1505 if ($this->object->isEndingTimeEnabled()) {
1507 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $date_time->get(
IL_CAL_TIMESTAMP), $matches);
1508 $template->setVariable(
"ENDYEAR", $matches[1]);
1509 $template->setVariable(
"ENDMONTH", $matches[2] - 1);
1510 $template->setVariable(
"ENDDAY", $matches[3]);
1511 $template->setVariable(
"ENDHOUR", $matches[4]);
1512 $template->setVariable(
"ENDMINUTE", $matches[5]);
1513 $template->setVariable(
"ENDSECOND", $matches[6]);
1515 $template->setVariable(
"YEARNOW", $datenow[
"year"]);
1516 $template->setVariable(
"MONTHNOW", $datenow[
"mon"] - 1);
1517 $template->setVariable(
"DAYNOW", $datenow[
"mday"]);
1518 $template->setVariable(
"HOURNOW", $datenow[
"hours"]);
1519 $template->setVariable(
"MINUTENOW", $datenow[
"minutes"]);
1520 $template->setVariable(
"SECONDNOW", $datenow[
"seconds"]);
1521 $template->setVariable(
"PTIME_M", $processing_time_minutes);
1522 $template->setVariable(
"PTIME_S", $processing_time_seconds);
1523 if ($this->ctrl->getCmd() ==
'outQuestionSummary') {
1524 $template->setVariable(
"REDIRECT_URL", $this->ctrl->getFormAction($this,
'redirectAfterDashboard'));
1526 $template->setVariable(
"REDIRECT_URL",
"");
1528 $this->tpl->addOnLoadCode($template->get());
1531 protected function showSideList($presentationMode, $currentSequenceElement)
1536 $sideListActive =
$ilUser->getPref(
'side_list_of_questions');
1538 if ($sideListActive) {
1544 $questionSummaryData = $this->service->getQuestionSummaryData($this->testSequence,
false);
1546 require_once
'Modules/Test/classes/class.ilTestQuestionSideListGUI.php';
1548 $questionSideListGUI->setTargetGUI($this);
1549 $questionSideListGUI->setQuestionSummaryData($questionSummaryData);
1550 $questionSideListGUI->setCurrentSequenceElement($currentSequenceElement);
1553 $questionSideListGUI->setDisabled(
false);
1557 $this->tpl->setVariable(
'LIST_OF_QUESTIONS', $questionSideListGUI->getHTML());
1566 public function outQuestionSummaryCmd($fullpage =
true, $contextFinishTest =
false, $obligationsInfo =
false, $obligationsFilter =
false)
1569 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_question_summary.html",
"Modules/Test");
1573 $this->object->getId(),
1574 $this->testSession->getActiveId(),
1575 $this->testSession->getPass()
1578 if ($obligationsInfo && $this->object->areObligationsEnabled() && !$obligationsFulfilled) {
1582 if ($this->object->getKioskMode() && $fullpage) {
1584 if (strlen($head)) {
1585 $this->tpl->setCurrentBlock(
"kiosk_options");
1586 $this->tpl->setVariable(
"KIOSK_HEAD", $head);
1587 $this->tpl->parseCurrentBlock();
1592 $active_id = $this->testSession->getActiveId();
1593 $questionSummaryData = $this->service->getQuestionSummaryData($this->testSequence, $obligationsFilter);
1595 $this->ctrl->setParameter($this,
"sequence",
$_GET[
"sequence"]);
1598 include_once
"./Modules/Test/classes/tables/class.ilListOfQuestionsTableGUI.php";
1601 $table_gui->setShowPointsEnabled(!$this->object->getTitleOutput());
1602 $table_gui->setShowMarkerEnabled($this->object->getShowMarker());
1603 $table_gui->setObligationsNotAnswered(!$obligationsFulfilled);
1604 $table_gui->setShowObligationsEnabled($this->object->areObligationsEnabled());
1605 $table_gui->setObligationsFilterEnabled($obligationsFilter);
1610 $table_gui->setData($questionSummaryData);
1612 $this->tpl->setVariable(
'TABLE_LIST_OF_QUESTIONS', $table_gui->getHTML());
1614 if ($this->object->getEnableProcessingTime()) {
1618 if ($this->object->isShowExamIdInTestPassEnabled()) {
1619 $this->tpl->setCurrentBlock(
'exam_id_footer');
1621 $this->testSession->getActiveId(),
1622 $this->testSession->getPass(),
1623 $this->
object->getId()
1625 $this->tpl->setVariable(
'EXAM_ID_TXT', $this->lng->txt(
'exam_id'));
1626 $this->tpl->parseCurrentBlock();
1643 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_max_allowed_users_reached.html",
"Modules/Test");
1644 $this->tpl->setCurrentBlock(
"adm_content");
1645 $this->tpl->setVariable(
"MAX_ALLOWED_USERS_MESSAGE", sprintf($this->lng->txt(
"tst_max_allowed_users_message"), $this->
object->getAllowedUsersTimeGap()));
1646 $this->tpl->setVariable(
"MAX_ALLOWED_USERS_HEADING", sprintf($this->lng->txt(
"tst_max_allowed_users_heading"), $this->
object->getAllowedUsersTimeGap()));
1648 $this->tpl->setVariable(
"TXT_BACK_TO_INFOSCREEN", $this->lng->txt(
"tst_results_back_introduction"));
1649 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
1650 $this->tpl->parseCurrentBlock();
1665 $this->tpl->addBlockFile(
"ADM_CONTENT",
"adm_content",
"tpl.il_as_tst_correct_solution.html",
"Modules/Test");
1667 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
1668 $this->tpl->setCurrentBlock(
"ContentStyle");
1670 $this->tpl->parseCurrentBlock();
1672 $this->tpl->setCurrentBlock(
"SyntaxStyle");
1674 $this->tpl->parseCurrentBlock();
1677 if ($this->object->getShowSolutionAnswersOnly()) {
1681 $this->tpl->setCurrentBlock(
"adm_content");
1683 $this->tpl->setVariable(
"OUTPUT_SOLUTION", $solution);
1684 $this->tpl->setVariable(
"TEXT_BACK", $this->lng->txt(
"back"));
1685 $this->ctrl->saveParameter($this,
"pass");
1686 $this->ctrl->saveParameter($this,
"active_id");
1687 $this->tpl->setVariable(
"URL_BACK", $this->ctrl->getLinkTarget($this,
"outUserResultsOverview"));
1688 $this->tpl->parseCurrentBlock();
1705 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_finish_list_of_answers.html",
"Modules/Test");
1707 $result_array = &$this->
object->getTestResult(
1716 foreach ($result_array as $question_data) {
1717 $question = $question_data[
"qid"];
1718 if (is_numeric($question)) {
1719 $this->tpl->setCurrentBlock(
"printview_question");
1720 $question_gui = $this->
object->createQuestionGUI(
"", $question);
1721 $template =
new ilTemplate(
"tpl.il_as_qpl_question_printview.html",
true,
true,
"Modules/TestQuestionPool");
1722 $template->setVariable(
"COUNTER_QUESTION", $counter .
". ");
1723 $template->setVariable(
"QUESTION_TITLE", $question_gui->object->getTitle());
1725 $show_question_only = ($this->
object->getShowSolutionAnswersOnly()) ?
true :
false;
1726 $result_output = $question_gui->getSolutionOutput($active_id,
$pass,
false,
false, $show_question_only, $this->object->getShowSolutionFeedback());
1727 $template->setVariable(
"SOLUTION_OUTPUT", $result_output);
1728 $this->tpl->setVariable(
"QUESTION_OUTPUT", $template->get());
1729 $this->tpl->parseCurrentBlock();
1735 if ($this->object->getShowSolutionAnswersOnly()) {
1738 if (strlen($top_data)) {
1739 $this->tpl->setCurrentBlock(
"top_data");
1740 $this->tpl->setVariable(
"TOP_DATA", $top_data);
1741 $this->tpl->parseCurrentBlock();
1744 if (strlen($bottom_data)) {
1745 $this->tpl->setCurrentBlock(
"bottom_data");
1746 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
1747 $this->tpl->setVariable(
"BOTTOM_DATA", $bottom_data);
1748 $this->tpl->parseCurrentBlock();
1751 $this->tpl->setCurrentBlock(
"adm_content");
1752 $this->tpl->setVariable(
"TXT_ANSWER_SHEET", $this->lng->txt(
"tst_list_of_answers"));
1755 $this->tpl->setVariable(
"USER_DETAILS", $user_data);
1756 $this->tpl->setVariable(
"SIGNATURE", $signature);
1757 $this->tpl->setVariable(
"TITLE", $this->object->getTitle());
1758 $this->tpl->setVariable(
"TXT_TEST_PROLOG", $this->lng->txt(
"tst_your_answers"));
1759 $invited_user = &$this->
object->getInvitedUsers(
$ilUser->getId());
1760 $pagetitle = $this->
object->getTitle() .
" - " . $this->lng->txt(
"clientip") .
1761 ": " . $invited_user[
$ilUser->getId()][
"clientip"] .
" - " .
1762 $this->lng->txt(
"matriculation") .
": " .
1763 $invited_user[
$ilUser->getId()][
"matriculation"];
1764 $this->tpl->setVariable(
"PAGETITLE", $pagetitle);
1765 $this->tpl->parseCurrentBlock();
1775 return "ADM_CONTENT";
1777 if ($this->object->getKioskMode()) {
1778 $this->tpl->setBodyClass(
"kiosk");
1779 $this->tpl->hideFooter();
1782 return "ADM_CONTENT";
1788 $this->ctrl->redirectByClass(
1789 array(
'ilRepositoryGUI',
'ilObjTestGUI',
'ilTestEvaluationGUI'),
1790 "outUserResultsOverview" 1803 $this->ctrl->setParameter($this,
'pmode', self::PRESENTATION_MODE_EDIT);
1805 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
1818 $this->ctrl->setParameter($this,
'pmode', self::PRESENTATION_MODE_EDIT);
1820 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
1839 $this->tpl->addBlockFile(
1842 'tpl.il_as_tst_question_summary.html',
1846 if ($this->object->getKioskMode()) {
1853 $this->tpl->addBlockFile(
1856 'tpl.il_as_tst_output.html',
1867 if (strlen($head)) {
1868 $this->tpl->setCurrentBlock(
"kiosk_options");
1869 $this->tpl->setVariable(
"KIOSK_HEAD", $head);
1870 $this->tpl->parseCurrentBlock();
1876 if ($this->ctrl->getNextClass() ==
'iltestpasswordprotectiongui') {
1880 if (!$this->passwordChecker->isPasswordProtectionPageRedirectRequired()) {
1886 $nextCommand = $this->ctrl->getCmdClass() .
'::' . $this->ctrl->getCmd();
1887 $this->ctrl->setParameterByClass(
'ilTestPasswordProtectionGUI',
'nextCommand', $nextCommand);
1888 $this->ctrl->redirectByClass(
'ilTestPasswordProtectionGUI',
'showPasswordForm');
1893 if ($this->object->isInstantFeedbackAnswerFixationEnabled() && $this->testSequence->isQuestionChecked($questionId)) {
1897 if ($this->object->isFollowupQuestionAnswerFixationEnabled() && $this->testSequence->isNextQuestionPresented($questionId)) {
1909 return $this->lng->txt(
"save_introduction");
1914 $this->assSettings =
new ilSetting(
'assessment');
1923 $questionList->load();
1925 $testResults = $this->
object->getTestResult($testSession->
getActiveId(), $testSession->
getPass(),
true);
1927 require_once
'Modules/Test/classes/class.ilTestSkillEvaluation.php';
1928 $skillEvaluation =
new ilTestSkillEvaluation($this->db, $this->object->getTestId(), $this->
object->getRefId());
1931 $skillEvaluation->setActiveId($testSession->
getActiveId());
1932 $skillEvaluation->setPass($testSession->
getPass());
1934 $skillEvaluation->setNumRequiredBookingsForSkillTriggering($this->assSettings->get(
1935 'ass_skl_trig_num_answ_barrier',
1940 $skillEvaluation->init($questionList);
1941 $skillEvaluation->evaluate($testResults);
1943 $skillEvaluation->handleSkillTriggering();
1950 require_once
'Modules/Test/classes/confirmations/class.ilTestAnswerOptionalQuestionsConfirmationGUI.php';
1953 $confirmation->setFormAction($this->ctrl->getFormAction($this));
1954 $confirmation->setCancelCmd(
'cancelAnswerOptionalQuestions');
1955 $confirmation->setConfirmCmd(
'confirmAnswerOptionalQuestions');
1957 $confirmation->build($this->object->isFixedTest());
1964 $this->testSequence->setAnsweringOptionalQuestionsConfirmed(
true);
1965 $this->testSequence->saveToDb();
1967 $this->ctrl->setParameter($this,
'activecommand',
'gotoquestion');
1968 $this->ctrl->redirect($this,
'redirectQuestion');
1973 if ($this->object->getListOfQuestions()) {
1974 $this->ctrl->setParameter($this,
'activecommand',
'summary');
1976 $this->ctrl->setParameter($this,
'activecommand',
'previous');
1979 $this->ctrl->redirect($this,
'redirectQuestion');
1987 if ($this->object->getKioskMode()) {
1989 $this->tpl->hideFooter();
1990 $this->tpl->addBlockfile(
'CONTENT',
'adm_content',
"tpl.il_as_tst_kiosk_mode_content.html",
"Modules/Test");
1991 $this->tpl->setContent($this->ctrl->getHTML($helperGui));
2005 if (
$ilSetting->get(
'char_selector_availability') > 0) {
2006 require_once
'Services/UIComponent/CharSelector/classes/class.ilCharSelectorGUI.php';
2009 $char_selector->addToPage();
2010 $this->tpl->setCurrentBlock(
'char_selector');
2011 $this->tpl->setVariable(
"CHAR_SELECTOR_TEMPLATE", $char_selector->getSelectorHtml());
2012 $this->tpl->parseCurrentBlock();
2026 require_once
'Modules/Test/classes/class.ilTestNavigationToolbarGUI.php';
2029 $navigationToolbarGUI->setSuspendTestButtonEnabled($this->object->getShowCancel());
2030 $navigationToolbarGUI->setQuestionTreeButtonEnabled($this->object->getListOfQuestions());
2031 $navigationToolbarGUI->setQuestionTreeVisible(
$ilUser->getPref(
'side_list_of_questions'));
2032 $navigationToolbarGUI->setQuestionListButtonEnabled($this->object->getListOfQuestions());
2035 return $navigationToolbarGUI;
2040 require_once
'Modules/Test/classes/class.ilTestQuestionNavigationGUI.php';
2047 if ($this->object->getShowMarker()) {
2048 include_once
"./Modules/Test/classes/class.ilObjTest.php";
2052 if (count($solved_array) > 0) {
2053 $solved = array_pop($solved_array);
2054 $solved = $solved[
"solved"];
2059 $navigationGUI->setQuestionMarked(
true);
2062 $navigationGUI->setQuestionMarked(
false);
2067 return $navigationGUI;
2072 require_once
'Modules/Test/classes/class.ilTestQuestionNavigationGUI.php';
2075 if ($this->object->isForceInstantFeedbackEnabled()) {
2090 case $this->
object->getSpecificAnswerFeedback():
2091 case $this->
object->getGenericAnswerFeedback():
2092 case $this->
object->getAnswerFeedbackPoints():
2093 case $this->
object->getInstantFeedbackSolution():
2095 $navigationGUI->setAnswerFreezingEnabled($this->object->isInstantFeedbackAnswerFixationEnabled());
2097 if ($this->object->isForceInstantFeedbackEnabled()) {
2098 $navigationGUI->setForceInstantResponseEnabled(
true);
2106 if ($this->object->isOfferingQuestionHintsEnabled()) {
2107 $activeId = $this->testSession->getActiveId();
2108 $pass = $this->testSession->getPass();
2110 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
2113 if ($questionHintTracking->requestsPossible()) {
2117 if ($questionHintTracking->requestsExist()) {
2122 $navigationGUI->setCharSelectorEnabled($charSelectorAvailable);
2124 if ($this->object->getShowMarker()) {
2125 include_once
"./Modules/Test/classes/class.ilObjTest.php";
2129 if (count($solved_array) > 0) {
2130 $solved = array_pop($solved_array);
2131 $solved = $solved[
"solved"];
2137 $navigationGUI->setQuestionMarked(
true);
2140 $navigationGUI->setQuestionMarked(
false);
2144 return $navigationGUI;
2152 if (!$this->object->getListOfQuestionsEnd()) {
2153 return 'finishTest';
2156 if ($this->object->areObligationsEnabled()) {
2158 $this->testSession->getTestId(),
2159 $this->testSession->getActiveId(),
2160 $this->testSession->getPass()
2163 if (!$allObligationsAnswered) {
2164 return 'outQuestionSummaryWithObligationsInfo';
2168 return 'outQuestionSummary';
2200 $answerFeedbackEnabled = $this->
object->getSpecificAnswerFeedback();
2203 $this->testSession->getActiveId(), #active_id
2204 $this->testSession->getPass(), #pass
2205 false, #graphical_output
2206 false, #result_output
2207 true, #show_question_only
2208 $answerFeedbackEnabled, #show_feedback
2209 false, #show_correct_solution
2210 false, #show_manual_scoring
2211 true #show_question_text
2217 $this->testSession->getActiveId(),
2221 $tpl =
new ilTemplate(
'tpl.tst_player_response_modal.html',
true,
true,
'Modules/Test');
2227 $this->tpl = $saved_tpl;
2229 $tpl->setVariable(
'QUESTION_OUTPUT', $pageoutput);
2232 $button->setId(
'tst_confirm_feedback');
2233 $button->setUrl($navUrl);
2234 $button->setCaption(
'proceed');
2235 $button->setPrimary(
true);
2236 $tpl->setVariable(
'BUTTON', $button->render());
2239 require_once(
'Services/UIComponent/Modal/classes/class.ilModalGUI.php');
2242 $modal->setId(
'tst_question_feedback_modal');
2243 $modal->setHeading($this->lng->txt(
'tst_instant_feedback'));
2244 $modal->setBody(
$tpl->get());
2246 $this->tpl->addOnLoadCode(
"$('#tst_question_feedback_modal').modal('show');");
2247 $this->tpl->setVariable(
'INSTANT_RESPONSE_MODAL', $modal->getHTML());
2258 !$this->object->getSpecificAnswerFeedback() || !$questionGui->
hasInlineFeedback()
2263 if ($this->object->getInstantFeedbackSolution()) {
2268 $this->testSession->getActiveId(), #active_id
2270 false, #graphical_output
2271 $show_question_inline_score, #result_output
2272 true, #show_question_only
2273 false, #show_feedback
2274 true, #show_correct_solution
2275 false, #show_manual_scoring
2276 false #show_question_text
2278 $solutionoutput = str_replace(
'<h1 class="ilc_page_title_PageTitle"></h1>',
'', $solutionoutput);
2282 $reachedPoints = $questionGui->object->getAdjustedReachedPoints(
2283 $this->testSession->getActiveId(),
2288 $maxPoints = $questionGui->object->getMaximumPoints();
2290 $solutionCorrect = ($reachedPoints == $maxPoints);
2294 if ($this->object->getAnswerFeedbackPoints()) {
2300 if ($this->object->getGenericAnswerFeedback()) {
2306 if ($this->object->getSpecificAnswerFeedback()) {
2313 if ($withFocusAnchor) {
2314 $this->tpl->setCurrentBlock(
'inst_resp_id');
2315 $this->tpl->setVariable(
'INSTANT_RESPONSE_FOCUS_ID',
'focus');
2316 $this->tpl->parseCurrentBlock();
2319 $this->tpl->setCurrentBlock(
'instant_response_header');
2320 $this->tpl->setVariable(
'INSTANT_RESPONSE_HEADER', $this->lng->txt(
'tst_feedback'));
2321 $this->tpl->parseCurrentBlock();
2330 return $this->testSession->getLastSequence();
2335 unset(
$_GET[
'sequence']);
2336 $this->ctrl->setParameter($this,
'sequence', null);
2341 if (isset(
$_GET[
'sequence'])) {
2342 return $_GET[
'sequence'];
2350 if (isset(
$_GET[
'pmode'])) {
2351 return $_GET[
'pmode'];
2359 if (isset(
$_GET[
'instresp'])) {
2360 return $_GET[
'instresp'];
2368 if (isset(
$_POST[
'nextcmd']) && strlen(
$_POST[
'nextcmd'])) {
2369 return $_POST[
'nextcmd'];
2377 if (isset(
$_POST[
'nextseq']) && is_numeric(
$_POST[
'nextseq'])) {
2378 return (
int)
$_POST[
'nextseq'];
2387 if (isset(
$_POST[
'test_player_navigation_url'])) {
2388 $navigation_url =
$_POST[
'test_player_navigation_url'];
2390 $navigation_url_parts = parse_url($navigation_url);
2393 if (!isset($navigation_url_parts[
'host']) || ($ilias_url_parts[
'host'] === $navigation_url_parts[
'host'])) {
2394 return $navigation_url;
2410 return !empty(
$_GET[
'test_answer_changed']);
2419 $this->ctrl->setParameter($this,
'test_answer_changed',
$changed ?
'1' :
'0');
2445 if (!empty(
$_POST[
'save_on_navigation_prevent_confirmation'])) {
2446 $_SESSION[
'save_on_navigation_prevent_confirmation'] =
true;
2449 if (!empty(
$_POST[self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM])) {
2450 $_SESSION[self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM] =
true;
2470 if (!$fromCache || !isset($this->cachedQuestionGuis[$question_id])) {
2471 $questionGui = $this->
object->createQuestionGUI(
"", $question_id);
2472 $questionGui->setTargetGui($this);
2474 $questionGui->object->setObligationsToBeConsidered($this->object->areObligationsEnabled());
2475 $questionGui->populateJavascriptFilesRequiredForWorkForm(
$tpl);
2477 $questionGui->object->setShuffler($this->
buildQuestionAnswerShuffler((
string) $question_id, (
string) $this->testSession->getActiveId(), (string) $this->testSession->getPass()));
2483 $this->cachedQuestionGuis[$question_id] = $questionGui;
2486 return $this->cachedQuestionGuis[$question_id];
2501 $ilDB = $DIC[
'ilDB'];
2504 if (!$fromCache || !isset($this->cachedQuestionObjects[$questionId])) {
2508 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
2510 $processLockerFactory->setQuestionId($questionOBJ->getId());
2511 $processLockerFactory->setUserId(
$ilUser->getId());
2512 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
2514 $questionOBJ->setProcessLocker($processLockerFactory->getLocker());
2516 $questionOBJ->setObligationsToBeConsidered($this->object->areObligationsEnabled());
2523 $this->cachedQuestionObjects[$questionId] = $questionOBJ;
2526 return $this->cachedQuestionObjects[$questionId];
2533 $this->object->isPreviousSolutionReuseEnabled($this->testSession->getActiveId())
2549 .
"active={$this->testSession->getActiveId()} " 2550 .
"qId=$questionId seq=$sequenceElement " 2551 . serialize($this->testSequence)
2554 $ilLog->logStack(
'INV SEQ');
2556 $this->ctrl->setParameter($this,
'sequence', $this->testSequence->getFirstSequence());
2565 if ($this->object->getKioskMode()) {
2566 $this->tpl->addBlockfile($this->
getContentBlockName(),
'content',
"tpl.il_as_tst_kiosk_mode_content.html",
"Modules/Test");
2567 $this->tpl->setContent($contentHTML);
2575 require_once
'Services/UIComponent/Button/classes/class.ilSubmitButton.php';
2576 require_once
'Services/UIComponent/Button/classes/class.ilLinkButton.php';
2577 require_once
'Services/UIComponent/Modal/classes/class.ilModalGUI.php';
2584 if ($this->object->isFollowupQuestionAnswerFixationEnabled()) {
2593 $tpl =
new ilTemplate(
'tpl.tst_player_confirmation_modal.html',
true,
true,
'Modules/Test');
2595 $tpl->setVariable(
'CONFIRMATION_TEXT', $this->lng->txt(
'discard_answer_confirmation'));
2599 $button->setCaption(
'discard_answer');
2600 $tpl->setCurrentBlock(
'buttons');
2601 $tpl->setVariable(
'BUTTON', $button->render());
2602 $tpl->parseCurrentBlock();
2605 $button->setId(
'tst_cancel_discard_button');
2606 $button->setCaption(
'cancel');
2607 $button->setPrimary(
true);
2608 $tpl->setCurrentBlock(
'buttons');
2609 $tpl->setVariable(
'BUTTON', $button->render());
2610 $tpl->parseCurrentBlock();
2613 $modal->setId(
'tst_discard_solution_modal');
2614 $modal->setHeading($this->lng->txt(
'discard_answer'));
2615 $modal->setBody(
$tpl->get());
2617 $this->tpl->setCurrentBlock(
'discard_solution_modal');
2618 $this->tpl->setVariable(
'DISCARD_SOLUTION_MODAL', $modal->getHTML());
2619 $this->tpl->parseCurrentBlock();
2688 if (!empty(
$_SESSION[
'save_on_navigation_prevent_confirmation'])) {
2692 $tpl =
new ilTemplate(
'tpl.tst_player_confirmation_modal.html',
true,
true,
'Modules/Test');
2694 if ($this->object->isInstantFeedbackAnswerFixationEnabled() && $this->
object->isForceInstantFeedbackEnabled()) {
2695 $text = $this->lng->txt(
'save_on_navigation_locked_confirmation');
2697 $text = $this->lng->txt(
'save_on_navigation_confirmation');
2699 if ($this->object->isForceInstantFeedbackEnabled()) {
2700 $text .=
" " . $this->lng->txt(
'save_on_navigation_forced_feedback_hint');
2702 $tpl->setVariable(
'CONFIRMATION_TEXT', $text);
2706 $button->setId(
'tst_save_on_navigation_button');
2707 $button->setUrl(
'#');
2708 $button->setCaption(
'tst_save_and_proceed');
2709 $button->setPrimary(
true);
2710 $tpl->setCurrentBlock(
'buttons');
2711 $tpl->setVariable(
'BUTTON', $button->render());
2712 $tpl->parseCurrentBlock();
2715 $button->setId(
'tst_cancel_on_navigation_button');
2716 $button->setUrl(
'#');
2717 $button->setCaption(
'cancel');
2718 $button->setPrimary(
false);
2719 $tpl->setCurrentBlock(
'buttons');
2720 $tpl->setVariable(
'BUTTON', $button->render());
2721 $tpl->parseCurrentBlock();
2723 $tpl->setCurrentBlock(
'checkbox');
2724 $tpl->setVariable(
'CONFIRMATION_CHECKBOX_NAME',
'save_on_navigation_prevent_confirmation');
2725 $tpl->setVariable(
'CONFIRMATION_CHECKBOX_LABEL', $this->lng->txt(
'tst_dont_show_msg_again_in_current_session'));
2726 $tpl->parseCurrentBlock();
2729 $modal->setId(
'tst_save_on_navigation_modal');
2730 $modal->setHeading($this->lng->txt(
'save_on_navigation'));
2731 $modal->setBody(
$tpl->get());
2733 $this->tpl->setCurrentBlock(
'nav_while_edit_modal');
2734 $this->tpl->setVariable(
'NAV_WHILE_EDIT_MODAL', $modal->getHTML());
2735 $this->tpl->parseCurrentBlock();
2741 require_once
'Modules/Test/classes/class.ilTestPlayerConfirmationModal.php';
2743 $modal->setModalId(
'tst_next_locks_unchanged_modal');
2745 $modal->setHeaderText($this->lng->txt(
'tst_nav_next_locks_empty_answer_header'));
2746 $modal->setConfirmationText($this->lng->txt(
'tst_nav_next_locks_empty_answer_confirm'));
2748 $button = $modal->buildModalButtonInstance(
'tst_nav_next_empty_answer_button');
2749 $button->setCaption(
'tst_proceed');
2750 $button->setPrimary(
false);
2751 $modal->addButton($button);
2753 $button = $modal->buildModalButtonInstance(
'tst_cancel_next_empty_answer_button');
2754 $button->setCaption(
'cancel');
2755 $button->setPrimary(
true);
2756 $modal->addButton($button);
2758 $this->tpl->setCurrentBlock(
'next_locks_unchanged_modal');
2759 $this->tpl->setVariable(
'NEXT_LOCKS_UNCHANGED_MODAL', $modal->getHTML());
2760 $this->tpl->parseCurrentBlock();
2769 require_once
'Modules/Test/classes/class.ilTestPlayerConfirmationModal.php';
2771 $modal->setModalId(
'tst_next_locks_changed_modal');
2773 $modal->setHeaderText($this->lng->txt(
'tst_nav_next_locks_current_answer_header'));
2774 $modal->setConfirmationText($this->lng->txt(
'tst_nav_next_locks_current_answer_confirm'));
2776 $modal->setConfirmationCheckboxName(self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM);
2777 $modal->setConfirmationCheckboxLabel($this->lng->txt(
'tst_dont_show_msg_again_in_current_session'));
2779 $button = $modal->buildModalButtonInstance(
'tst_nav_next_changed_answer_button');
2780 $button->setCaption(
'tst_save_and_proceed');
2781 $button->setPrimary(
true);
2782 $modal->addButton($button);
2784 $button = $modal->buildModalButtonInstance(
'tst_cancel_next_changed_answer_button');
2785 $button->setCaption(
'cancel');
2786 $button->setPrimary(
false);
2787 $modal->addButton($button);
2789 $this->tpl->setCurrentBlock(
'next_locks_changed_modal');
2790 $this->tpl->setVariable(
'NEXT_LOCKS_CHANGED_MODAL', $modal->getHTML());
2791 $this->tpl->parseCurrentBlock();
2798 $_SESSION[self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM] =
true;
2803 if (!isset(
$_SESSION[self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM])) {
2807 return $_SESSION[self::FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM];
2816 protected function populateQuestionEditControl($questionGUI)
2822 $state = $questionGUI->object->lookupForExistingSolutions($this->testSession->getActiveId(), $this->testSession->getPass());
2823 $config[
'isAnswered'] = $state[
'authorized'];
2833 if ($questionGUI->isAutosaveable() && $this->
object->getAutosave()) {
2835 $config[
'autosaveInterval'] = $this->
object->getAutosaveIval();
2838 $config[
'autosaveInterval'] = 0;
2843 $questionConfig = $questionGUI->object->getTestPresentationConfig();
2847 $config[
'withFormChangeDetection'] = $questionConfig->isFormChangeDetectionEnabled();
2850 $config[
'withBackgroundChangeDetection'] = $questionConfig->isBackgroundChangeDetectionEnabled();
2854 $config[
'forcedInstantFeedback'] = $this->
object->isForceInstantFeedbackEnabled();
2855 $config[
'nextQuestionLocks'] = $this->
object->isFollowupQuestionAnswerFixationEnabled();
2857 $this->tpl->addJavascript(
'./Modules/Test/js/ilTestPlayerQuestionEditControl.js');
2858 $this->tpl->addOnLoadCode(
'il.TestPlayerQuestionEditControl.init(' . json_encode(
$config) .
')');
2865 return self::PRESENTATION_MODE_EDIT;
2871 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'])) {
2872 $_SESSION[
'forced_feedback_navigation_url'] = array();
2875 $_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()] = $forcedFeedbackNavUrl;
2880 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'])) {
2884 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()])) {
2888 return $_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()];
2898 if (isset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()])) {
2899 unset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()]);
static getContentStylePath($a_style_id, $add_random=true, $add_token=true)
get content style path
checkTestSessionUser(ilTestSession $testSession)
static makeDirParents($a_dir)
Create a new directory and all parent directories.
populateSyntaxStyleBlock()
redirectAfterAutosaveCmd()
Redirect the user after an automatic save when the time limit is reached.
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
submitIntermediateSolutionCmd()
startPlayerCmd()
Start a test for the first time.
populateNextLocksUnchangedModal()
const AFTER_TEST_PASS_FINISHED
getQuestionGuiInstance($question_id, $fromCache=true)
populateDiscardSolutionModal()
removeIntermediateSolution()
remove an auto-saved solution of the current question
performTestPassFinishedTasks($finishedPass)
const CMD_CONFIRM_REQUEST
isQuestionSummaryFinishTestButtonRequired()
outObligationsOnlySummaryCmd()
getSpecificFeedbackOutput($userSolution)
Returns the answer specific feedback for the question.
Class ilTestPassFinishTasks.
showAnswerOptionalQuestionsConfirmation()
static allObligationsAnswered($test_id, $active_id, $pass)
checks wether all questions marked as obligatory were answered within the test pass with given testId...
getAdditionalUsrDataHtmlAndPopulateWindowTitle($testSession, $active_id, $overwrite_anonymity=false)
Returns the user data for a test results output.
const SHOW_REQUESTED_HINTS_LIST
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
setAnswerChangedParameter($changed=true)
Set the 'answer changed' url parameter for generated links.
isFirstQuestionInSequence($sequenceElement)
populateSpecificFeedbackBlock(assQuestionGUI $question_gui)
populateContentStyleBlock()
handleQuestionActionCmd()
const FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM
getAccessCodeFromSession()
markQuestionAndSaveIntermediateCmd()
checkOnlineTestAccess()
check access restrictions like client ip, partipating user etc.
setAnonymousIdCmd()
Sets a session variable with the test access code for an anonymous test user.
determineSolutionPassIndex(assQuestionGUI $questionGui)
const QUESTION_SUMMARY_INC_OBLIGATIONS
const SHOW_FINAL_STATMENT
static getStyleSheetLocation($mode="output", $a_css_name="", $a_css_location="")
get full style sheet file name (path inclusive) of current user
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
getPresentationModeParameter()
autosaveCmd()
Automatically save a user answer while working on the test (called repeatedly by asynchronous posts i...
outUserResultsOverviewCmd()
Abstract basic class which is to be extended by the concrete assessment question type classes...
isLastQuestionInSequence($sequenceElement)
getObjectiveOrientedContainer()
confirmSubmitAnswers()
confirm submit results if confirm then results are submitted and the screen will be redirected to the...
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not ...
saveTagsCmd()
Save tags for tagging gui.
isTestSignRedirectRequired($activeId, $lastFinishedPass)
static get($a_var)
Get a value.
populateHelperGuiContent($helperGui)
const BACK_FROM_FINISHING
const AUTO_SAVE_ON_TIME_LIMIT
getNextCommandParameter()
doesAccessCodeInSessionExists()
populateLowerPreviousButtonBlock($disabled)
toggleSideListCmd()
Toggle side list.
getResultsSignature()
Returns HTML code for a signature field.
cancelAnswerOptionalQuestionsCmd()
isFollowUpQuestionLocksConfirmationPrevented()
setAnonymousId($anonymous_id)
hasInlineFeedback()
this method can be overwritten per question type
const CSS_CLASS_FEEDBACK_CORRECT
const DEFAULT_SKL_TRIG_NUM_ANSWERS_BARRIER
handleUserSettings()
Handles some form parameters on starting and resuming a test.
const BACK_TO_INFO_SCREEN
afterTestPassFinishedCmd()
buildReadOnlyStateQuestionNavigationGUI($questionId)
populateCharSelectorIfRequired()
getContentBlockName()
Returns the name of the current content block (depends on the kiosk mode setting) ...
confirmHintRequestCmd()
Go to hint request confirmation.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false, $include_seconds=false)
Format a date public.
__construct($a_object)
ilTestOutputGUI constructor
Base Exception for all Exceptions relating to Modules/Test.
archiveParticipantSubmission($active, $pass)
maxProcessingTimeReached()
Outputs a message when the maximum processing time is reached.
setFollowUpQuestionLocksConfirmationPrevented()
populateLowerNextButtonBlock($disabled, $primaryNext)
showRequestedHintListCmd()
Go to requested hint list.
prepareTestPage($presentationMode, $sequenceElement, $questionId)
getCorrectSolutionOutput($question_id, $active_id, $pass, ilTestQuestionRelatedObjectivesList $objectivesList=null)
Returns an output of the solution to an answer compared to the correct solution.
populateNavWhenChangedModal()
unregisterForcedFeedbackNavUrl()
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
buildQuestionRelatedObjectivesList(ilLOTestQuestionAdapter $objectivesAdapter, ilTestQuestionSequence $testSequence)
isNrOfTriesReached()
nr of tries exceeded
ensureExistingTestSession(ilTestSession $testSession)
populateQuestionNavigation($sequenceElement, $disabled, $primaryNext)
showListOfAnswers($active_id, $pass=null, $top_data="", $bottom_data="")
Creates an output of the list of answers for a test participant during the test (only the actual pass...
static getInstance(ilTestSession $a_test_session)
initTestQuestionConfig(assQuestion $questionOBJ)
confirmFinishCmd()
The final submission of a test was confirmed.
markQuestionCmd()
Set a question solved.
handleIntermediateSubmit()
Check the 'answer changed' parameter when a question form is intermediately submitted.
isForcedFeedbackNavUrlRegistered()
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
foreach($_POST as $key=> $value) $res
getInstantResponseParameter()
handleSkillTriggering(ilTestSession $testSession)
buildEditableStateQuestionNavigationGUI($questionId, $charSelectorAvailable)
buildTestPassQuestionList()
$maxProcessingTimeReached
outQuestionSummaryCmd($fullpage=true, $contextFinishTest=false, $obligationsInfo=false, $obligationsFilter=false)
Output of a summary of all test questions for test participants.
showSideList($presentationMode, $currentSequenceElement)
populateGenericFeedbackBlock(assQuestionGUI $question_gui, $solutionCorrect)
getRegisteredForcedFeedbackNavUrl()
populatePreviousButtons($disabled)
outQuestionSummaryWithObligationsInfoCmd()
outCorrectSolution()
Creates an output of the solution of an answer compared to the correct solution.
const CONFIRM_HINT_REQUEST
getIntroductionPageButtonLabel()
const PRESENTATION_MODE_EDIT
resumePlayerCmd()
Resume a test at the last position.
saveNavigationPreventConfirmation()
Save the save the switch to prevent the navigation confirmation.
endingTimeReached()
handle endingTimeReached
const ACCESS_CODE_CONFIRMED
static _getSolvedQuestions($active_id, $question_fi=null)
get solved questions
const REDIRECT_ON_TIME_LIMIT
Output class for assessment test evaluation.
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbarGUI)
redirection script todo: (a better solution should control the processing via a xml file) ...
const SHOW_INSTANT_RESPONSE
static _getCurrentGUI(ilObjTest $a_test_obj=null)
Get the GUI that is used for the currently available selector (other GUI instances may exist for conf...
static getSyntaxStylePath()
get syntax style path
const CSS_CLASS_FEEDBACK_WRONG
getAnswerChangedParameter()
Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationContr...
getSequenceElementParameter()
Basic GUI class for assessment questions.
populateNextLocksChangedModal()
detectChangesCmd()
Detect changes sent in the background to the server This is called by ajax from ilTestPlayerQuestionE...
const PRESENTATION_MODE_VIEW
const PRESENTATION_CONTEXT_TEST
initProcessLocker($activeId)
static _instantiateQuestion($question_id)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
isShowingPostponeStatusReguired($questionId)
unmarkQuestionCmd()
Set a question unsolved.
handlePasswordProtectionRedirect()
redirectAfterDashboardCmd()
Multiple choice question GUI representation.
const UNMARK_QUESTION_SAVE
registerForcedFeedbackNavUrl($forcedFeedbackNavUrl)
const QUESTION_SUMMARY_OBLIGATIONS_ONLY
static getInstance()
Get instance.
populateUpperNextButtonBlock($disabled, $primaryNext)
isOptionalQuestionAnsweringConfirmationRequired($sequenceElement)
const CMD_SHOW_LIST
command constants
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
isTestAccessible()
test accessible returns true if the user can perform the test
populateNextButtons($disabled, $primaryNext)
populateMessageContent($contentHTML)
populateUpperPreviousButtonBlock($disabled)
const DISPLAY_ACCESS_CODE
performFinishTasks(ilTestProcessLocker $processLocker)
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="", $inlineFeedbackEnabled=false)
output question page
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
showMaximumAllowedUsersReachedMessage()
resetSequenceElementParameter()
getSolutionOutput( $active_id, $pass=null, $graphicalOutput=false, $result_output=false, $show_question_only=true, $show_feedback=false, $show_correct_solution=false, $show_manual_scoring=false, $show_question_text=true)
__construct(Container $dic, ilPlugin $plugin)
populateInstantResponseModal(assQuestionGUI $questionGui, $navUrl)
outProcessingTime($active_id)
getNextSequenceParameter()
determineInlineScoreDisplay()
getTestPresentationConfig()
Get the test question configuration (initialised once)
outQuestionForTest( $formaction, $active_id, $pass, $is_question_postponed=false, $user_post_solutions=false, $show_specific_inline_feedback=false)
getNavigationUrlParameter()
getQuestionHeaderBlockBuilder()
static buildExamId($active_id, $pass, $test_obj_id=null)
getQuestionInstance($questionId, $fromCache=true)
getQuestionsDefaultPresentationMode($isQuestionWorkedThrough)
unmarkQuestionAndSaveIntermediateCmd()
Service GUI class for tests.
static generatePDF($pdf_output, $output_mode, $filename=null, $purpose=null)
initTestCmd()
Start a test for the first time after a redirect.
buildPreviousButtonInstance($disabled)
getGenericFeedbackOutput($active_id, $pass)
Returns the answer specific feedback for the question.
finishTestCmd($requires_confirmation=true)
handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement)
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
getCurrentSequenceElement()
buildNextButtonInstance($disabled, $primaryNext)
static _getUsePreviousAnswers($active_id, $user_active_user_setting=false)
Returns if the previous results should be hidden for a learner.
static redirect($a_script)
confirmAnswerOptionalQuestionsCmd()
static getWebspaceDir($mode="filesystem")
get webspace directory
populateFeedbackBlockHeader($withFocusAnchor)
getTestNavigationToolbarGUI()
buildQuestionAnswerShuffler(string $question_id, string $active_id, string $active_pass)
populateSolutionBlock($solutionoutput)
populateScoreBlock($reachedPoints, $maxPoints)
isParticipantsAnswerFixed($questionId)
Output class for assessment test execution.
Confirmation screen class.
autosaveOnTimeLimitCmd()
Automatically save a user answer when the limited duration of a test run is reached (called by synchr...
static lookupExamId($active_id, $pass)
setNavigationGUI($navigationGUI)