4 require_once
'./Modules/Test/classes/class.ilTestPlayerAbstractGUI.php';
34 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
37 $ilTabs = $DIC[
'ilTabs'];
41 $ilTabs->clearTargets();
43 $cmd = $this->ctrl->getCmd();
44 $next_class = $this->ctrl->getNextClass($this);
46 $this->ctrl->saveParameter($this,
"sequence");
47 $this->ctrl->saveParameter($this,
"pmode");
48 $this->ctrl->saveParameter($this,
"active_id");
52 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
54 $this->object->getKioskMode()
56 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
58 $this->object->getTitle()
60 $instance_name = $DIC[
'ilSetting']->get(
'short_inst_name');
61 if (trim($instance_name) ===
'') {
62 $instance_name =
'ILIAS';
64 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
78 $this->testSequence = $testSequenceFactory->getSequenceByTestSession($this->testSession);
79 $this->testSequence->loadFromDb();
80 $this->testSequence->loadQuestions();
91 switch ($next_class) {
92 case 'ilassquestionpagegui':
98 $ret = $this->ctrl->forwardCommand($page_gui);
101 case 'iltestsubmissionreviewgui':
106 $ret = $this->ctrl->forwardCommand($gui);
109 case 'ilassquestionhintrequestgui':
112 $questionGUI = $this->
object->createQuestionGUI(
114 $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement())
118 $questionGUI->object->getId(),
119 $this->testSession->getActiveId(),
120 $this->testSession->getPass()
128 $ret = $this->ctrl->forwardCommand($gui);
132 case 'iltestsignaturegui':
136 $ret = $this->ctrl->forwardCommand($gui);
139 case 'iltestpasswordprotectiongui':
143 $ret = $this->ctrl->forwardCommand($gui);
151 if (strtolower($cmd) ===
'showquestion') {
153 $testPassesSelector->setActiveId($this->testSession->getActiveId());
154 $testPassesSelector->setLastFinishedPass($this->testSession->getLastFinishedPass());
156 if (!$testPassesSelector->openPassExists()) {
157 $this->tpl->setOnScreenMessage(
'info', $this->lng->txt(
'tst_pass_finished'),
true);
158 $this->ctrl->redirectByClass(
"ilobjtestgui",
"infoScreen");
163 $ret = &$this->$cmd();
177 $this->testSession->setUserId(
$ilUser->getId());
178 $this->testSession->setAnonymousId(
$_SESSION[
"tst_access_code"][$this->object->getTestId()]);
180 $this->testSession->saveToDb();
182 $active_id = $this->testSession->getActiveId();
183 $this->ctrl->setParameter($this,
"active_id", $active_id);
185 $shuffle = $this->
object->getShuffleQuestions();
186 if ($this->object->isRandomTest()) {
189 $this->
object->loadQuestions();
193 assQuestion::_updateTestPassResults(
195 $this->testSession->getPass(),
196 $this->
object->areObligationsEnabled(),
202 if (!$this->testSequence->hasSequence()) {
203 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
204 $this->testSequence->saveToDb();
207 $this->testSequence->loadFromDb();
208 $this->testSequence->loadQuestions();
210 if ($this->testSession->isObjectiveOriented()) {
213 $objectivesAdapter->notifyTestStart($this->testSession, $this->object->getId());
214 $objectivesAdapter->prepareTestPass($this->testSession, $this->testSequence);
216 $objectivesAdapter->buildQuestionRelatedObjectiveList(
218 $this->questionRelatedObjectivesList
221 if ($this->testSequence->hasOptionalQuestions()) {
224 $this->testSequence->reorderOptionalQuestionsToSequenceEnd();
225 $this->testSequence->saveToDb();
229 $active_time_id = $this->
object->startWorkingTime(
230 $this->testSession->getActiveId(),
231 $this->testSession->getPass()
233 $_SESSION[
"active_time_id"] = $active_time_id;
237 $sequenceElement = $this->testSequence->getFirstSequence();
239 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
240 $this->ctrl->setParameter($this,
'pmode',
'');
242 if ($this->object->getListOfQuestionsStart()) {
259 if ($sequenceElement ===
false) {
263 if ($sequenceElement < 1) {
267 if (!$this->testSequence->getPositionOfSequence($sequenceElement)) {
277 $help = $DIC->help();
278 $help->setScreenIdComponent(
"tst");
279 $help->setScreenId(
"assessment");
280 $help->setSubScreenId(
"question");
284 $_SESSION[
"active_time_id"] = $this->
object->startWorkingTime(
285 $this->testSession->getActiveId(),
286 $this->testSession->getPass()
292 $sequenceElement = $this->testSequence->getFirstSequence();
295 $this->testSession->setLastSequence($sequenceElement);
296 $this->testSession->saveToDb();
299 $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
301 if (!(
int) $questionId && $this->testSession->isObjectiveOriented()) {
305 if (!$this->testSequence->isQuestionPresented($questionId)) {
306 $this->testSequence->setQuestionPresented($questionId);
307 $this->testSequence->saveToDb();
311 $this->testSession->getActiveId(),
313 $this->testSession->getPass()
319 $instantResponse =
true;
323 if ($this->object->isInstantFeedbackAnswerFixationEnabled()) {
324 $instantResponse =
false;
337 $questionGui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequenceElement));
338 $questionGui->setQuestionCount($this->testSequence->getUserQuestionCount());
341 $headerBlockBuilder->setHeaderMode($this->object->getTitleOutput());
342 $headerBlockBuilder->setQuestionTitle($questionGui->object->getTitle());
343 $headerBlockBuilder->setQuestionPoints($questionGui->object->getPoints());
344 $headerBlockBuilder->setQuestionPosition($this->testSequence->getPositionOfSequence($sequenceElement));
345 $headerBlockBuilder->setQuestionCount($this->testSequence->getUserQuestionCount());
346 $headerBlockBuilder->setQuestionPostponed($this->testSequence->isPostponedQuestion($questionId));
347 $headerBlockBuilder->setQuestionObligatory(
350 if ($this->testSession->isObjectiveOriented()) {
352 $objectivesAdapter->buildQuestionRelatedObjectiveList($this->testSequence, $this->questionRelatedObjectivesList);
353 $this->questionRelatedObjectivesList->loadObjectivesTitles();
355 $objectivesString = $this->questionRelatedObjectivesList->getQuestionRelatedObjectiveTitles($questionId);
356 $headerBlockBuilder->setQuestionRelatedObjectives($objectivesString);
358 $questionGui->setQuestionHeaderBlockBuilder($headerBlockBuilder);
360 $this->
prepareTestPage($presentationMode, $sequenceElement, $questionId);
363 $navigationToolbarGUI->setFinishTestButtonEnabled(
true);
367 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
368 $this->ctrl->setParameter($this,
'pmode', $presentationMode);
371 switch ($presentationMode) {
375 $navigationToolbarGUI->setDisabledStateEnabled(
false);
377 $this->
showQuestionEditable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
383 if ($this->testSequence->isQuestionOptional($questionGui->object->getId())) {
387 $this->
showQuestionViewable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
393 require_once
'Modules/Test/exceptions/class.ilTestException.php';
398 $navigationToolbarGUI->build();
405 if ($instantResponse) {
430 if ($this->object->isForceInstantFeedbackEnabled()) {
435 $questionId = $this->testSequence->getQuestionForSequence(
444 $nextSequenceElement = $this->testSequence->getFirstSequence();
447 $this->testSession->setLastSequence($nextSequenceElement);
448 $this->testSession->saveToDb();
450 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
451 $this->ctrl->setParameter($this,
'pmode',
'');
460 $questionId = $this->testSequence->getQuestionForSequence(
466 if ($this->object->isForceInstantFeedbackEnabled()) {
467 $this->ctrl->setParameter($this,
'instresp', 1);
469 $this->testSequence->setQuestionChecked($questionId);
470 $this->testSequence->saveToDb();
476 $this->ctrl->setParameter($this,
'pmode',
'');
495 $this->ctrl->saveParameter($this,
'sequence');
506 $this->testSequence->getQuestionForSequence($currentSequenceElement)
509 $currentQuestionOBJ->resetUsersAnswer(
510 $this->testSession->getActiveId(),
511 $this->testSession->getPass()
514 $this->ctrl->saveParameter($this,
'sequence');
524 $nextSequenceElement = $this->testSequence->getNextSequence($curSequenceElement);
527 $nextSequenceElement = $this->testSequence->getFirstSequence();
530 if ($this->object->isPostponingEnabled()) {
531 $this->testSequence->postponeSequence($curSequenceElement);
532 $this->testSequence->saveToDb();
535 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
536 $this->ctrl->setParameter($this,
'pmode',
'');
543 $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
546 $this->testSession->getActiveId(),
548 $this->testSession->getPass()
551 if (!$isQuestionWorkedThrough) {
552 $this->testSequence->postponeQuestion($questionId);
553 $this->testSequence->saveToDb();
560 $nextSequenceElement = $this->testSequence->getNextSequence($lastSequenceElement);
562 if ($this->object->isPostponingEnabled()) {
567 $nextSequenceElement = $this->testSequence->getFirstSequence();
570 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
571 $this->ctrl->setParameter($this,
'pmode',
'');
578 $sequenceElement = $this->testSequence->getPreviousSequence(
583 $sequenceElement = $this->testSequence->getLastSequence();
586 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
587 $this->ctrl->setParameter($this,
'pmode',
'');
594 return $sequenceElement == $this->testSequence->getFirstSequence();
599 return $sequenceElement == $this->testSequence->getLastSequence();
617 return $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
626 $this->saveResult =
false;
628 $formtimestamp =
$_POST[
"formtimestamp"];
629 if (strlen($formtimestamp) == 0) {
630 $formtimestamp =
$_GET[
"formtimestamp"];
632 if ($formtimestamp !=
$_SESSION[
"formtimestamp"]) {
633 $_SESSION[
"formtimestamp"] = $formtimestamp;
651 $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
658 if (is_numeric($q_id) && (
int) $q_id) {
661 $active_id = $this->testSession->getActiveId();
662 if ($this->object->isRandomTest()) {
665 $this->saveResult = $questionOBJ->persistWorkingState(
668 $this->object->areObligationsEnabled(),
672 if ($authorized && $this->testSession->isObjectiveOriented()) {
674 $objectivesAdapter->updateQuestionResult($this->testSession, $questionOBJ);
677 if ($authorized && $this->object->isSkillServiceToBeConsidered()) {
683 if ($this->saveResult ==
false || (!$questionOBJ->validateSolutionSubmit() && $questionOBJ->savePartial())) {
684 $this->ctrl->setParameter($this,
"save_error",
"1");
693 $questionId = $this->testSequence->getQuestionForSequence(
704 $this->testSequence->setQuestionChecked($questionId);
705 $this->testSequence->saveToDb();
706 } elseif ($this->object->isForceInstantFeedbackEnabled()) {
707 $this->testSequence->setQuestionChecked($questionId);
708 $this->testSequence->saveToDb();
711 $this->ctrl->setParameter($this,
'instresp', 1);
724 $questionId = $this->testSequence->getQuestionForSequence(
741 if ($this->testSession->getActiveId() > 0) {
742 if ($this->testSequence->hasRandomQuestionsForPass($this->testSession->getActiveId(), $this->testSession->getPass()) > 0) {
747 $ilLog = $DIC[
'ilLog'];
751 __METHOD__ .
' Random Questions allready exists for user ' .
752 $ilUser->getId() .
' in test ' . $this->
object->getTestId()
761 $ilLog = $DIC[
'ilLog'];
764 $ilLog->write(__METHOD__ .
' ' . sprintf(
765 $this->lng->txt(
"error_random_question_generation"),
767 $this->
object->getTestId()
779 $tree = $DIC[
'tree'];
780 $ilDB = $DIC[
'ilDB'];
781 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
783 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php';
785 $questionSetConfig->loadFromDb();
787 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
790 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
792 $sourcePoolDefinitionList->loadDefinitions();
794 $this->processLocker->executeRandomPassBuildOperation(
function () use (
$ilDB, $ilPluginAdmin, $questionSetConfig, $sourcePoolDefinitionList) {
796 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
799 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
802 $questionSetBuilder->performBuild($this->testSession);
804 }, $sourcePoolDefinitionList->hasTaxonomyFilters());
814 $active_id = $this->testSession->getActiveId();
815 $this->ctrl->setParameter($this,
"active_id", $active_id);
817 $active_time_id = $this->
object->startWorkingTime($active_id, $this->testSession->getPass());
818 $_SESSION[
"active_time_id"] = $active_time_id;
821 if ($this->object->isRandomTest()) {
822 if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass())) {
828 $shuffle = $this->
object->getShuffleQuestions();
829 if ($this->object->isRandomTest()) {
833 assQuestion::_updateTestPassResults(
835 $this->testSession->getPass(),
836 $this->
object->areObligationsEnabled(),
842 if (!$this->testSequence->hasSequence()) {
843 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
844 $this->testSequence->saveToDb();
847 if ($this->object->getListOfQuestionsStart()) {
851 $this->ctrl->setParameter($this,
'sequence', $this->testSession->getLastSequence());
852 $this->ctrl->setParameter($this,
'pmode',
'');
858 return $this->testSequence->isPostponedQuestion($questionId);
864 $ilDB = $DIC[
'ilDB'];
873 $userSolutionAdopter->setUserId(
$ilUser->getId());
874 $userSolutionAdopter->setActiveId($this->testSession->getActiveId());
875 $userSolutionAdopter->setTargetPass($this->testSequence->getPass());
876 $userSolutionAdopter->setQuestionIds($this->testSequence->getOptionalQuestions());
878 $userSolutionAdopter->perform();
885 if ($this->testSequence->isAnsweringOptionalQuestionsConfirmed()) {
889 $questionId = $this->testSequence->getQuestionForSequence($sequenceKey);
891 if (!$this->testSequence->isQuestionOptional($questionId)) {
905 ilUtil::sendFailure(sprintf($this->lng->txt(
'tst_objective_oriented_test_pass_without_questions'), $this->
object->getTitle()),
true);
915 $isNextPrimary =
true;
917 if ($this->object->isForceInstantFeedbackEnabled()) {
918 $isNextPrimary =
false;
922 $this->testSession->getActiveId(),
923 $this->testSession->getPass(),
924 $this->testSequence->getOrderedSequenceQuestions()
927 if (!count($questionsMissingResult)) {
929 $isNextPrimary =
false;
930 } elseif (count($questionsMissingResult) == 1) {
931 $lastOpenQuestion = current($questionsMissingResult);
933 if ($currentQuestionId == $lastOpenQuestion) {
935 $isNextPrimary =
false;
939 return $isNextPrimary;
isShowingPostponeStatusReguired($questionId)
checkTestSessionUser(ilTestSession $testSession)
isValidSequenceElement($sequenceElement)
isQuestionSummaryFinishTestButtonRequired()
getQuestionGuiInstance($question_id, $fromCache=true)
removeIntermediateSolution()
remove an auto-saved solution of the current question
populateQuestionOptionalMessage()
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.
static getQuestionsMissingResultRecord($activeId, $pass, $questionIds)
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
getObjectiveOrientedContainer()
Output class for assessment test execution.
static _updateStatus($a_obj_id, $a_usr_id, $a_obj=null, $a_percentage=false, $a_force_raise=false)
Update status.
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not ...
handleTearsAndAngerNoObjectiveOrientedQuestion()
submitSolutionAndNextCmd()
getNextCommandParameter()
isLastQuestionInSequence($sequenceElement)
isFirstQuestionInSequence($sequenceElement)
executeCommand()
Execute Command.
handleQuestionActionCmd()
resumePlayerCmd()
Resume a test at the last position.
handleUserSettings()
Handles some form parameters on starting and resuming a test.
Base Exception for all Exceptions relating to Modules/Test.
prepareTestPage($presentationMode, $sequenceElement, $questionId)
unregisterForcedFeedbackNavUrl()
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
isNrOfTriesReached()
nr of tries exceeded
ensureExistingTestSession(ilTestSession $testSession)
populateQuestionNavigation($sequenceElement, $disabled, $primaryNext)
static getInstance(ilTestSession $a_test_session)
isForcedFeedbackNavUrlRegistered()
static _enabledAssessmentLogging()
check wether assessment logging is enabled or not
getInstantResponseParameter()
isOptionalQuestionAnsweringConfirmationRequired($sequenceKey)
static _isWorkedThrough($active_id, $question_id, $pass=null)
Returns true if the question was worked through in the given pass Worked through means that the user ...
handleSkillTriggering(ilTestSession $testSession)
Class ilTestSubmissionReviewGUI.
handleQuestionPostponing($sequenceElement)
getRegisteredForcedFeedbackNavUrl()
getCommand($cmd)
Retrieves the ilCtrl command.
const PRESENTATION_MODE_EDIT
saveNavigationPreventConfirmation()
Save the save the switch to prevent the navigation confirmation.
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbarGUI)
static getInstance(ilDBInterface $db, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
const TEST_PLAYER_KIOSK_MODE_ENABLED
handlePrimaryButton(ilTestNavigationToolbarGUI $navigationToolbarGUI, $currentQuestionId)
getAnswerChangedParameter()
Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationContr...
Basic GUI class for assessment questions.
const PRESENTATION_MODE_VIEW
const SUBMIT_INTERMEDIATE_SOLUTION
initProcessLocker($activeId)
updateLearningProgressOnTestStart()
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
handlePasswordProtectionRedirect()
registerForcedFeedbackNavUrl($forcedFeedbackNavUrl)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
performTearsAndAngerBrokenConfessionChecks()
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
$questionRelatedObjectivesList
generateRandomTestPassForActiveUser()
populateInstantResponseModal(assQuestionGUI $questionGui, $navUrl)
const TEST_PLAYER_SHORT_TITLE
getNextSequenceParameter()
getNavigationUrlParameter()
getQuestionInstance($questionId, $fromCache=true)
handleTearsAndAngerQuestionIsNull($questionId, $sequenceElement)
isMaxProcessingTimeReached()
Checks wheather the maximum processing time is reached or not.
getCurrentSequenceElement()
static redirect($a_script)
getTestNavigationToolbarGUI()
static initConnectionWithAnimation()
Init YUI Connection module.
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
adoptUserSolutionsFromPreviousPass()
static isTestExecutionCommand($cmd)
isParticipantsAnswerFixed($questionId)
Output class for assessment test execution.