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';
71 parent::__construct($a_object);
72 $this->ref_id =
$_GET[
"ref_id"];
75 require_once
'Modules/Test/classes/class.ilTestPasswordChecker.php';
78 $this->processLocker = null;
79 $this->testSession = null;
80 $this->assSettings = null;
87 if (!$rbacsystem->checkAccess(
"read", $this->object->getRefId())) {
89 $this->
ilias->raiseError($this->lng->txt(
"cannot_execute_test"), $this->
ilias->error_obj->MESSAGE);
95 $executable = $this->
object->isExecutable($this->testSession, $this->testSession->getUserId());
97 if (!$executable[
'executable']) {
99 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
107 if ($testSession->
getUserId() != $DIC->user()->getId()) {
108 throw new ilTestException(
'active id given does not relate to current user!');
120 $testSession->
setUserId($ilUser->getId());
137 require_once
'Modules/Test/classes/class.ilTestProcessLockerFactory.php';
140 $processLockerFactory->setActiveId($activeId);
142 $this->processLocker = $processLockerFactory->getLocker();
153 include_once(
"./Services/Tagging/classes/class.ilTaggingGUI.php");
155 $tagging_gui->setObject($this->
object->getId(), $this->
object->getType());
156 $tagging_gui->saveInput();
157 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
166 $this->
object->updateWorkingTime(
$_SESSION[
"active_time_id"]);
169 $_SESSION[
"active_time_id"] = $this->
object->startWorkingTime(
170 $this->testSession->getActiveId(),
171 $this->testSession->getPass()
185 $this->testSession->getActiveId(),
186 $this->testSession->getPass()
200 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
213 $active_id = $this->testSession->getActiveId();
214 $starting_time = $this->
object->getStartingTimeOfUser($active_id);
215 if ($starting_time ===
false) {
218 return $this->
object->isMaxProcessingTimeReached($starting_time, $active_id);
224 $show_question_inline_score =
false;
225 if ($this->
object->getAnswerFeedbackPoints()) {
226 $show_question_inline_score =
true;
227 return $show_question_inline_score;
229 return $show_question_inline_score;
234 $this->tpl->setCurrentBlock(
'test_nav_toolbar');
235 $this->tpl->setVariable(
'TEST_NAV_TOOLBAR', $toolbarGUI->getHTML());
236 $this->tpl->parseCurrentBlock();
265 $button->setId(
'bottomnextbutton');
267 $this->tpl->setCurrentBlock(
"next_bottom");
268 $this->tpl->setVariable(
"BTN_NEXT", $button->render());
269 $this->tpl->parseCurrentBlock();
275 $button->setId(
'nextbutton');
277 $this->tpl->setCurrentBlock(
"next");
278 $this->tpl->setVariable(
"BTN_NEXT", $button->render());
279 $this->tpl->parseCurrentBlock();
285 $button->setId(
'bottomprevbutton');
287 $this->tpl->setCurrentBlock(
"prev_bottom");
288 $this->tpl->setVariable(
"BTN_PREV", $button->render());
289 $this->tpl->parseCurrentBlock();
295 $button->setId(
'prevbutton');
297 $this->tpl->setCurrentBlock(
"prev");
298 $this->tpl->setVariable(
"BTN_PREV", $button->render());
299 $this->tpl->parseCurrentBlock();
311 $button->setPrimary($primaryNext);
312 $button->setRightGlyph(
'glyphicon glyphicon-arrow-right');
316 $button->setCaption(
'next_question');
317 $button->addCSSClass(
'ilTstNavElem');
330 $button->setLeftGlyph(
'glyphicon glyphicon-arrow-left');
334 $button->setCaption(
'previous_question');
335 $button->addCSSClass(
'ilTstNavElem');
342 $this->tpl->setCurrentBlock(
"specific_feedback");
343 $this->tpl->setVariable(
345 $question_gui->getSpecificFeedbackOutput(
346 $this->testSession->getActiveId(),
350 $this->tpl->parseCurrentBlock();
357 if (strlen($feedback)) {
363 $this->tpl->setCurrentBlock(
"answer_feedback");
364 $this->tpl->setVariable(
"ANSWER_FEEDBACK", $feedback);
365 $this->tpl->setVariable(
"ILC_FB_CSS_CLASS", $cssClass);
366 $this->tpl->parseCurrentBlock();
372 $scoreInformation = sprintf(
373 $this->lng->txt(
"you_received_a_of_b_points"),
378 $this->tpl->setCurrentBlock(
"received_points_information");
379 $this->tpl->setVariable(
"RECEIVED_POINTS_INFORMATION", $scoreInformation);
380 $this->tpl->parseCurrentBlock();
385 if (strlen($solutionoutput)) {
386 $this->tpl->setCurrentBlock(
"solution_output");
387 $this->tpl->setVariable(
"CORRECT_SOLUTION", $this->lng->txt(
"tst_best_solution_is"));
388 $this->tpl->setVariable(
"QUESTION_FEEDBACK", $solutionoutput);
389 $this->tpl->parseCurrentBlock();
395 $this->tpl->setCurrentBlock(
"SyntaxStyle");
396 $this->tpl->setVariable(
397 "LOCATION_SYNTAX_STYLESHEET",
400 $this->tpl->parseCurrentBlock();
405 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
406 $this->tpl->setCurrentBlock(
"ContentStyle");
407 $this->tpl->setVariable(
408 "LOCATION_CONTENT_STYLESHEET",
411 $this->tpl->parseCurrentBlock();
421 if ($this->testSession->isAnonymousUser()) {
422 $this->testSession->setAccessCodeToSession(
$_POST[
'anonymous_id']);
425 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
437 $isFirstTestStartRequest =
false;
439 $this->processLocker->executeTestStartLockOperation(
function () use ($testStartLock, &$isFirstTestStartRequest) {
440 if ($this->testSession->lookupTestStartLock() != $testStartLock) {
441 $this->testSession->persistTestStartLock($testStartLock);
442 $isFirstTestStartRequest =
true;
446 if ($isFirstTestStartRequest) {
451 $this->ctrl->setParameterByClass(
'ilObjTestGUI',
'lock', $testStartLock);
452 $this->ctrl->redirectByClass(
"ilobjtestgui",
"redirectToInfoScreen");
459 } elseif (isset(
$_GET[
'lock']) && strlen(
$_GET[
'lock'])) {
460 return $_GET[
'lock'];
476 if ($this->
object->checkMaximumAllowedUsers() ==
false) {
480 if ($this->testSession->isAnonymousUser() && !$this->testSession->getActiveId()) {
481 $accessCode = $this->testSession->createNewAccessCode();
483 $this->testSession->setAccessCodeToSession($accessCode);
484 $this->testSession->setAnonymousId($accessCode);
485 $this->testSession->saveToDb();
490 $this->testSession->unsetAccessCodeInSession();
496 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_anonymous_code_presentation.html",
"Modules/Test");
497 $this->tpl->setCurrentBlock(
"adm_content");
498 $this->tpl->setVariable(
"TEXT_ANONYMOUS_CODE_CREATED", $this->lng->txt(
"tst_access_code_created"));
499 $this->tpl->setVariable(
"TEXT_ANONYMOUS_CODE", $this->testSession->getAccessCodeFromSession());
500 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
502 $this->tpl->setVariable(
"TXT_CONFIRM", $this->lng->txt(
"continue_work"));
503 $this->tpl->parseCurrentBlock();
518 if (
$_POST[
"chb_javascript"]) {
519 $ilUser->writePref(
"tst_javascript", 1);
521 $ilUser->writePref(
"tst_javascript", 0);
525 if ($this->
object->getNrOfTries() != 1) {
526 if ($this->
object->getUsePreviousAnswers() == 1) {
527 if (
$_POST[
"chb_use_previous_answers"]) {
528 $ilUser->writePref(
"tst_use_previous_answers", 1);
530 $ilUser->writePref(
"tst_use_previous_answers", 0);
538 $active_id = $this->testSession->getActiveId();
543 $this->testSession->setLastFinishedPass($this->testSession->getPass());
544 $this->testSession->increaseTestPass();
548 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_redirect_autosave.html",
"Modules/Test");
549 $this->tpl->setVariable(
"TEXT_REDIRECT", $this->lng->txt(
"redirectAfterSave"));
550 $this->tpl->setCurrentBlock(
"HeadContent");
551 $this->tpl->setVariable(
"CONTENT_BLOCK",
"<meta http-equiv=\"refresh\" content=\"5; url=" .
$url .
"\">");
552 $this->tpl->parseCurrentBlock();
560 $authorizedSolution = !$canSaveResult;
575 $res = is_int($db_res);
579 $result = $this->lng->txt(
"autosave_success");
581 $result = $this->lng->txt(
"autosave_failed");
586 if (!$canSaveResult && !$this->ctrl->isAsynch()) {
607 $this->testSession->getActiveId(),
608 $this->testSession->getPass()
635 $show_side_list = $ilUser->getPref(
'side_list_of_questions');
636 $ilUser->writePref(
'side_list_of_questions', !$show_side_list);
653 $questionId = $this->testSequence->getQuestionForSequence(
657 $this->
object->setQuestionSetSolved(1, $questionId, $this->testSession->getUserId());
675 $questionId = $this->testSequence->getQuestionForSequence(
679 $this->
object->setQuestionSetSolved(0, $questionId, $this->testSession->getUserId());
695 protected function confirmFinishTestCmd()
702 require_once
'Services/Utilities/classes/class.ilConfirmationGUI.php';
704 $confirmation->setFormAction($this->ctrl->getFormAction($this,
'confirmFinish'));
705 $confirmation->setHeaderText($this->lng->txt(
"tst_finish_confirmation_question"));
706 $confirmation->setConfirm($this->lng->txt(
"tst_finish_confirm_button"),
'confirmFinish');
718 $active_id = $this->testSession->getActiveId();
736 if ($this->
object->areObligationsEnabled() && !$allObligationsAnswered) {
737 if ($this->
object->getListOfQuestions()) {
747 if ($this->
object->getEnableExamview() && !isset(
$_GET[
'reviewed']) && $requires_confirmation) {
748 $this->ctrl->redirectByClass(
'ilTestSubmissionReviewGUI',
"show");
753 if (($requires_confirmation) && ($actualpass == $this->
object->getNrOfTries() - 1)) {
755 return $this->confirmFinishTestCmd();
759 if (($actualpass == $this->
object->getNrOfTries() - 1) && (!$requires_confirmation)) {
761 #$ilAuth->setIdle(ilSession::getIdleValue(), false); 762 #$ilAuth->setExpire(0); 763 switch ($this->
object->getMailNotification()) {
765 $this->
object->sendSimpleNotification($active_id);
768 $this->
object->sendAdvancedNotification($active_id);
778 if ($this->
object->getMailNotificationType() == 1) {
779 switch ($this->
object->getMailNotification()) {
781 $this->
object->sendSimpleNotification($active_id);
784 $this->
object->sendAdvancedNotification($active_id);
799 require_once
'Modules/Test/classes/class.ilTestPassFinishTasks.php';
807 $activeId = $this->testSession->getActiveId();
808 $lastFinishedPass = $this->testSession->getLastFinishedPass();
812 $this->ctrl->redirectByClass(
'ilTestSignatureGUI',
'invokeSignaturePlugin');
816 if (!
$_GET[
'skipfinalstatement']) {
817 if ($this->
object->getShowFinalStatement()) {
823 $redirection_mode = $this->
object->getRedirectionMode();
824 $redirection_url = $this->
object->getRedirectionUrl();
825 if ($redirection_url && $redirection_mode && !$this->
object->canViewResults()) {
827 if ($this->
object->getKioskMode()) {
841 if (!$this->
object->getSignSubmission()) {
845 if (!is_null(
ilSession::get(
"signed_{$activeId}_{$lastFinishedPass}"))) {
849 global $ilPluginAdmin;
851 $activePlugins = $ilPluginAdmin->getActivePluginsForSlot(
IL_COMP_MODULE,
'Test',
'tsig');
853 if (!count($activePlugins)) {
867 global $ilObjDataCache;
869 require_once
'Modules/Test/classes/class.ilTestResultHeaderLabelBuilder.php';
872 $objectivesList = null;
875 $testSequence = $this->testSequenceFactory->getSequenceByActiveIdAndPass($this->testSession->getActiveId(), $this->testSession->getPass());
879 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
883 $objectivesList->loadObjectivesTitles();
885 $testResultHeaderLabelBuilder->setObjectiveOrientedContainerId($this->testSession->getObjectiveOrientedContainerId());
886 $testResultHeaderLabelBuilder->setUserId($this->testSession->getUserId());
887 $testResultHeaderLabelBuilder->setTestObjId($this->
object->getId());
888 $testResultHeaderLabelBuilder->setTestRefId($this->
object->getRefId());
889 $testResultHeaderLabelBuilder->initObjectiveOrientedMode();
892 $results = $this->
object->getTestResult(
899 require_once
'class.ilTestEvaluationGUI.php';
901 $results_output = $testevaluationgui->getPassListOfAnswers(
911 $testResultHeaderLabelBuilder
914 require_once
'./Modules/Test/classes/class.ilTestArchiver.php';
916 $inst_id = $ilSetting->get(
'inst_id', null);
920 if (!is_dir($path)) {
923 $filename = realpath($path) .
'/exam_N' . $inst_id .
'-' . $this->
object->getId()
924 .
'-' . $active .
'-' .
$pass .
'.pdf';
926 require_once
'Modules/Test/classes/class.ilTestPDFGenerator.php';
930 $archiver->handInParticipantSubmission($active,
$pass,
$filename, $results_output);
935 $questions = $this->
object->getQuestions();
936 foreach ($questions as $question_id) {
937 $question_object = $this->
object->getQuestionDataset($question_id);
938 if ($question_object->type_tag ==
'assFileUpload') {
957 $handle = opendir($candidate_path);
958 while ($handle !==
false && (
$file = readdir($handle)) !==
false) {
960 $filename_start =
'file_' . $active .
'_' .
$pass .
'_';
962 if (strpos(
$file, $filename_start) === 0) {
963 $archiver->handInParticipantQuestionMaterial($active,
$pass, $question_id,
$file,
$file);
969 $passdata = $this->
object->getTestResult(
975 $overview = $testevaluationgui->getPassListOfAnswers(
985 $testResultHeaderLabelBuilder
997 require_once
'Modules/Test/classes/class.ilTestPassesSelector.php';
999 $testPassesSelector->setActiveId($this->testSession->getActiveId());
1000 $testPassesSelector->setLastFinishedPass($this->testSession->getLastFinishedPass());
1002 if (count($testPassesSelector->getReportablePasses())) {
1003 $this->ctrl->redirectByClass(
"ilTestEvaluationGUI",
"outUserResultsOverview");
1011 $this->ctrl->redirectByClass(
'ilObjTestGUI',
'redirectToInfoScreen');
1019 $template =
new ilTemplate(
"tpl.il_as_tst_final_statement.html",
true,
true,
"Modules/Test");
1020 $this->ctrl->setParameter($this,
"skipfinalstatement", 1);
1022 $template->setVariable(
"FINALSTATEMENT", $this->
object->prepareTextareaOutput($this->object->getFinalStatement(),
true));
1023 $template->setVariable(
"BUTTON_CONTINUE", $this->lng->txt(
"btn_next"));
1032 if ($this->
object->getShowKioskModeTitle()) {
1033 $template->setCurrentBlock(
"kiosk_show_title");
1037 if ($this->
object->getShowKioskModeParticipant()) {
1038 $template->setCurrentBlock(
"kiosk_show_participant");
1039 $template->setVariable(
"PARTICIPANT_NAME_TXT", $this->lng->txt(
"login_as"));
1040 $template->setVariable(
"PARTICIPANT_NAME", $ilUser->getFullname());
1041 $template->setVariable(
"PARTICIPANT_LOGIN", $ilUser->getLogin());
1042 $template->setVariable(
"PARTICIPANT_MATRICULATION", $ilUser->getMatriculation());
1043 $template->setVariable(
"PARTICIPANT_EMAIL", $ilUser->getEmail());
1046 if ($this->
object->isShowExamIdInTestPassEnabled()) {
1048 $this->testSession->getActiveId(),
1049 $this->testSession->getPass(),
1050 $this->
object->getId()
1053 $template->setCurrentBlock(
"kiosk_show_exam_id");
1054 $template->setVariable(
"EXAM_ID_TXT", $this->lng->txt(
"exam_id"));
1055 $template->setVariable(
"EXAM_ID", $exam_id);
1066 global
$ilUser, $ilNavigationHistory;
1068 $ilNavigationHistory->addItem(
1069 $this->testSession->getRefId(),
1083 if ($this->
object->endingTimeReached()) {
1089 $this->ctrl->setParameter($this,
"sequence", $sequenceElement);
1094 if ($this->
object->getKioskMode()) {
1098 $this->tpl->setVariable(
"TEST_ID", $this->
object->getTestId());
1099 $this->tpl->setVariable(
"LOGIN", $ilUser->getLogin());
1100 $this->tpl->setVariable(
"SEQ_ID", $sequenceElement);
1101 $this->tpl->setVariable(
"QUEST_ID", $questionId);
1103 if ($this->
object->getEnableProcessingTime()) {
1107 $this->tpl->setVariable(
"PAGETITLE",
"- " . $this->
object->getTitle());
1109 if ($this->
object->isShowExamIdInTestPassEnabled() && !$this->
object->getKioskMode()) {
1110 $this->tpl->setCurrentBlock(
'exam_id_footer');
1112 $this->testSession->getActiveId(),
1113 $this->testSession->getPass(),
1114 $this->
object->getId()
1116 $this->tpl->setVariable(
'EXAM_ID_TXT', $this->lng->txt(
'exam_id'));
1117 $this->tpl->parseCurrentBlock();
1120 if ($this->
object->getListOfQuestions()) {
1121 $this->
showSideList($presentationMode, $sequenceElement);
1132 $questionNavigationGUI->setQuestionWorkedThrough($isQuestionWorkedThrough);
1139 $answerFeedbackEnabled = (
1140 $instantResponse && $this->
object->getSpecificAnswerFeedback()
1144 $this->testSession->getActiveId(), #active_id
1145 $this->testSession->getPass(), #pass
1146 false, #graphical_output
1147 false, #result_output
1148 true, #show_question_only
1149 $answerFeedbackEnabled, #show_feedback
1150 false, #show_correct_solution
1151 false, #show_manual_scoring
1152 true #show_question_text
1158 $this->testSession->getActiveId(),
1162 $this->tpl->setCurrentBlock(
'readonly_css_class');
1163 $this->tpl->touchBlock(
'readonly_css_class');
1164 $this->tpl->parseCurrentBlock();
1166 $this->tpl->setVariable(
'QUESTION_OUTPUT', $pageoutput);
1168 $this->tpl->setVariable(
"FORMACTION", $formAction);
1169 $this->tpl->setVariable(
"ENCTYPE",
'enctype="' . $questionGui->
getFormEncodingType() .
'"');
1170 $this->tpl->setVariable(
"FORM_TIMESTAMP",
time());
1176 $questionGui->object->getId(),
1179 if ($isQuestionWorkedThrough) {
1180 $questionNavigationGUI->setDiscardSolutionButtonEnabled(
true);
1184 } elseif ($this->
object->isPostponingEnabled()) {
1185 $questionNavigationGUI->setSkipQuestionLinkTarget(
1193 $answerFeedbackEnabled = (
1194 $instantResponse && $this->
object->getSpecificAnswerFeedback()
1197 if (isset(
$_GET[
'save_error']) &&
$_GET[
'save_error'] == 1 && isset(
$_SESSION[
'previouspost'])) {
1198 $userPostSolution =
$_SESSION[
'previouspost'];
1201 $userPostSolution =
false;
1209 $qstConfig = $questionGui->object->getTestPresentationConfig();
1212 $qstConfig->setWorkedThrough($isQuestionWorkedThrough);
1213 $qstConfig->setIsUnchangedAnswerPossible($this->
object->getMCScoring());
1216 if ($qstConfig->isPreviousPassSolutionReuseAllowed()) {
1218 if ($passIndex < $this->testSession->getPass()) {
1219 $qstConfig->setSolutionInitiallyPrefilled(
true);
1222 $passIndex = $this->testSession->getPass();
1229 $formAction, #form_action
1230 $this->testSession->getActiveId(), #active_id
1234 $isPostponed, #is_postponed
1235 $userPostSolution, #user_post_solution
1236 $answerFeedbackEnabled #answer_feedback == inline_specific_feedback
1247 $this->populateQuestionEditControl($questionGui);
1254 require_once
'./Modules/Test/classes/class.ilObjTest.php';
1257 $currentSolutionAvailable = $questionGui->object->authorizedOrIntermediateSolutionExists(
1258 $this->testSession->getActiveId(),
1259 $this->testSession->getPass()
1262 if (!$currentSolutionAvailable) {
1263 $previousPass = $questionGui->object->getSolutionMaxPass(
1264 $this->testSession->getActiveId()
1267 $previousSolutionAvailable = $questionGui->object->authorizedSolutionExists(
1268 $this->testSession->getActiveId(),
1272 if ($previousSolutionAvailable) {
1273 return $previousPass;
1278 return $this->testSession->getPass();
1293 $this->ctrl->saveParameter($this,
'sequence');
1315 $user = $this->
object->getInvitedUsers($ilUser->getId());
1316 if (!is_array($user) || count($user)!=1) {
1318 $this->ctrl->redirectByClass(
"ilobjtestgui",
"backToRepository");
1321 $user = array_pop($user);
1323 if (strcmp($user[
"clientip"],
"")!=0 && strcmp($user[
"clientip"],
$_SERVER[
"REMOTE_ADDR"])!=0) {
1325 $this->ctrl->redirectByClass(
"ilobjtestgui",
"backToRepository");
1337 and $this->
object->startingTimeReached()
1338 and !$this->
object->endingTimeReached();
1346 return $this->
object->hasNrOfTriesRestriction() && $this->
object->isNrOfTriesReached($this->testSession->getPass());
1357 $this->testSession->increasePass();
1358 $this->testSession->setLastSequence(0);
1359 $this->testSession->saveToDb();
1383 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_submit_answers_confirm.html",
"Modules/Test");
1384 $this->tpl->setCurrentBlock(
"adm_content");
1385 if ($this->
object->isTestFinished($this->testSession->getActiveId())) {
1386 $this->tpl->setCurrentBlock(
"not_submit_allowed");
1387 $this->tpl->setVariable(
"TEXT_ALREADY_SUBMITTED", $this->lng->txt(
"tst_already_submitted"));
1388 $this->tpl->setVariable(
"BTN_OK", $this->lng->txt(
"tst_show_answer_sheet"));
1390 $this->tpl->setCurrentBlock(
"submit_allowed");
1391 $this->tpl->setVariable(
"TEXT_CONFIRM_SUBMIT_RESULTS", $this->lng->txt(
"tst_confirm_submit_answers"));
1392 $this->tpl->setVariable(
"BTN_OK", $this->lng->txt(
"tst_submit_results"));
1394 $this->tpl->setVariable(
"BTN_BACK", $this->lng->txt(
"back"));
1395 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this,
"finalSubmission"));
1396 $this->tpl->parseCurrentBlock();
1403 $starting_time = $this->
object->getStartingTimeOfUser($active_id);
1404 $processing_time = $this->
object->getProcessingTimeInSeconds($active_id);
1405 $processing_time_minutes = floor($processing_time / 60);
1406 $processing_time_seconds = $processing_time - $processing_time_minutes * 60;
1407 $str_processing_time =
"";
1408 if ($processing_time_minutes > 0) {
1409 $str_processing_time = $processing_time_minutes .
" " . ($processing_time_minutes == 1 ? $this->lng->txt(
"minute") : $this->lng->txt(
"minutes"));
1411 if ($processing_time_seconds > 0) {
1412 if (strlen($str_processing_time) > 0) {
1413 $str_processing_time .=
" " . $this->lng->txt(
"and") .
" ";
1415 $str_processing_time .= $processing_time_seconds .
" " . ($processing_time_seconds == 1 ? $this->lng->txt(
"second") : $this->lng->txt(
"seconds"));
1417 $time_left = $starting_time + $processing_time -
time();
1418 $time_left_minutes = floor($time_left / 60);
1419 $time_left_seconds = $time_left - $time_left_minutes * 60;
1420 $str_time_left =
"";
1421 if ($time_left_minutes > 0) {
1422 $str_time_left = $time_left_minutes .
" " . ($time_left_minutes == 1 ? $this->lng->txt(
"minute") : $this->lng->txt(
"minutes"));
1424 if ($time_left < 300) {
1425 if ($time_left_seconds > 0) {
1426 if (strlen($str_time_left) > 0) {
1427 $str_time_left .=
" " . $this->lng->txt(
"and") .
" ";
1429 $str_time_left .= $time_left_seconds .
" " . ($time_left_seconds == 1 ? $this->lng->txt(
"second") : $this->lng->txt(
"seconds"));
1432 $date = getdate($starting_time);
1434 $datenow = getdate();
1435 $this->tpl->setCurrentBlock(
"enableprocessingtime");
1436 $this->tpl->setVariable(
1437 "USER_WORKING_TIME",
1439 $this->lng->txt(
"tst_time_already_spent"),
1440 $formattedStartingTime,
1441 $str_processing_time
1444 $this->tpl->setVariable(
"USER_REMAINING_TIME", sprintf($this->lng->txt(
"tst_time_already_spent_left"), $str_time_left));
1445 $this->tpl->parseCurrentBlock();
1447 $template->setVariable(
"STRING_MINUTE", $this->lng->txt(
"minute"));
1448 $template->setVariable(
"STRING_MINUTES", $this->lng->txt(
"minutes"));
1449 $template->setVariable(
"STRING_SECOND", $this->lng->txt(
"second"));
1450 $template->setVariable(
"STRING_SECONDS", $this->lng->txt(
"seconds"));
1451 $template->setVariable(
"STRING_TIMELEFT", $this->lng->txt(
"tst_time_already_spent_left"));
1452 $template->setVariable(
"AND", strtolower($this->lng->txt(
"and")));
1453 $template->setVariable(
"YEAR", $date[
"year"]);
1454 $template->setVariable(
"MONTH", $date[
"mon"]-1);
1455 $template->setVariable(
"DAY", $date[
"mday"]);
1456 $template->setVariable(
"HOUR", $date[
"hours"]);
1457 $template->setVariable(
"MINUTE", $date[
"minutes"]);
1458 $template->setVariable(
"SECOND", $date[
"seconds"]);
1459 if ($this->
object->isEndingTimeEnabled()) {
1461 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $date_time->get(
IL_CAL_TIMESTAMP), $matches);
1462 $template->setVariable(
"ENDYEAR", $matches[1]);
1463 $template->setVariable(
"ENDMONTH", $matches[2]-1);
1464 $template->setVariable(
"ENDDAY", $matches[3]);
1465 $template->setVariable(
"ENDHOUR", $matches[4]);
1466 $template->setVariable(
"ENDMINUTE", $matches[5]);
1467 $template->setVariable(
"ENDSECOND", $matches[6]);
1469 $template->setVariable(
"YEARNOW", $datenow[
"year"]);
1470 $template->setVariable(
"MONTHNOW", $datenow[
"mon"]-1);
1471 $template->setVariable(
"DAYNOW", $datenow[
"mday"]);
1472 $template->setVariable(
"HOURNOW", $datenow[
"hours"]);
1473 $template->setVariable(
"MINUTENOW", $datenow[
"minutes"]);
1474 $template->setVariable(
"SECONDNOW", $datenow[
"seconds"]);
1475 $template->setVariable(
"PTIME_M", $processing_time_minutes);
1476 $template->setVariable(
"PTIME_S", $processing_time_seconds);
1478 $this->tpl->setCurrentBlock(
"HeadContent");
1479 $this->tpl->setVariable(
"CONTENT_BLOCK",
$template->get());
1480 $this->tpl->parseCurrentBlock();
1483 protected function showSideList($presentationMode, $currentSequenceElement)
1487 $sideListActive = $ilUser->getPref(
'side_list_of_questions');
1489 if ($sideListActive) {
1495 $questionSummaryData = $this->service->getQuestionSummaryData($this->testSequence,
false);
1497 require_once
'Modules/Test/classes/class.ilTestQuestionSideListGUI.php';
1499 $questionSideListGUI->setTargetGUI($this);
1500 $questionSideListGUI->setQuestionSummaryData($questionSummaryData);
1501 $questionSideListGUI->setCurrentSequenceElement($currentSequenceElement);
1504 $questionSideListGUI->setDisabled(
false);
1508 $this->tpl->setVariable(
'LIST_OF_QUESTIONS', $questionSideListGUI->getHTML());
1517 public function outQuestionSummaryCmd($fullpage =
true, $contextFinishTest =
false, $obligationsNotAnswered =
false, $obligationsFilter =
false)
1520 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_question_summary.html",
"Modules/Test");
1523 if ($obligationsNotAnswered) {
1527 if ($this->
object->getKioskMode() && $fullpage) {
1529 if (strlen($head)) {
1530 $this->tpl->setCurrentBlock(
"kiosk_options");
1531 $this->tpl->setVariable(
"KIOSK_HEAD", $head);
1532 $this->tpl->parseCurrentBlock();
1537 $active_id = $this->testSession->getActiveId();
1538 $questionSummaryData = $this->service->getQuestionSummaryData($this->testSequence, $obligationsFilter);
1540 $this->ctrl->setParameter($this,
"sequence",
$_GET[
"sequence"]);
1543 include_once
"./Modules/Test/classes/tables/class.ilListOfQuestionsTableGUI.php";
1546 $table_gui->setShowPointsEnabled(!$this->
object->getTitleOutput());
1547 $table_gui->setShowMarkerEnabled($this->
object->getShowMarker());
1548 $table_gui->setObligationsNotAnswered($obligationsNotAnswered);
1549 $table_gui->setShowObligationsEnabled($this->
object->areObligationsEnabled());
1550 $table_gui->setObligationsFilterEnabled($obligationsFilter);
1555 $table_gui->setData($questionSummaryData);
1557 $this->tpl->setVariable(
'TABLE_LIST_OF_QUESTIONS', $table_gui->getHTML());
1559 if ($this->
object->getEnableProcessingTime()) {
1577 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_max_allowed_users_reached.html",
"Modules/Test");
1578 $this->tpl->setCurrentBlock(
"adm_content");
1579 $this->tpl->setVariable(
"MAX_ALLOWED_USERS_MESSAGE", sprintf($this->lng->txt(
"tst_max_allowed_users_message"), $this->
object->getAllowedUsersTimeGap()));
1580 $this->tpl->setVariable(
"MAX_ALLOWED_USERS_HEADING", sprintf($this->lng->txt(
"tst_max_allowed_users_heading"), $this->
object->getAllowedUsersTimeGap()));
1582 $this->tpl->setVariable(
"TXT_BACK_TO_INFOSCREEN", $this->lng->txt(
"tst_results_back_introduction"));
1583 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
1584 $this->tpl->parseCurrentBlock();
1599 $this->tpl->addBlockFile(
"ADM_CONTENT",
"adm_content",
"tpl.il_as_tst_correct_solution.html",
"Modules/Test");
1601 include_once(
"./Services/Style/Content/classes/class.ilObjStyleSheet.php");
1602 $this->tpl->setCurrentBlock(
"ContentStyle");
1604 $this->tpl->parseCurrentBlock();
1606 $this->tpl->setCurrentBlock(
"SyntaxStyle");
1608 $this->tpl->parseCurrentBlock();
1611 if ($this->
object->getShowSolutionAnswersOnly()) {
1615 $this->tpl->setCurrentBlock(
"adm_content");
1617 $this->tpl->setVariable(
"OUTPUT_SOLUTION", $solution);
1618 $this->tpl->setVariable(
"TEXT_BACK", $this->lng->txt(
"back"));
1619 $this->ctrl->saveParameter($this,
"pass");
1620 $this->ctrl->saveParameter($this,
"active_id");
1621 $this->tpl->setVariable(
"URL_BACK", $this->ctrl->getLinkTarget($this,
"outUserResultsOverview"));
1622 $this->tpl->parseCurrentBlock();
1638 $this->tpl->addBlockFile($this->
getContentBlockName(),
"adm_content",
"tpl.il_as_tst_finish_list_of_answers.html",
"Modules/Test");
1640 $result_array =&$this->
object->getTestResult(
1649 foreach ($result_array as $question_data) {
1650 $question = $question_data[
"qid"];
1651 if (is_numeric($question)) {
1652 $this->tpl->setCurrentBlock(
"printview_question");
1653 $question_gui = $this->
object->createQuestionGUI(
"", $question);
1654 $template =
new ilTemplate(
"tpl.il_as_qpl_question_printview.html",
true,
true,
"Modules/TestQuestionPool");
1656 $template->setVariable(
"QUESTION_TITLE", $question_gui->object->getTitle());
1658 $show_question_only = ($this->
object->getShowSolutionAnswersOnly()) ?
true :
false;
1659 $result_output = $question_gui->getSolutionOutput($active_id,
$pass,
false,
false, $show_question_only, $this->
object->getShowSolutionFeedback());
1660 $template->setVariable(
"SOLUTION_OUTPUT", $result_output);
1661 $this->tpl->setVariable(
"QUESTION_OUTPUT",
$template->get());
1662 $this->tpl->parseCurrentBlock();
1668 if ($this->
object->getShowSolutionAnswersOnly()) {
1671 if (strlen($top_data)) {
1672 $this->tpl->setCurrentBlock(
"top_data");
1673 $this->tpl->setVariable(
"TOP_DATA", $top_data);
1674 $this->tpl->parseCurrentBlock();
1677 if (strlen($bottom_data)) {
1678 $this->tpl->setCurrentBlock(
"bottom_data");
1679 $this->tpl->setVariable(
"FORMACTION", $this->ctrl->getFormAction($this));
1680 $this->tpl->setVariable(
"BOTTOM_DATA", $bottom_data);
1681 $this->tpl->parseCurrentBlock();
1684 $this->tpl->setCurrentBlock(
"adm_content");
1685 $this->tpl->setVariable(
"TXT_ANSWER_SHEET", $this->lng->txt(
"tst_list_of_answers"));
1688 $this->tpl->setVariable(
"USER_DETAILS", $user_data);
1689 $this->tpl->setVariable(
"SIGNATURE", $signature);
1690 $this->tpl->setVariable(
"TITLE", $this->
object->getTitle());
1691 $this->tpl->setVariable(
"TXT_TEST_PROLOG", $this->lng->txt(
"tst_your_answers"));
1692 $invited_user =&$this->
object->getInvitedUsers($ilUser->getId());
1693 $pagetitle = $this->
object->getTitle() .
" - " . $this->lng->txt(
"clientip") .
1694 ": " . $invited_user[$ilUser->getId()][
"clientip"] .
" - " .
1695 $this->lng->txt(
"matriculation") .
": " .
1696 $invited_user[$ilUser->getId()][
"matriculation"];
1697 $this->tpl->setVariable(
"PAGETITLE", $pagetitle);
1698 $this->tpl->parseCurrentBlock();
1708 if ($this->
object->getKioskMode()) {
1709 $this->tpl->setBodyClass(
"kiosk");
1710 $this->tpl->setAddFooter(
false);
1713 return "ADM_CONTENT";
1719 $this->ctrl->redirectByClass(
1720 array(
'ilRepositoryGUI',
'ilObjTestGUI',
'ilTestEvaluationGUI'),
1721 "outUserResultsOverview" 1734 $this->ctrl->setParameter($this,
'pmode', self::PRESENTATION_MODE_EDIT);
1736 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
1749 $this->ctrl->setParameter($this,
'pmode', self::PRESENTATION_MODE_EDIT);
1751 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
1770 $this->tpl->addBlockFile(
1773 'tpl.il_as_tst_question_summary.html',
1777 if ($this->
object->getKioskMode()) {
1784 $this->tpl->addBlockFile(
1787 'tpl.il_as_tst_output.html',
1798 if (strlen($head)) {
1799 $this->tpl->setCurrentBlock(
"kiosk_options");
1800 $this->tpl->setVariable(
"KIOSK_HEAD", $head);
1801 $this->tpl->parseCurrentBlock();
1807 if ($this->ctrl->getNextClass() ==
'iltestpasswordprotectiongui') {
1811 if (!$this->passwordChecker->isPasswordProtectionPageRedirectRequired()) {
1817 $nextCommand = $this->ctrl->getCmdClass() .
'::' . $this->ctrl->getCmd();
1818 $this->ctrl->setParameterByClass(
'ilTestPasswordProtectionGUI',
'nextCommand', $nextCommand);
1819 $this->ctrl->redirectByClass(
'ilTestPasswordProtectionGUI',
'showPasswordForm');
1824 if (!$this->
object->isInstantFeedbackAnswerFixationEnabled()) {
1828 if (!$this->testSequence->isQuestionChecked($questionId)) {
1840 return $this->lng->txt(
"save_introduction");
1845 $this->assSettings =
new ilSetting(
'assessment');
1854 $questionList->load();
1856 $testResults = $this->
object->getTestResult($testSession->
getActiveId(), $testSession->
getPass(),
true);
1858 require_once
'Modules/Test/classes/class.ilTestSkillEvaluation.php';
1862 $skillEvaluation->setActiveId($testSession->
getActiveId());
1863 $skillEvaluation->setPass($testSession->
getPass());
1865 $skillEvaluation->setNumRequiredBookingsForSkillTriggering($this->assSettings->get(
1866 'ass_skl_trig_num_answ_barrier',
1871 $skillEvaluation->init($questionList);
1872 $skillEvaluation->evaluate($testResults);
1874 $skillEvaluation->handleSkillTriggering();
1881 require_once
'Modules/Test/classes/confirmations/class.ilTestAnswerOptionalQuestionsConfirmationGUI.php';
1884 $confirmation->setFormAction($this->ctrl->getFormAction($this));
1885 $confirmation->setCancelCmd(
'cancelAnswerOptionalQuestions');
1886 $confirmation->setConfirmCmd(
'confirmAnswerOptionalQuestions');
1888 $confirmation->build($this->
object->isFixedTest());
1895 $this->testSequence->setAnsweringOptionalQuestionsConfirmed(
true);
1896 $this->testSequence->saveToDb();
1898 $this->ctrl->setParameter($this,
'activecommand',
'gotoquestion');
1899 $this->ctrl->redirect($this,
'redirectQuestion');
1904 if ($this->
object->getListOfQuestions()) {
1905 $this->ctrl->setParameter($this,
'activecommand',
'summary');
1907 $this->ctrl->setParameter($this,
'activecommand',
'previous');
1910 $this->ctrl->redirect($this,
'redirectQuestion');
1918 if ($this->
object->getKioskMode()) {
1919 $this->tpl->addBlockfile($this->
getContentBlockName(),
'content',
"tpl.il_as_tst_kiosk_mode_content.html",
"Modules/Test");
1920 $this->tpl->setContent($this->ctrl->getHTML($helperGui));
1933 if ($ilSetting->get(
'char_selector_availability') > 0) {
1934 require_once
'Services/UIComponent/CharSelector/classes/class.ilCharSelectorGUI.php';
1937 $char_selector->addToPage();
1938 $this->tpl->setCurrentBlock(
'char_selector');
1939 $this->tpl->setVariable(
"CHAR_SELECTOR_TEMPLATE", $char_selector->getSelectorHtml());
1940 $this->tpl->parseCurrentBlock();
1953 require_once
'Modules/Test/classes/class.ilTestNavigationToolbarGUI.php';
1956 $navigationToolbarGUI->setSuspendTestButtonEnabled($this->
object->getShowCancel());
1957 $navigationToolbarGUI->setQuestionTreeButtonEnabled($this->
object->getListOfQuestions());
1958 $navigationToolbarGUI->setQuestionTreeVisible($ilUser->getPref(
'side_list_of_questions'));
1959 $navigationToolbarGUI->setQuestionListButtonEnabled($this->
object->getListOfQuestions());
1962 return $navigationToolbarGUI;
1967 require_once
'Modules/Test/classes/class.ilTestQuestionNavigationGUI.php';
1974 if ($this->
object->getShowMarker()) {
1975 include_once
"./Modules/Test/classes/class.ilObjTest.php";
1979 if (count($solved_array) > 0) {
1980 $solved = array_pop($solved_array);
1981 $solved = $solved[
"solved"];
1986 $navigationGUI->setQuestionMarked(
true);
1989 $navigationGUI->setQuestionMarked(
false);
1994 return $navigationGUI;
1999 require_once
'Modules/Test/classes/class.ilTestQuestionNavigationGUI.php';
2002 if ($this->
object->isForceInstantFeedbackEnabled()) {
2017 case $this->
object->getSpecificAnswerFeedback():
2018 case $this->
object->getGenericAnswerFeedback():
2019 case $this->
object->getAnswerFeedbackPoints():
2020 case $this->
object->getInstantFeedbackSolution():
2022 $navigationGUI->setAnswerFreezingEnabled($this->
object->isInstantFeedbackAnswerFixationEnabled());
2024 if ($this->
object->isForceInstantFeedbackEnabled()) {
2025 $navigationGUI->setForceInstantResponseEnabled(
true);
2033 if ($this->
object->isOfferingQuestionHintsEnabled()) {
2034 $activeId = $this->testSession->getActiveId();
2035 $pass = $this->testSession->getPass();
2037 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
2040 if ($questionHintTracking->requestsPossible()) {
2044 if ($questionHintTracking->requestsExist()) {
2049 $navigationGUI->setCharSelectorEnabled($charSelectorAvailable);
2051 if ($this->
object->getShowMarker()) {
2052 include_once
"./Modules/Test/classes/class.ilObjTest.php";
2056 if (count($solved_array) > 0) {
2057 $solved = array_pop($solved_array);
2058 $solved = $solved[
"solved"];
2064 $navigationGUI->setQuestionMarked(
true);
2067 $navigationGUI->setQuestionMarked(
false);
2071 return $navigationGUI;
2079 if (!$this->
object->getListOfQuestionsEnd()) {
2080 return 'finishTest';
2083 if ($this->
object->areObligationsEnabled()) {
2085 $this->testSession->getTestId(),
2086 $this->testSession->getActiveId(),
2087 $this->testSession->getPass()
2090 if (!$allObligationsAnswered) {
2091 return 'outQuestionSummaryWithObligationsInfo';
2095 return 'outQuestionSummary';
2127 $answerFeedbackEnabled = $this->
object->getSpecificAnswerFeedback();
2130 $this->testSession->getActiveId(), #active_id
2131 $this->testSession->getPass(), #pass
2132 false, #graphical_output
2133 false, #result_output
2134 true, #show_question_only
2135 $answerFeedbackEnabled, #show_feedback
2136 false, #show_correct_solution
2137 false, #show_manual_scoring
2138 true #show_question_text
2144 $this->testSession->getActiveId(),
2148 $tpl =
new ilTemplate(
'tpl.tst_player_response_modal.html',
true,
true,
'Modules/Test');
2154 $this->tpl = $saved_tpl;
2156 $tpl->setVariable(
'QUESTION_OUTPUT', $pageoutput);
2159 $button->setId(
'tst_confirm_feedback');
2160 $button->setUrl($navUrl);
2161 $button->setCaption(
'proceed');
2162 $button->setPrimary(
true);
2163 $tpl->setVariable(
'BUTTON', $button->render());
2166 require_once(
'Services/UIComponent/Modal/classes/class.ilModalGUI.php');
2169 $modal->setId(
'tst_question_feedback_modal');
2170 $modal->setHeading($this->lng->txt(
'tst_instant_feedback'));
2171 $modal->setBody(
$tpl->get());
2173 $this->tpl->addOnLoadCode(
"$('#tst_question_feedback_modal').modal('show');");
2174 $this->tpl->setVariable(
'INSTANT_RESPONSE_MODAL', $modal->getHTML());
2186 if ($this->
object->getInstantFeedbackSolution()) {
2191 $this->testSession->getActiveId(), #active_id
2193 false, #graphical_output
2194 $show_question_inline_score, #result_output
2195 false, #show_question_only
2196 false, #show_feedback
2197 true, #show_correct_solution
2198 false, #show_manual_scoring
2199 false #show_question_text
2204 $reachedPoints = $questionGui->object->getAdjustedReachedPoints(
2205 $this->testSession->getActiveId(),
2210 $maxPoints = $questionGui->object->getMaximumPoints();
2212 $solutionCorrect = ($reachedPoints == $maxPoints);
2216 if ($this->
object->getAnswerFeedbackPoints()) {
2222 if ($this->
object->getGenericAnswerFeedback()) {
2228 if ($this->
object->getSpecificAnswerFeedback()) {
2239 return $this->testSession->getLastSequence();
2244 unset(
$_GET[
'sequence']);
2245 $this->ctrl->setParameter($this,
'sequence', null);
2250 if (isset(
$_GET[
'sequence'])) {
2251 return $_GET[
'sequence'];
2259 if (isset(
$_GET[
'pmode'])) {
2260 return $_GET[
'pmode'];
2268 if (isset(
$_GET[
'instresp'])) {
2269 return $_GET[
'instresp'];
2277 if (isset(
$_POST[
'nextcmd']) && strlen(
$_POST[
'nextcmd'])) {
2278 return $_POST[
'nextcmd'];
2286 if (isset(
$_POST[
'nextseq']) && is_numeric(
$_POST[
'nextseq'])) {
2287 return (
int)
$_POST[
'nextseq'];
2296 if (isset(
$_POST[
'test_player_navigation_url'])) {
2297 return $_POST[
'test_player_navigation_url'];
2311 return !empty(
$_GET[
'test_answer_changed']);
2320 $this->ctrl->setParameter($this,
'test_answer_changed',
$changed ?
'1' :
'0');
2346 if (!empty(
$_POST[
'save_on_navigation_prevent_confirmation'])) {
2347 $_SESSION[
'save_on_navigation_prevent_confirmation'] =
true;
2366 if (!$fromCache || !isset($this->cachedQuestionGuis[$questionId])) {
2367 $questionGui = $this->
object->createQuestionGUI(
"", $questionId);
2368 $questionGui->setTargetGui($this);
2370 $questionGui->object->setObligationsToBeConsidered($this->
object->areObligationsEnabled());
2371 $questionGui->populateJavascriptFilesRequiredForWorkForm($tpl);
2379 $this->cachedQuestionGuis[$questionId] = $questionGui;
2382 return $this->cachedQuestionGuis[$questionId];
2398 if (!$fromCache || !isset($this->cachedQuestionObjects[$questionId])) {
2402 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionProcessLockerFactory.php';
2404 $processLockerFactory->setQuestionId($questionOBJ->getId());
2405 $processLockerFactory->setUserId($ilUser->getId());
2406 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
2408 $questionOBJ->setProcessLocker($processLockerFactory->getLocker());
2410 $questionOBJ->setObligationsToBeConsidered($this->
object->areObligationsEnabled());
2417 $this->cachedQuestionObjects[$questionId] = $questionOBJ;
2420 return $this->cachedQuestionObjects[$questionId];
2427 $this->
object->isPreviousSolutionReuseEnabled($this->testSession->getActiveId())
2438 require_once
'Services/Randomization/classes/class.ilArrayElementShuffler.php';
2442 $shuffler->setSeed($fixedSeed);
2458 .
"active={$this->testSession->getActiveId()} " 2459 .
"qId=$questionId seq=$sequenceElement " 2460 . serialize($this->testSequence)
2463 $ilLog->logStack(
'INV SEQ');
2465 $this->ctrl->setParameter($this,
'sequence', $this->testSequence->getFirstSequence());
2474 if ($this->
object->getKioskMode()) {
2475 $this->tpl->addBlockfile($this->
getContentBlockName(),
'content',
"tpl.il_as_tst_kiosk_mode_content.html",
"Modules/Test");
2476 $this->tpl->setContent($contentHTML);
2484 require_once
'Services/UIComponent/Button/classes/class.ilSubmitButton.php';
2485 require_once
'Services/UIComponent/Button/classes/class.ilLinkButton.php';
2486 require_once
'Services/UIComponent/Modal/classes/class.ilModalGUI.php';
2493 if ($this->
object->getKioskMode()) {
2500 $tpl =
new ilTemplate(
'tpl.tst_player_confirmation_modal.html',
true,
true,
'Modules/Test');
2502 $tpl->setVariable(
'CONFIRMATION_TEXT', $this->lng->txt(
'discard_answer_confirmation'));
2506 $button->setCaption(
'discard_answer');
2507 $tpl->setCurrentBlock(
'buttons');
2508 $tpl->setVariable(
'BUTTON', $button->render());
2509 $tpl->parseCurrentBlock();
2512 $button->setId(
'tst_cancel_discard_button');
2513 $button->setCaption(
'cancel');
2514 $button->setPrimary(
true);
2515 $tpl->setCurrentBlock(
'buttons');
2516 $tpl->setVariable(
'BUTTON', $button->render());
2517 $tpl->parseCurrentBlock();
2520 $modal->setId(
'tst_discard_solution_modal');
2521 $modal->setHeading($this->lng->txt(
'discard_answer'));
2522 $modal->setBody(
$tpl->get());
2524 $this->tpl->setCurrentBlock(
'discard_solution_modal');
2525 $this->tpl->setVariable(
'DISCARD_SOLUTION_MODAL', $modal->getHTML());
2526 $this->tpl->parseCurrentBlock();
2593 if (!empty(
$_SESSION[
'save_on_navigation_prevent_confirmation'])) {
2597 $tpl =
new ilTemplate(
'tpl.tst_player_confirmation_modal.html',
true,
true,
'Modules/Test');
2599 if ($this->
object->isInstantFeedbackAnswerFixationEnabled() && $this->
object->isForceInstantFeedbackEnabled()) {
2600 $text = $this->lng->txt(
'save_on_navigation_locked_confirmation');
2602 $text = $this->lng->txt(
'save_on_navigation_confirmation');
2604 if ($this->
object->isForceInstantFeedbackEnabled()) {
2605 $text .=
" " . $this->lng->txt(
'save_on_navigation_forced_feedback_hint');
2607 $tpl->setVariable(
'CONFIRMATION_TEXT',
$text);
2611 $button->setId(
'tst_save_on_navigation_button');
2612 $button->setUrl(
'#');
2613 $button->setCaption(
'tst_save_and_proceed');
2614 $button->setPrimary(
true);
2615 $tpl->setCurrentBlock(
'buttons');
2616 $tpl->setVariable(
'BUTTON', $button->render());
2617 $tpl->parseCurrentBlock();
2620 $button->setId(
'tst_cancel_on_navigation_button');
2621 $button->setUrl(
'#');
2622 $button->setCaption(
'cancel');
2623 $button->setPrimary(
false);
2624 $tpl->setCurrentBlock(
'buttons');
2625 $tpl->setVariable(
'BUTTON', $button->render());
2626 $tpl->parseCurrentBlock();
2628 $tpl->setCurrentBlock(
'checkbox');
2629 $tpl->setVariable(
'CONFIRMATION_CHECKBOX_NAME',
'save_on_navigation_prevent_confirmation');
2630 $tpl->setVariable(
'CONFIRMATION_CHECKBOX_LABEL', $this->lng->txt(
'save_on_navigation_prevent_confirmation'));
2631 $tpl->parseCurrentBlock();
2634 $modal->setId(
'tst_save_on_navigation_modal');
2635 $modal->setHeading($this->lng->txt(
'save_on_navigation'));
2636 $modal->setBody(
$tpl->get());
2638 $this->tpl->setCurrentBlock(
'nav_while_edit_modal');
2639 $this->tpl->setVariable(
'NAV_WHILE_EDIT_MODAL', $modal->getHTML());
2640 $this->tpl->parseCurrentBlock();
2650 protected function populateQuestionEditControl($questionGUI)
2656 $state = $questionGUI->object->lookupForExistingSolutions($this->testSession->getActiveId(), $this->testSession->getPass());
2667 if ($questionGUI->isAutosaveable() && $this->
object->getAutosave()) {
2669 $config[
'autosaveInterval'] = $this->
object->getAutosaveIval();
2672 $config[
'autosaveInterval'] = 0;
2677 $questionConfig = $questionGUI->object->getTestPresentationConfig();
2681 $config[
'withFormChangeDetection'] = $questionConfig->isFormChangeDetectionEnabled();
2684 $config[
'withBackgroundChangeDetection'] = $questionConfig->isBackgroundChangeDetectionEnabled();
2688 $config[
'forcedInstantFeedback'] = $this->
object->isForceInstantFeedbackEnabled();
2690 $this->tpl->addJavascript(
'./Modules/Test/js/ilTestPlayerQuestionEditControl.js');
2691 $this->tpl->addOnLoadCode(
'il.TestPlayerQuestionEditControl.init(' . json_encode(
$config) .
')');
2698 return self::PRESENTATION_MODE_EDIT;
2708 $fixedSeed = $questionId . $this->testSession->getActiveId() . $this->testSession->getPass();
2721 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'])) {
2725 $_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()] = $forcedFeedbackNavUrl;
2730 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'])) {
2734 if (!isset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()])) {
2738 return $_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()];
2748 if (isset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()])) {
2749 unset(
$_SESSION[
'forced_feedback_navigation_url'][$this->testSession->getActiveId()]);
checkTestSessionUser(ilTestSession $testSession)
static makeDirParents($a_dir)
Create a new directory and all parent directories.
populateSyntaxStyleBlock()
redirectAfterAutosaveCmd()
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
submitIntermediateSolutionCmd()
startPlayerCmd()
Start a test for the first time.
const AFTER_TEST_PASS_FINISHED
populateDiscardSolutionModal()
removeIntermediateSolution()
remove an auto-saved solution of the current question
performTestPassFinishedTasks($finishedPass)
const CMD_CONFIRM_REQUEST
isQuestionSummaryFinishTestButtonRequired()
outObligationsOnlySummaryCmd()
Class ilTestPassFinishTasks.
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']
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($question_gui)
populateContentStyleBlock()
handleQuestionActionCmd()
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()
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.
static formatDate(ilDateTime $date, $a_skip_day=false, $a_include_wd=false)
Format a date public.
isTestSignRedirectRequired($activeId, $lastFinishedPass)
$GLOBALS['loaded']
Global hash that tracks already loaded includes.
static get($a_var)
Get a value.
populateHelperGuiContent($helperGui)
const BACK_FROM_FINISHING
getNextCommandParameter()
doesAccessCodeInSessionExists()
populateLowerPreviousButtonBlock($disabled)
toggleSideListCmd()
Toggle side list.
getResultsSignature()
Returns HTML code for a signature field.
cancelAnswerOptionalQuestionsCmd()
setAnonymousId($anonymous_id)
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.
__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.
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)
if(!array_key_exists('stateid', $_REQUEST)) $state
Handle linkback() response from LinkedIn.
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
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()
special template class to simplify handling of ITX/PEAR
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
static getContentStylePath($a_style_id, $add_random=true)
get content style path
getAnswerChangedParameter()
Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationContr...
getSequenceElementParameter()
Basic GUI class for assessment questions.
detectChangesCmd()
Detect changes sent in the background to the server This is called by ajax from ilTestPlayerQuestionE...
const PRESENTATION_MODE_VIEW
Create styles array
The data for the language used.
const PRESENTATION_CONTEXT_TEST
initProcessLocker($activeId)
static _instantiateQuestion($question_id)
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
isShowingPostponeStatusReguired($questionId)
outQuestionSummaryCmd($fullpage=true, $contextFinishTest=false, $obligationsNotAnswered=false, $obligationsFilter=false)
Output of a summary of all test questions for test participants.
unmarkQuestionCmd()
Set a question unsolved.
handlePasswordProtectionRedirect()
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)
buildQuestionAnswerShuffler($questionId)
showMaximumAllowedUsersReachedMessage()
Create new PHPExcel object
obj_idprivate
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)
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()
getQuestionGuiInstance($questionId, $fromCache=true)
static buildExamId($active_id, $pass, $test_obj_id=null)
const FIXED_SHUFFLER_SEED_MIN_LENGTH
getQuestionInstance($questionId, $fromCache=true)
getQuestionsDefaultPresentationMode($isQuestionWorkedThrough)
unmarkQuestionAndSaveIntermediateCmd()
outQuestionPage($a_temp_var, $a_postponed=false, $active_id="", $html="")
output question page
Service GUI class for tests.
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
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
getTestNavigationToolbarGUI()
populateSolutionBlock($solutionoutput)
populateScoreBlock($reachedPoints, $maxPoints)
isParticipantsAnswerFixed($questionId)
Output class for assessment test execution.
Confirmation screen class.
static lookupExamId($active_id, $pass)
setNavigationGUI($navigationGUI)
buildFixedShufflerSeed($questionId)