4 require_once
'./Modules/Test/classes/class.ilTestPlayerAbstractGUI.php';
34 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
36 $ilTabs = $DIC[
'ilTabs'];
40 $ilTabs->clearTargets();
42 $cmd = $this->ctrl->getCmd();
43 $next_class = $this->ctrl->getNextClass($this);
45 $this->ctrl->saveParameter($this,
"sequence");
46 $this->ctrl->saveParameter($this,
"pmode");
47 $this->ctrl->saveParameter($this,
"active_id");
51 $DIC->globalScreen()->tool()->context()->current()->addAdditionalData(
53 $this->object->getKioskMode()
65 $this->testSequence = $testSequenceFactory->getSequenceByTestSession($this->testSession);
66 $this->testSequence->loadFromDb();
67 $this->testSequence->loadQuestions();
69 require_once
'Modules/Test/classes/class.ilTestQuestionRelatedObjectivesList.php';
72 include_once
'Services/jQuery/classes/class.iljQueryUtil.php';
74 include_once
"./Services/YUI/classes/class.ilYuiUtil.php";
81 switch ($next_class) {
82 case 'ilassquestionpagegui':
88 require_once
"./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php";
90 $ret = $this->ctrl->forwardCommand($page_gui);
93 case 'iltestsubmissionreviewgui':
97 require_once
'./Modules/Test/classes/class.ilTestSubmissionReviewGUI.php';
100 $ret = $this->ctrl->forwardCommand($gui);
103 case 'ilassquestionhintrequestgui':
107 $questionGUI = $this->
object->createQuestionGUI(
109 $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement())
112 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
114 $questionGUI->object->getId(),
115 $this->testSession->getActiveId(),
116 $this->testSession->getPass()
119 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
125 $ret = $this->ctrl->forwardCommand($gui);
129 case 'iltestsignaturegui':
133 require_once
'./Modules/Test/classes/class.ilTestSignatureGUI.php';
135 $ret = $this->ctrl->forwardCommand($gui);
138 case 'iltestpasswordprotectiongui':
142 require_once
'Modules/Test/classes/class.ilTestPasswordProtectionGUI.php';
144 $ret = $this->ctrl->forwardCommand($gui);
154 $ret = &$this->$cmd();
168 $this->testSession->setUserId(
$ilUser->getId());
169 $this->testSession->setAnonymousId(
$_SESSION[
"tst_access_code"][$this->object->getTestId()]);
171 $this->testSession->saveToDb();
173 $active_id = $this->testSession->getActiveId();
174 $this->ctrl->setParameter($this,
"active_id", $active_id);
176 $shuffle = $this->
object->getShuffleQuestions();
177 if ($this->object->isRandomTest()) {
180 $this->
object->loadQuestions();
184 assQuestion::_updateTestPassResults(
186 $this->testSession->getPass(),
187 $this->
object->areObligationsEnabled(),
193 if (!$this->testSequence->hasSequence()) {
194 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
195 $this->testSequence->saveToDb();
198 $this->testSequence->loadFromDb();
199 $this->testSequence->loadQuestions();
201 if ($this->testSession->isObjectiveOriented()) {
202 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
205 $objectivesAdapter->notifyTestStart($this->testSession, $this->object->getId());
206 $objectivesAdapter->prepareTestPass($this->testSession, $this->testSequence);
208 $objectivesAdapter->buildQuestionRelatedObjectiveList(
210 $this->questionRelatedObjectivesList
213 if ($this->testSequence->hasOptionalQuestions()) {
216 $this->testSequence->reorderOptionalQuestionsToSequenceEnd();
217 $this->testSequence->saveToDb();
221 $active_time_id = $this->
object->startWorkingTime(
222 $this->testSession->getActiveId(),
223 $this->testSession->getPass()
225 $_SESSION[
"active_time_id"] = $active_time_id;
229 $sequenceElement = $this->testSequence->getFirstSequence();
231 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
232 $this->ctrl->setParameter($this,
'pmode',
'');
234 if ($this->object->getListOfQuestionsStart()) {
246 require_once(
'./Modules/Test/classes/class.ilObjTestAccess.php');
247 require_once(
'./Services/Tracking/classes/class.ilLPStatusWrapper.php');
253 if ($sequenceElement ===
false) {
257 if ($sequenceElement < 1) {
261 if (!$this->testSequence->getPositionOfSequence($sequenceElement)) {
272 $_SESSION[
"active_time_id"] = $this->
object->startWorkingTime(
273 $this->testSession->getActiveId(),
274 $this->testSession->getPass()
280 $sequenceElement = $this->testSequence->getFirstSequence();
283 $this->testSession->setLastSequence($sequenceElement);
284 $this->testSession->saveToDb();
287 $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
289 if (!(
int) $questionId && $this->testSession->isObjectiveOriented()) {
293 if (!$this->testSequence->isQuestionPresented($questionId)) {
294 $this->testSequence->setQuestionPresented($questionId);
295 $this->testSequence->saveToDb();
299 $this->testSession->getActiveId(),
301 $this->testSession->getPass()
307 $instantResponse =
true;
311 if ($this->object->isInstantFeedbackAnswerFixationEnabled()) {
312 $instantResponse =
false;
325 $questionGui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequenceElement));
326 $questionGui->setQuestionCount($this->testSequence->getUserQuestionCount());
328 require_once
'Modules/Test/classes/class.ilTestQuestionHeaderBlockBuilder.php';
330 $headerBlockBuilder->setHeaderMode($this->object->getTitleOutput());
331 $headerBlockBuilder->setQuestionTitle($questionGui->object->getTitle());
332 $headerBlockBuilder->setQuestionPoints($questionGui->object->getPoints());
333 $headerBlockBuilder->setQuestionPosition($this->testSequence->getPositionOfSequence($sequenceElement));
334 $headerBlockBuilder->setQuestionCount($this->testSequence->getUserQuestionCount());
335 $headerBlockBuilder->setQuestionPostponed($this->testSequence->isPostponedQuestion($questionId));
336 $headerBlockBuilder->setQuestionObligatory(
339 if ($this->testSession->isObjectiveOriented()) {
340 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
342 $objectivesAdapter->buildQuestionRelatedObjectiveList($this->testSequence, $this->questionRelatedObjectivesList);
343 $this->questionRelatedObjectivesList->loadObjectivesTitles();
345 $objectivesString = $this->questionRelatedObjectivesList->getQuestionRelatedObjectiveTitles($questionId);
346 $headerBlockBuilder->setQuestionRelatedObjectives($objectivesString);
348 $questionGui->setQuestionHeaderBlockBuilder($headerBlockBuilder);
350 $this->
prepareTestPage($presentationMode, $sequenceElement, $questionId);
353 $navigationToolbarGUI->setFinishTestButtonEnabled(
true);
357 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
358 $this->ctrl->setParameter($this,
'pmode', $presentationMode);
361 switch ($presentationMode) {
365 $navigationToolbarGUI->setDisabledStateEnabled(
false);
367 $this->
showQuestionEditable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
373 if ($this->testSequence->isQuestionOptional($questionGui->object->getId())) {
377 $this->
showQuestionViewable($questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse);
383 require_once
'Modules/Test/exceptions/class.ilTestException.php';
387 $navigationToolbarGUI->build();
394 if ($instantResponse) {
419 if ($this->object->isForceInstantFeedbackEnabled()) {
424 $questionId = $this->testSequence->getQuestionForSequence(
433 $nextSequenceElement = $this->testSequence->getFirstSequence();
436 $this->testSession->setLastSequence($nextSequenceElement);
437 $this->testSession->saveToDb();
439 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
440 $this->ctrl->setParameter($this,
'pmode',
'');
449 $questionId = $this->testSequence->getQuestionForSequence(
455 if ($this->object->isForceInstantFeedbackEnabled()) {
456 $this->ctrl->setParameter($this,
'instresp', 1);
458 $this->testSequence->setQuestionChecked($questionId);
459 $this->testSequence->saveToDb();
465 $this->ctrl->setParameter($this,
'pmode',
'');
484 $this->ctrl->saveParameter($this,
'sequence');
495 $this->testSequence->getQuestionForSequence($currentSequenceElement)
498 $currentQuestionOBJ->resetUsersAnswer(
499 $this->testSession->getActiveId(),
500 $this->testSession->getPass()
503 $this->ctrl->saveParameter($this,
'sequence');
513 $nextSequenceElement = $this->testSequence->getNextSequence($curSequenceElement);
516 $nextSequenceElement = $this->testSequence->getFirstSequence();
519 if ($this->object->isPostponingEnabled()) {
520 $this->testSequence->postponeSequence($curSequenceElement);
521 $this->testSequence->saveToDb();
524 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
525 $this->ctrl->setParameter($this,
'pmode',
'');
532 $questionId = $this->testSequence->getQuestionForSequence($sequenceElement);
535 $this->testSession->getActiveId(),
537 $this->testSession->getPass()
540 if (!$isQuestionWorkedThrough) {
541 $this->testSequence->postponeQuestion($questionId);
542 $this->testSequence->saveToDb();
549 $nextSequenceElement = $this->testSequence->getNextSequence($lastSequenceElement);
551 if ($this->object->isPostponingEnabled()) {
556 $nextSequenceElement = $this->testSequence->getFirstSequence();
559 $this->ctrl->setParameter($this,
'sequence', $nextSequenceElement);
560 $this->ctrl->setParameter($this,
'pmode',
'');
567 $sequenceElement = $this->testSequence->getPreviousSequence(
572 $sequenceElement = $this->testSequence->getLastSequence();
575 $this->ctrl->setParameter($this,
'sequence', $sequenceElement);
576 $this->ctrl->setParameter($this,
'pmode',
'');
583 return $sequenceElement == $this->testSequence->getFirstSequence();
588 return $sequenceElement == $this->testSequence->getLastSequence();
606 return $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
615 $this->saveResult =
false;
617 $formtimestamp =
$_POST[
"formtimestamp"];
618 if (strlen($formtimestamp) == 0) {
619 $formtimestamp =
$_GET[
"formtimestamp"];
621 if ($formtimestamp !=
$_SESSION[
"formtimestamp"]) {
622 $_SESSION[
"formtimestamp"] = $formtimestamp;
640 $q_id = $this->testSequence->getQuestionForSequence(
$_GET[
"sequence"]);
647 if (is_numeric($q_id) && (
int) $q_id) {
650 $active_id = $this->testSession->getActiveId();
651 if ($this->object->isRandomTest()) {
654 $this->saveResult = $questionOBJ->persistWorkingState(
657 $this->object->areObligationsEnabled(),
661 if ($authorized && $this->testSession->isObjectiveOriented()) {
662 require_once
'Modules/Course/classes/Objectives/class.ilLOTestQuestionAdapter.php';
664 $objectivesAdapter->updateQuestionResult($this->testSession, $questionOBJ);
667 if ($authorized && $this->object->isSkillServiceToBeConsidered()) {
673 if ($this->saveResult ==
false || (!$questionOBJ->validateSolutionSubmit() && $questionOBJ->savePartial())) {
674 $this->ctrl->setParameter($this,
"save_error",
"1");
683 $questionId = $this->testSequence->getQuestionForSequence(
694 $this->testSequence->setQuestionChecked($questionId);
695 $this->testSequence->saveToDb();
696 } elseif ($this->object->isForceInstantFeedbackEnabled()) {
697 $this->testSequence->setQuestionChecked($questionId);
698 $this->testSequence->saveToDb();
701 $this->ctrl->setParameter($this,
'instresp', 1);
714 $questionId = $this->testSequence->getQuestionForSequence(
731 if ($this->testSession->getActiveId() > 0) {
732 if ($this->testSequence->hasRandomQuestionsForPass($this->testSession->getActiveId(), $this->testSession->getPass()) > 0) {
741 __METHOD__ .
' Random Questions allready exists for user ' .
742 $ilUser->getId() .
' in test ' . $this->
object->getTestId()
754 $ilLog->write(__METHOD__ .
' ' . sprintf(
755 $this->lng->txt(
"error_random_question_generation"),
757 $this->
object->getTestId()
769 $tree = $DIC[
'tree'];
770 $ilDB = $DIC[
'ilDB'];
771 $ilPluginAdmin = $DIC[
'ilPluginAdmin'];
773 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetConfig.php';
775 $questionSetConfig->loadFromDb();
777 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionFactory.php';
780 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetSourcePoolDefinitionList.php';
782 $sourcePoolDefinitionList->loadDefinitions();
784 $this->processLocker->executeRandomPassBuildOperation(
function () use (
$ilDB, $ilPluginAdmin, $questionSetConfig, $sourcePoolDefinitionList) {
786 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetStagingPoolQuestionList.php';
789 require_once
'Modules/Test/classes/class.ilTestRandomQuestionSetBuilder.php';
792 $questionSetBuilder->performBuild($this->testSession);
794 }, $sourcePoolDefinitionList->hasTaxonomyFilters());
804 $active_id = $this->testSession->getActiveId();
805 $this->ctrl->setParameter($this,
"active_id", $active_id);
807 $active_time_id = $this->
object->startWorkingTime($active_id, $this->testSession->getPass());
808 $_SESSION[
"active_time_id"] = $active_time_id;
811 if ($this->object->isRandomTest()) {
812 if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->testSession->getPass())) {
818 $shuffle = $this->
object->getShuffleQuestions();
819 if ($this->object->isRandomTest()) {
823 assQuestion::_updateTestPassResults(
825 $this->testSession->getPass(),
826 $this->
object->areObligationsEnabled(),
832 if (!$this->testSequence->hasSequence()) {
833 $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
834 $this->testSequence->saveToDb();
837 if ($this->object->getListOfQuestionsStart()) {
841 $this->ctrl->setParameter($this,
'sequence', $this->testSession->getLastSequence());
842 $this->ctrl->setParameter($this,
'pmode',
'');
848 return $this->testSequence->isPostponedQuestion($questionId);
854 $ilDB = $DIC[
'ilDB'];
859 include_once(
"./Modules/Test/classes/class.ilObjAssessmentFolder.php");
862 require_once
'Modules/TestQuestionPool/classes/class.ilAssQuestionUserSolutionAdopter.php';
865 $userSolutionAdopter->setUserId(
$ilUser->getId());
866 $userSolutionAdopter->setActiveId($this->testSession->getActiveId());
867 $userSolutionAdopter->setTargetPass($this->testSequence->getPass());
868 $userSolutionAdopter->setQuestionIds($this->testSequence->getOptionalQuestions());
870 $userSolutionAdopter->perform();
877 if ($this->testSequence->isAnsweringOptionalQuestionsConfirmed()) {
881 $questionId = $this->testSequence->getQuestionForSequence($sequenceKey);
883 if (!$this->testSequence->isQuestionOptional($questionId)) {
897 ilUtil::sendFailure(sprintf($this->lng->txt(
'tst_objective_oriented_test_pass_without_questions'), $this->
object->getTitle()),
true);
907 $isNextPrimary =
true;
909 if ($this->object->isForceInstantFeedbackEnabled()) {
910 $isNextPrimary =
false;
914 $this->testSession->getActiveId(),
915 $this->testSession->getPass(),
916 $this->testSequence->getOrderedSequenceQuestions()
919 if (!count($questionsMissingResult)) {
921 $isNextPrimary =
false;
922 } elseif (count($questionsMissingResult) == 1) {
923 $lastOpenQuestion = current($questionsMissingResult);
925 if ($currentQuestionId == $lastOpenQuestion) {
927 $isNextPrimary =
false;
931 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)
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.