4require_once
'./Modules/Test/classes/class.ilTestPlayerAbstractGUI.php';
29 $ilTabs->clearTargets();
31 $cmd = $this->ctrl->getCmd();
32 $next_class = $this->ctrl->getNextClass($this);
34 $this->ctrl->saveParameter($this,
"sequence");
35 $this->ctrl->saveParameter($this,
"active_id");
37 if (preg_match(
"/^gotoquestion_(\\d+)$/",
$cmd, $matches))
39 $cmd =
"gotoquestion";
40 if (strlen($matches[1]))
42 $this->ctrl->setParameter($this,
'gotosequence', $matches[1]);
55 $this->testSequence->loadFromDb();
56 $this->testSequence->loadQuestions();
58 include_once
'Services/jQuery/classes/class.iljQueryUtil.php';
60 include_once
"./Services/YUI/classes/class.ilYuiUtil.php";
69 case 'ilassquestionpagegui':
71 $questionId = $this->testSequence->getQuestionForSequence( $this->
calculateSequence() );
73 require_once
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
75 $ret = $this->ctrl->forwardCommand($page_gui);
78 case 'iltestsubmissionreviewgui':
79 require_once
'./Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
81 $ret = $this->ctrl->forwardCommand($gui);
84 case 'ilassquestionhintrequestgui':
86 $questionGUI = $this->
object->createQuestionGUI(
87 "", $this->testSequence->getQuestionForSequence( $this->calculateSequence() )
90 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
92 $questionGUI->object->getId(), $this->testSession->getActiveId(), $this->testSession->getPass()
95 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
98 $ret = $this->ctrl->forwardCommand($gui);
102 case 'iltestsignaturegui':
103 require_once
'./Modules/Test/classes/class.ilTestSignatureGUI.php';
105 $ret = $this->ctrl->forwardCommand($gui);
108 case 'iltestpasswordprotectiongui':
109 require_once
'Modules/Test/classes/class.ilTestPasswordProtectionGUI.php';
111 $ret = $this->ctrl->forwardCommand($gui);
125 $_GET[
'activecommand'] =
'start';
134 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
141 $this->ctrl->setParameter($this,
"activecommand",
"next");
142 $this->ctrl->redirect($this,
"redirectQuestion");
150 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
157 $this->ctrl->setParameter($this,
"activecommand",
"previous");
158 $this->ctrl->redirect($this,
"redirectQuestion");
175 $executable = $this->
object->isExecutable($this->testSession,
$ilUser->getId());
176 if (!$executable[
"executable"])
179 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
181 switch (
$_GET[
"activecommand"])
185 if ($this->sequence === FALSE)
187 if ($this->object->getListOfQuestionsEnd())
191 $this->testSession->getTestId(),
192 $this->testSession->getActiveId(),
193 $this->testSession->getPass()
196 if( $this->object->areObligationsEnabled() && !$allObligationsAnswered )
198 $this->ctrl->redirect($this,
"outQuestionSummaryWithObligationsInfo");
205 $this->ctrl->redirect($this,
"finishTest");
210 $this->testSession->setLastSequence($this->sequence);
211 $this->testSession->saveToDb();
217 $this->testSession->setLastSequence($this->sequence);
218 $this->testSession->saveToDb();
219 if ($this->sequence === FALSE)
221 $this->ctrl->redirect($this,
"outIntroductionPage");
230 $nextSequence = $this->testSequence->getNextSequence($this->sequence);
231 $this->testSequence->postponeSequence($this->sequence);
232 $this->testSequence->saveToDb();
233 $this->testSession->setLastSequence($nextSequence);
234 $this->testSession->saveToDb();
235 $this->sequence = $nextSequence;
240 $this->testSession->setLastSequence($this->sequence);
241 $this->testSession->saveToDb();
242 $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
243 $this->
object->setQuestionSetSolved(1, $q_id,
$ilUser->getId());
248 $this->testSession->setLastSequence($this->sequence);
249 $this->testSession->saveToDb();
250 $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
251 $this->
object->setQuestionSetSolved(0, $q_id,
$ilUser->getId());
254 case "directfeedback":
256 $this->testSession->setLastSequence($this->sequence);
257 $this->testSession->saveToDb();
260 case "handleQuestionAction":
262 $this->testSession->setLastSequence($this->sequence);
263 $this->testSession->saveToDb();
267 $this->ctrl->redirect($this,
"outQuestionSummary");
269 case "summary_obligations":
270 $this->ctrl->redirect($this,
"outQuestionSummaryWithObligationsInfo");
272 case "summary_obligations_only":
273 $this->ctrl->redirect($this,
"outObligationsOnlySummary");
279 $this->testSession->setUserId(
$ilUser->getId());
280 $this->testSession->setAnonymousId(
$_SESSION[
"tst_access_code"][$this->object->getTestId()]);
282 $this->testSession->saveToDb();
284 $active_id = $this->testSession->getActiveId();
285 $this->ctrl->setParameter($this,
"active_id", $active_id);
286 $shuffle = $this->
object->getShuffleQuestions();
287 if ($this->object->isRandomTest())
291 $this->
object->loadQuestions();
295 assQuestion::_updateTestPassResults(
296 $active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(),
null, $this->object->id
300 if( !$this->testSequence->hasSequence() )
302 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
303 $this->testSequence->saveToDb();
306 if( $this->testSession->isObjectiveOriented() )
308 $this->testSequence->loadFromDb();
309 $this->testSequence->loadQuestions();
312 $this->testSession, $this->testSequence
316 $active_time_id = $this->
object->startWorkingTime($this->testSession->getActiveId(), $this->testSession->getPass());
317 $_SESSION[
"active_time_id"] = $active_time_id;
318 if ($this->object->getListOfQuestionsStart())
320 $this->ctrl->setParameter($this,
"activecommand",
"summary");
321 $this->ctrl->redirect($this,
"redirectQuestion");
325 $this->ctrl->setParameter($this,
"sequence", $this->sequence);
326 $this->ctrl->setParameter($this,
"activecommand",
"gotoquestion");
327 $this->ctrl->saveParameter($this,
"tst_javascript");
328 $this->ctrl->redirect($this,
"redirectQuestion");
333 $active_id = $this->testSession->getActiveId();
334 $this->ctrl->setParameter($this,
"active_id", $active_id);
336 if ($this->object->isRandomTest())
338 if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass()))
344 $shuffle = $this->
object->getShuffleQuestions();
345 if ($this->object->isRandomTest())
350 assQuestion::_updateTestPassResults(
351 $active_id, $this->testSession->getPass(), $this->object->areObligationsEnabled(),
null, $this->object->id
355 if( !$this->testSequence->hasSequence() )
357 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
358 $this->testSequence->saveToDb();
361 $this->sequence = $this->testSession->getLastSequence();
362 $active_time_id = $this->
object->startWorkingTime($active_id, $this->testSession->getPass());
363 $_SESSION[
"active_time_id"] = $active_time_id;
364 if ($this->object->getListOfQuestionsStart())
366 $this->ctrl->setParameter($this,
"activecommand",
"summary");
367 $this->ctrl->redirect($this,
"redirectQuestion");
371 $this->ctrl->setParameter($this,
"sequence", $this->sequence);
372 $this->ctrl->setParameter($this,
"activecommand",
"gotoquestion");
373 $this->ctrl->saveParameter($this,
"tst_javascript");
374 $this->ctrl->redirect($this,
"redirectQuestion");
378 case 'test_submission_overview':
379 require_once
'./Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
380 $this->ctrl->redirectByClass(
'ilTestSubmissionReviewGUI',
"show");
387 if (array_key_exists(
"tst_javascript",
$_GET))
389 $ilUser->writePref(
"tst_javascript",
$_GET[
"tst_javascript"]);
392 if (strlen(
$_GET[
'gotosequence'])) $this->sequence =
$_GET[
'gotosequence'];
393 $this->testSession->setLastSequence($this->sequence);
394 $this->testSession->saveToDb();
402 if( $sequenceElement < 1 )
407 if( !$this->testSequence->getPositionOfSequence($sequenceElement) )
424 $sequence = $this->testSequence->getFirstSequence();
427 $_SESSION[
"active_time_id"]= $this->
object->startWorkingTime($this->testSession->getActiveId(),
428 $this->testSession->getPass()
434 if ($this->object->getListOfQuestions())
439 $questionId = $this->testSequence->getQuestionForSequence(
$sequence);
441 if( !(
int)$questionId && $this->testSession->isObjectiveOriented() )
444 sprintf($this->lng->txt(
'tst_objective_oriented_test_pass_without_questions'), $this->object->getTitle()),
true
449 $question_gui = $this->
object->createQuestionGUI(
"", $questionId);
451 if( !is_object($question_gui) )
456 "INV SEQ: active={$this->testSession->getActiveId()} qId=$questionId seq=$sequence "
457 .serialize($this->testSequence)
460 $ilLog->logStack(
'INV SEQ');
462 $this->ctrl->setParameter($this,
'gotosequence', $this->testSequence->getFirstSequence());
463 $this->ctrl->setParameter($this,
'activecommand',
'gotoquestion');
464 $this->ctrl->redirect($this,
'redirectQuestion');
467 $question_gui->setTargetGui($this);
469 if ($this->object->getJavaScriptOutput())
474 $is_postponed = $this->testSequence->isPostponedQuestion($question_gui->object->getId());
475 $this->ctrl->setParameter($this,
"sequence",
"$sequence");
476 $formaction = $this->ctrl->getFormAction($this,
"gotoQuestion");
478 $question_gui->setSequenceNumber($this->testSequence->getPositionOfSequence(
$sequence));
479 $question_gui->setQuestionCount($this->testSequence->getUserQuestionCount());
483 $user_post_solution = FALSE;
484 if (array_key_exists(
"previouspost",
$_SESSION))
486 $user_post_solution =
$_SESSION[
"previouspost"];
493 $answer_feedback = FALSE;
494 if (($directfeedback) && ($this->object->getSpecificAnswerFeedback()))
496 $answer_feedback = TRUE;
501 $solutionoutput = $question_gui->getSolutionOutput(
502 $this->testSession->getActiveId(), #active_id
504 FALSE, #graphical_output
505 false, #result_output
506 true, #show_question_only
507 $answer_feedback, #show_feedback
508 false, #show_correct_solution
509 FALSE, #show_manual_scoring
510 true #show_question_text
513 $pageoutput = $question_gui->outQuestionPage(
514 "", $this->testSequence->isPostponedQuestion($questionId),
515 $this->testSession->getActiveId(),
519 $this->tpl->setVariable(
"QUESTION_OUTPUT", $pageoutput);
520 $this->tpl->setVariable(
"FORMACTION", $formaction);
522 $directfeedback =
true;
528 $question_gui->outQuestionForTest(
529 $formaction, #form_action
530 $this->testSession->getActiveId(), #active_id
532 $is_postponed, #is_postponed
533 $user_post_solution, #user_post_solution
534 $answer_feedback #answer_feedback == inline_specific_feedback
548 if ($this->object->getInstantFeedbackSolution())
553 $solutionoutput = $question_gui->getSolutionOutput(
554 $this->testSession->getActiveId(), #active_id
556 FALSE, #graphical_output
557 $show_question_inline_score, #result_output
558 FALSE, #show_question_only
559 FALSE, #show_feedback
560 TRUE, #show_correct_solution
561 FALSE, #show_manual_scoring
562 FALSE #show_question_text
569 if ($this->object->getAnswerFeedbackPoints())
571 $reachedPoints = $question_gui->object->getAdjustedReachedPoints($this->testSession->getActiveId(), NULL);
572 $maxPoints = $question_gui->object->getMaximumPoints();
579 if ($this->object->getGenericAnswerFeedback())
586 if ($this->object->getSpecificAnswerFeedback())
594 if ($postpone_allowed && !$is_postponed)
599 if ($this->object->getListOfQuestions())
604 if ($this->object->getShowCancel())
611 if ($this->object->getListOfQuestionsEnd())
625 if ($this->object->getShowMarker())
627 include_once
"./Modules/Test/classes/class.ilObjTest.php";
631 if (count ($solved_array) > 0)
633 $solved = array_pop($solved_array);
634 $solved = $solved[
"solved"];
649 if ($this->object->getJavaScriptOutput())
651 $this->tpl->setVariable(
"JAVASCRIPT_TITLE", $this->lng->txt(
"disable_javascript"));
652 $this->ctrl->setParameter($this,
"tst_javascript",
"0");
653 $this->tpl->setVariable(
"JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this,
"gotoQuestion"));
657 $this->tpl->setVariable(
"JAVASCRIPT_TITLE", $this->lng->txt(
"enable_javascript"));
658 $this->ctrl->setParameter($this,
"tst_javascript",
"1");
659 $this->tpl->setVariable(
"JAVASCRIPT_URL", $this->ctrl->getLinkTarget($this,
"gotoQuestion"));
662 if ($question_gui->object->requiresJsSwitch() && !$this->object->getForceJS())
664 $this->tpl->touchBlock(
"jsswitch");
669 $this->tpl->setVariable(
"AUTOSAVE_URL", $this->ctrl->getFormAction($this,
"autosave",
"",
true));
671 if ($question_gui->isAutosaveable()&& $this->object->getAutosave())
673 $this->tpl->touchBlock(
'autosave');
677 $this->tpl->setVariable(
"AUTOSAVEFORMACTION", str_replace(
"&",
"&", $this->ctrl->getLinkTarget($this,
"autosave")));
678 $this->tpl->setVariable(
"AUTOSAVEINTERVAL", $this->object->getAutosaveIval());
683 $this->tpl->touchBlock(
'question_obligatory');
684 $this->tpl->setVariable(
'QUESTION_OBLIGATORY', $this->lng->txt(
'required_field'));
690 return $sequence == $this->testSequence->getFirstSequence();
695 return $this->testSequence->getQuestionForSequence($this->testSequence->getLastSequence()) == $question_gui->object->getId();
713 return $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
722 $this->saveResult = FALSE;
725 $formtimestamp =
$_POST[
"formtimestamp"];
726 if (strlen($formtimestamp) == 0) $formtimestamp =
$_GET[
"formtimestamp"];
727 if ($formtimestamp !=
$_SESSION[
"formtimestamp"])
729 $_SESSION[
"formtimestamp"] = $formtimestamp;
740 $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
741 if (is_numeric($q_id) && (
int)$q_id)
745 $question_gui = $this->
object->createQuestionGUI(
"", $q_id);
746 if ($this->object->getJavaScriptOutput())
751 $active_id = $this->testSession->getActiveId();
752 if ($this->object->isRandomTest())
754 $pass = $this->
object->_getPass($active_id);
756 $this->saveResult = $question_gui->object->persistWorkingState(
757 $active_id,
$pass, $this->object->areObligationsEnabled()
764 if( $this->testSession->isObjectiveOriented() )
767 $this->testSession, $this->testSequence, $question_gui->object
772 if ($this->saveResult == FALSE)
774 $this->ctrl->setParameter($this,
"save_error",
"1");
782 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
788 $this->testSequence->setQuestionChecked($questionId);
789 $this->testSequence->saveToDb();
792 $this->ctrl->setParameter($this,
"activecommand",
"directfeedback");
793 $this->ctrl->redirect($this,
"redirectQuestion");
798 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
805 if ($this->saveResult == FALSE)
807 $this->ctrl->setParameter($this,
"activecommand",
"");
808 $this->ctrl->redirect($this,
"redirectQuestion");
812 $this->ctrl->setParameter($this,
"activecommand",
"summary");
813 $this->ctrl->redirect($this,
"redirectQuestion");
819 $this->ctrl->setParameter($this,
"activecommand",
"summary");
820 $this->ctrl->redirect($this,
"redirectQuestion");
830 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
837 $this->ctrl->setParameter($this,
"activecommand",
"postpone");
838 $this->ctrl->redirect($this,
"redirectQuestion");
843 $questionId = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
851 $this->ctrl->setParameter($this,
'activecommand',
'handleQuestionAction');
852 $this->ctrl->redirect($this,
'redirectQuestion');
857 if ($this->testSession->getActiveId() > 0)
859 if ($this->testSequence->hasRandomQuestionsForPass($this->testSession->getActiveId(), $this->testSession->getPass()) > 0)
867 __METHOD__.
' Random Questions allready exists for user '.
868 $ilUser->getId().
' in test '.$this->object->getTestId()
880 $ilLog->write(__METHOD__.
' '.sprintf(
881 $this->lng->txt(
"error_random_question_generation"),
$ilUser->getId(), $this->object->getTestId()
894 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php';
896 $questionSetConfig->loadFromDb();
898 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
901 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
903 $sourcePoolDefinitionList->loadDefinitions();
905 $this->processLocker->requestRandomPassBuildLock($sourcePoolDefinitionList->hasTaxonomyFilters());
909 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
912 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
915 $questionSetBuilder->performBuild($this->testSession);
918 $this->processLocker->releaseRandomPassBuildLock();
923 require_once
'Modules/Course/classes/Objectives/class.ilLOSettings.php';
930 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
937 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
946 return $this->testSession->isObjectiveOriented();
953 require_once
'Services/Link/classes/class.ilLink.php';
Basic GUI class for assessment questions.
Abstract basic class which is to be extended by the concrete assessment question type classes.
static isObjectiveTest($a_trst_ref_id)
Check if test ref_id is used in an objective course.
static filterQuestions(ilTestSession $a_test_session, ilTestSequence $a_test_sequence)
Called from learning objective test.
static updateObjectiveStatus(ilTestSession $a_test_session, ilTestSequence $a_test_sequence, assQuestion $a_question)
Store result and update objective status.
static _getLink($a_ref_id, $a_type='', $a_params=array(), $append="")
_getSolvedQuestions($active_id, $question_fi=null)
get solved questions
static allObligationsAnswered($test_id, $active_id, $pass)
checks wether all questions marked as obligatory were answered within the test pass with given testId...
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
static _getAllReferences($a_id)
get all reference ids of object
Output class for assessment test execution.
nextQuestionCmd()
Go to the next question.
updateContainerObjectivesWithAnsweredQuestion(ilTestSession $testSession, ilTestSequence $testSequence, assQuestion $question)
showQuestionListWithoutSavingCmd()
redirectQuestionCmd()
Called when a user answered a question to perform a redirect after POST.
filterTestSequenceByObjectives(ilTestSession $testSession, ilTestSequence $testSequence)
previousQuestionCmd()
Go to the previous question.
performTearsAndAngerBrokenConfessionChecks()
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
saveQuestionSolution($force=FALSE)
saves the user input of a question
generateRandomTestPassForActiveUser()
isFirstPageInSequence($sequence)
postponeQuestionCmd()
Postpone a question to the end of the test.
getObjectiveOrientedContainerId()
outWorkingForm($sequence="", $test_id, $postpone_allowed, $directfeedback=false)
Creates the learners output of a question.
executeCommand()
Execute Command.
isValidSequenceElement($sequenceElement)
isLastQuestionInSequence(assQuestionGUI $question_gui)
handleQuestionActionCmd()
Output class for assessment test execution.
populateContentStyleBlock()
fillQuestionRelatedNavigation(assQuestionGUI $questionGUI)
renders the elements for the question related navigation
populateNextButtonsLeadingToEndOfTest()
populateSolutionBlock($solutionoutput)
initProcessLocker($activeId)
isNrOfTriesReached()
nr of tries exceeded
populateQuestionMarkingBlockAsUnmarked()
handlePasswordProtectionRedirect()
populateSpecificFeedbackBlock($question_gui)
populateSyntaxStyleBlock()
calculateSequence()
Calculates the sequence to determine the next question.
populateQuestionMarkingBlockAsMarked()
ensureExistingTestSession(ilTestSession $testSession)
determineInlineScoreDisplay()
populateScoreBlock($reachedPoints, $maxPoints)
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not
populateNextButtonsLeadingToQuestion()
populateCancelButtonBlock()
populatePostponeButtons()
populateNextButtonsLeadingToSummary()
isParticipantsAnswerFixed($questionId)
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
populatePreviousButtons($sequence)
populateGenericFeedbackBlock($question_gui)
outTestPage($directfeedback)
Outputs the question of the active sequence.
outQuestionSummaryCmd($fullpage=true, $contextFinishTest=false, $obligationsNotAnswered=false, $obligationsFilter=false)
Output of a summary of all test questions for test participants.
static getInstance(ilDB $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
saveToDb()
Saves the sequence data for a given pass to the database.
getCommand($cmd)
Retrieves the ilCtrl command.
Class ilTestSubmissionReviewGUI.
static getJSLocation($a_js_name, $a_js_location="", $add_version=FALSE)
get full javascript file name (path inclusive) of current user
static redirect($a_script)
http redirect to other script
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
static initConnectionWithAnimation()
Init YUI Connection module.
static initjQuery($a_tpl=null)
Init jQuery.