ILIAS  release_9 Revision v9.13-25-g2c18ec4c24f
ilTestOutputGUI Class Reference

Output class for assessment test execution. More...

+ Inheritance diagram for ilTestOutputGUI:
+ Collaboration diagram for ilTestOutputGUI:

Public Member Functions

 executeCommand ()
 Execute Command. More...
 
 saveQuestionSolution ($authorized=true, $force=false)
 saves the user input of a question More...
 
- Public Member Functions inherited from ilTestPlayerAbstractGUI
 __construct (ilObjTest $object)
 
 saveTagsCmd ()
 Save tags for tagging gui. More...
 
 updateWorkingTime ()
 updates working time and stores state saveresult to see if question has to be stored or not More...
 
 removeIntermediateSolution ()
 
 saveQuestionSolution ($authorized=true, $force=false)
 saves the user input of a question More...
 
 suspendTestCmd ()
 
 isMaxProcessingTimeReached ()
 
 setAnonymousIdCmd ()
 Sets a session variable with the test access code for an anonymous test user. More...
 
 getLockParameter ()
 
 displayAccessCodeCmd ()
 
 accessCodeConfirmedCmd ()
 
 handleUserSettings ()
 Handles some form parameters on starting and resuming a test. More...
 
 redirectAfterAutosaveCmd ()
 Redirect the user after an automatic save when the time limit is reached. More...
 
 redirectAfterQuestionListCmd ()
 
 autosaveCmd ()
 Automatically save a user answer while working on the test (called repeatedly by asynchronous posts in configured autosave interval) More...
 
 autosaveOnTimeLimitCmd ()
 Automatically save a user answer when the limited duration of a test run is reached (called by synchronous form submit when the remaining time count down reaches zero) More...
 
 finishTestCmd ()
 
 buildFinishTestModal ()
 
 redirectBackCmd ()
 
 showFinalStatementCmd ()
 
 checkOnlineTestAccess ()
 
 isTestAccessible ()
 test accessible returns true if the user can perform the test More...
 
 isNrOfTriesReached ()
 nr of tries exceeded More...
 
 endingTimeReached ()
 handle endingTimeReached More...
 
 maxProcessingTimeReached ()
 Outputs a message when the maximum processing time is reached. More...
 
 confirmSubmitAnswers ()
 confirm submit results if confirm then results are submitted and the screen will be redirected to the startpage of the test public More...
 
 checkWorkingTimeCmd ()
 This is asynchronously called by tpl.workingtime.js to check for changes in the user's processing time for a test. More...
 
 outQuestionSummaryCmd (bool $obligations_info=false, bool $obligations_filter=false)
 Output of a summary of all test questions for test participants. More...
 
 outQuestionSummaryWithObligationsInfoCmd ()
 
 outObligationsOnlySummaryCmd ()
 
 backFromFinishingCmd ()
 
 outCorrectSolution ()
 Creates an output of the solution of an answer compared to the correct solution. More...
 
 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 will be shown) More...
 
 getContentBlockName ()
 Returns the name of the current content block (depends on the kiosk mode setting) More...
 
 outUserResultsOverviewCmd ()
 
- Public Member Functions inherited from ilTestServiceGUI
 isContextResultPresentation ()
 
 setContextResultPresentation (bool $contextResultPresentation)
 
 setParticipantData (ilTestParticipantData $participantData)
 
 getParticipantData ()
 
 getPassOverviewTableData (ilTestSession $testSession, $passes, $withResults)
 This method uses the data of a given test pass to create an evaluation for displaying into a table used in the ilTestEvaluationGUI. More...
 
 setObjectiveOrientedContainer (ilTestObjectiveOrientedContainer $objective_oriented_container)
 
 getObjectiveOrientedContainer ()
 
 executeCommand ()
 execute command More...
 
 getCommand ($cmd)
 Retrieves the ilCtrl command. More...
 
 buildPassOverviewTableGUI (ilTestEvaluationGUI $target_gui)
 
 getPassListOfAnswers (&$result_array, $active_id, $pass, $show_solutions=false, $only_answered_questions=false, $show_question_only=false, $show_reached_points=false, $anchorNav=false, ilTestQuestionRelatedObjectivesList $objectives_list=null, ilTestResultHeaderLabelBuilder $testResultHeaderLabelBuilder=null)
 Returns the list of answers of a users test pass. More...
 
 getPassListOfAnswersWithScoring (&$result_array, $active_id, $pass, $show_solutions=false)
 Returns the list of answers of a users test pass and offers a scoring option. More...
 
 getResultsSignature ()
 Returns HTML code for a signature field. More...
 
 getAdditionalUsrDataHtmlAndPopulateWindowTitle ($testSession, $active_id, $overwrite_anonymity=false)
 Returns the user data for a test results output. More...
 
 getCorrectSolutionOutput ($question_id, $active_id, $pass, ilTestQuestionRelatedObjectivesList $objectives_list=null)
 Returns an output of the solution to an answer compared to the correct solution. More...
 
 getResultsOfUserOutput (ilTestSession $testSession, int $active_id, int $pass, ilParticipantsTestResultsGUI $target_gui, bool $show_pass_details=true, bool $show_answers=true, bool $show_question_only=false, bool $show_reached_points=false)
 Output of the pass overview for a test called by a test participant. More...
 
 getResultsHeadUserAndPass ($active_id, $pass)
 Returns the user and pass data for a test results output. More...
 
 getQuestionResultForTestUsers (int $question_id, int $test_id)
 
 getObject ()
 

Protected Member Functions

 startTestCmd ()
 
 updateLearningProgressOnTestStart ()
 
 showQuestionCmd ()
 
 editSolutionCmd ()
 
 submitSolutionAndNextCmd ()
 
 submitSolutionCmd ()
 
 discardSolutionCmd ()
 
 skipQuestionCmd ()
 
 handleQuestionPostponing ($sequence_element)
 
 handleCheckTestPassValid ()
 
 nextQuestionCmd ()
 
 previousQuestionCmd ()
 
 isFirstQuestionInSequence ($sequence_element)
 
 isLastQuestionInSequence ($sequence_element)
 
 canSaveResult ()
 Returns TRUE if the answers of the current user could be saved. More...
 
 getCurrentQuestionId ()
 
 showInstantResponseCmd ()
 
 handleQuestionActionCmd ()
 
 performTearsAndAngerBrokenConfessionChecks ()
 
 generateRandomTestPassForActiveUser ()
 
 resumePlayerCmd ()
 Resume a test at the last position. More...
 
 isShowingPostponeStatusReguired ($questionId)
 
 adoptUserSolutionsFromPreviousPass ()
 
 populateQuestionOptionalMessage ()
 
 isOptionalQuestionAnsweringConfirmationRequired ($sequenceKey)
 
 isQuestionSummaryFinishTestButtonRequired ()
 
 handleTearsAndAngerNoObjectiveOrientedQuestion ()
 
 handlePrimaryButton (ilTestNavigationToolbarGUI $navigationToolbarGUI, int $currentQuestionId)
 
 getTestPlayerTitle ()
 
- Protected Member Functions inherited from ilTestPlayerAbstractGUI
 checkReadAccess ()
 
 checkTestExecutable ()
 
 checkTestSessionUser (ilTestSession $test_session)
 
 ensureExistingTestSession (ilTestSession $test_session)
 
 initProcessLocker ($activeId)
 
 canSaveResult ()
 
 determineInlineScoreDisplay ()
 
 populateTestNavigationToolbar (ilTestNavigationToolbarGUI $toolbar_gui)
 
 populateQuestionNavigation ($sequence_element, $primary_next)
 
 populatePreviousButtons ()
 
 populateNextButtons ($primary_next)
 
 populateLowerNextButtonBlock ($primary_next)
 
 populateUpperNextButtonBlock ($primaryNext)
 
 populateLowerPreviousButtonBlock ()
 
 populateUpperPreviousButtonBlock ()
 
 populateSpecificFeedbackBlock (assQuestionGUI $question_gui)
 
 populateGenericFeedbackBlock (assQuestionGUI $question_gui, $solutionCorrect)
 
 populateScoreBlock ($reachedPoints, $maxPoints)
 
 populateSolutionBlock ($solutionoutput)
 
 populateSyntaxStyleBlock ()
 
 populateContentStyleBlock ()
 
 startPlayerCmd ()
 Start a test for the first time. More...
 
 resumePlayerCmd ()
 Resume a test at the last position. More...
 
 initTestCmd ()
 Start a test for the first time after a redirect. More...
 
 redirectAfterFinish ()
 
 getCurrentQuestionId ()
 
 detectChangesCmd ()
 Detect changes sent in the background to the server This is called by ajax from ilTestPlayerQuestionEditControl.js It is needed by Java and Flash question and eventually plgin question vtypes. More...
 
 submitIntermediateSolutionCmd ()
 
 markQuestionAndSaveIntermediateCmd ()
 
 markQuestionCmd ()
 Set a question solved. More...
 
 unmarkQuestionAndSaveIntermediateCmd ()
 
 unmarkQuestionCmd ()
 Set a question unsolved. More...
 
 performTestPassFinishedTasks ()
 
 sendNewPassFinishedNotificationEmailIfActivated (int $active_id, int $pass)
 
 afterTestPassFinishedCmd ()
 
 prepareTestPage ($sequenceElement, $questionId)
 
 isOptionalQuestionAnsweringConfirmationRequired ($sequenceElement)
 
 isShowingPostponeStatusReguired ($questionId)
 
 showQuestionViewable (assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
 
 showQuestionEditable (assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
 
 determineSolutionPassIndex (assQuestionGUI $questionGui)
 
 showQuestionCmd ()
 
 editSolutionCmd ()
 
 submitSolutionCmd ()
 
 revertChangesCmd ()
 
 discardSolutionCmd ()
 
 skipQuestionCmd ()
 
 startTestCmd ()
 
 showSideList ($current_sequence_element)
 
 isQuestionSummaryFinishTestButtonRequired ()
 
 showRequestedHintListCmd ()
 Go to requested hint list. More...
 
 confirmHintRequestCmd ()
 Go to hint request confirmation. More...
 
 isFirstQuestionInSequence ($sequenceElement)
 
 isLastQuestionInSequence ($sequenceElement)
 
 handleQuestionActionCmd ()
 
 showInstantResponseCmd ()
 
 nextQuestionCmd ()
 
 previousQuestionCmd ()
 
 prepareSummaryPage ()
 
 initTestPageTemplate ()
 
 handlePasswordProtectionRedirect ()
 
 isParticipantsAnswerFixed ($questionId)
 
 getIntroductionPageButtonLabel ()
 
 initAssessmentSettings ()
 
 handleSkillTriggering (ilTestSession $test_session)
 
 buildTestPassQuestionList ()
 
 showAnswerOptionalQuestionsConfirmation ()
 
 confirmAnswerOptionalQuestionsCmd ()
 
 cancelAnswerOptionalQuestionsCmd ()
 
 populateHelperGuiContent ($helperGui)
 
 getTestNavigationToolbarGUI ()
 
 buildReadOnlyStateQuestionNavigationGUI ($questionId)
 
 buildEditableStateQuestionNavigationGUI ($questionId)
 
 getFinishTestCommand ()
 
 populateInstantResponseModal (assQuestionGUI $questionGui, $navUrl)
 
 populateInstantResponseBlocks (assQuestionGUI $questionGui, $authorizedSolution)
 
 populateFeedbackBlockHeader ($withFocusAnchor)
 
 populateFeedbackBlockMessage (string $a_message)
 
 getCurrentSequenceElement ()
 
 getSequenceElementParameter ()
 
 getPresentationModeParameter ()
 
 getInstantResponseParameter ()
 
 getNextCommandParameter ()
 
 getNextSequenceParameter ()
 
 getNavigationUrlParameter ()
 
 getAnswerChangedParameter ()
 Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationControl.js or by a previousRequest. More...
 
 setAnswerChangedParameter ($changed=true)
 Set the 'answer changed' url parameter for generated links. More...
 
 handleIntermediateSubmit ()
 Check the 'answer changed' parameter when a question form is intermediately submitted. More...
 
 saveNavigationPreventConfirmation ()
 Save the save the switch to prevent the navigation confirmation. More...
 
 getQuestionGuiInstance ($question_id, $fromCache=true)
 
 getQuestionInstance (int $question_id, bool $from_cache=true)
 
 initTestQuestionConfig (assQuestion $questionOBJ)
 
 handleTearsAndAngerQuestionIsNull (int $question_id, $sequence_element)
 
 populateMessageContent ($contentHTML)
 
 populateModals ()
 
 populateDiscardSolutionModal ()
 
 populateNavWhenChangedModal ()
 
 populateNextLocksUnchangedModal ()
 
 populateNextLocksChangedModal ()
 
 setFollowUpQuestionLocksConfirmationPrevented ()
 
 isFollowUpQuestionLocksConfirmationPrevented ()
 
 getQuestionsDefaultPresentationMode ($isQuestionWorkedThrough)
 
 registerForcedFeedbackNavUrl ($forcedFeedbackNavUrl)
 
 getRegisteredForcedFeedbackNavUrl ()
 
 isForcedFeedbackNavUrlRegistered ()
 
 unregisterForcedFeedbackNavUrl ()
 
 handleFileUploadCmd ()
 
- Protected Member Functions inherited from ilTestServiceGUI
 getPassDetailsOverviewTableGUI (array $result_array, int $active_id, int $pass, ilTestServiceGUI|ilParticipantsTestResultsGUI $target_gui, string $target_cmd, ilTestQuestionRelatedObjectivesList $objectives_list=null, bool $multiple_objectives_involved=true)
 
 buildPassDetailsOverviewTableGUI (ilTestServiceGUI|ilParticipantsTestResultsGUI $target_gui, string $target_cmd)
 
 isGradingMessageRequired ()
 
 getGradingMessageBuilder (int $active_id)
 
 buildQuestionRelatedObjectivesList (ilLOTestQuestionAdapter $objectives_adapter, ilTestQuestionSequence $test_sequence)
 
 getFilteredTestResult (int $active_id, int $pass, bool $considerHiddenQuestions, bool $considerOptionalQuestions)
 
 populateContent ($content)
 
 buildUserTestResultsToolbarGUI ()
 
 outCorrectSolutionCmd ()
 
 outCorrectSolution ()
 Creates an output of the solution of an answer compared to the correct solution. More...
 
 populatePassFinishDate (ilTemplate $tpl, ?int $pass_finish_date)
 
 populateExamId (ilTemplate $tpl, int $active_id, int $pass)
 

Protected Attributes

ilTestQuestionRelatedObjectivesList $question_related_objectives_list
 
bool $save_result
 
- Protected Attributes inherited from ilTestPlayerAbstractGUI
ilTestPasswordChecker $passwordChecker
 
ilTestProcessLocker $processLocker
 
ilTestSession $test_session = null
 
ilSetting $assSettings = null
 
ilTestSequence $testSequence = null
 
InterruptiveModal $finish_test_modal = null
 
- Protected Attributes inherited from ilTestServiceGUI
InternalRequestService $testrequest
 
ILIAS TestQuestionPool QuestionInfoService $questioninfo
 
ilTestService $service = null
 
ilDBInterface $db
 
ilLanguage $lng
 
LoggingServices $logging_services
 
ilHelpGUI $help
 
ilRbacSystem $rbac_system
 
ilGlobalTemplateInterface ilTemplate $tpl
 sk 2023-08-01: We need this union type, even if it is wrong! To change this More...
 
ContentStyle $content_style
 
ilErrorHandling $error
 
ilAccess $access
 
HTTPServices $http
 
ilCtrl $ctrl
 
ilToolbarGUI $toolbar
 
ilTabsGUI $tabs
 
ilObjectDataCache $obj_cache
 
ilComponentRepository $component_repository
 
ilObjUser $user
 
ArrayBasedRequestWrapper $post_wrapper
 
ilNavigationHistory $navigation_history
 
Refinery $refinery
 
UIFactory $ui_factory
 
UIRenderer $ui_renderer
 
SkillService $skills_service
 
ilTestShuffler $shuffler
 
ilTestResultsFactory $results_factory
 
ilTestResultsPresentationFactory $results_presentation_factory
 
ILIAS $ilias
 
ilSetting $settings
 
GlobalScreenServices $global_screen
 
ilTree $tree
 
int $ref_id
 
ilTestSessionFactory $testSessionFactory = null
 
ilTestSequenceFactory $testSequenceFactory = null
 
ilTestParticipantData $participantData = null
 
ilTestParticipantAccessFilterFactory $participant_access_filter
 

Private Member Functions

 isValidSequenceElement ($sequence_element)
 

Additional Inherited Members

- Data Fields inherited from ilTestPlayerAbstractGUI
const PRESENTATION_MODE_VIEW = 'view'
 
const PRESENTATION_MODE_EDIT = 'edit'
 
const FIXED_SHUFFLER_SEED_MIN_LENGTH = 8
 
bool $maxProcessingTimeReached
 
bool $endingTimeReached
 
int $ref_id
 
const FOLLOWUP_QST_LOCKS_PREVENT_CONFIRMATION_PARAM = 'followup_qst_locks_prevent_confirmation'
 

Detailed Description

Output class for assessment test execution.

The ilTestOutputGUI class creates the output for the ilObjTestGUI class when learners execute a test. This saves some heap space because the ilObjTestGUI class will be much smaller then

Author
Helmut Schottmüller helmu.nosp@m.t.sc.nosp@m.hottm.nosp@m.uell.nosp@m.er@ma.nosp@m.c.co.nosp@m.m
Björn Heyser bheys.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Maximilian Becker mbeck.nosp@m.er@d.nosp@m.ataba.nosp@m.y.de
Version
$Id$

ModulesTest

Definition at line 35 of file class.ilTestOutputGUI.php.

Member Function Documentation

◆ adoptUserSolutionsFromPreviousPass()

ilTestOutputGUI::adoptUserSolutionsFromPreviousPass ( )
protected

Definition at line 924 of file class.ilTestOutputGUI.php.

References ilTestPlayerAbstractGUI\$assSettings, ilObjAssessmentFolder\_enabledAssessmentLogging(), populateQuestionOptionalMessage(), and ILIAS\Repository\user().

Referenced by startTestCmd().

925  {
926  $assSettings = new ilSetting('assessment');
927 
928  $isAssessmentLogEnabled = ilObjAssessmentFolder::_enabledAssessmentLogging();
929 
930  $userSolutionAdopter = new ilAssQuestionUserSolutionAdopter($this->db, $assSettings, $isAssessmentLogEnabled);
931 
932  $userSolutionAdopter->setUserId($this->user->getId());
933  $userSolutionAdopter->setActiveId($this->test_session->getActiveId());
934  $userSolutionAdopter->setTargetPass($this->testSequence->getPass());
935  $userSolutionAdopter->setQuestionIds($this->testSequence->getOptionalQuestions());
936 
937  $userSolutionAdopter->perform();
938  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ canSaveResult()

ilTestOutputGUI::canSaveResult ( )
protected

Returns TRUE if the answers of the current user could be saved.

Returns
boolean TRUE if the answers could be saved, FALSE otherwise

Definition at line 679 of file class.ilTestOutputGUI.php.

References ilTestPlayerAbstractGUI\isMaxProcessingTimeReached(), and ilTestPlayerAbstractGUI\isNrOfTriesReached().

Referenced by saveQuestionSolution().

679  : bool
680  {
681  return !$this->object->endingTimeReached() && !$this->isMaxProcessingTimeReached() && !$this->isNrOfTriesReached();
682  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ discardSolutionCmd()

ilTestOutputGUI::discardSolutionCmd ( )
protected

Definition at line 556 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ILIAS\Survey\Mode\getId(), ilTestServiceGUI\getObject(), ilTestPlayerAbstractGUI\getQuestionInstance(), ilTestPlayerAbstractGUI\PRESENTATION_MODE_VIEW, and ilTestPlayerCommands\SHOW_QUESTION.

557  {
558  $currentSequenceElement = $this->getCurrentSequenceElement();
559 
560  $currentQuestionOBJ = $this->getQuestionInstance(
561  $this->testSequence->getQuestionForSequence($currentSequenceElement)
562  );
563 
564  $currentQuestionOBJ->setTestId($this->getObject()->getId());
565 
566  $currentQuestionOBJ->resetUsersAnswer(
567  $this->test_session->getActiveId(),
568  $this->test_session->getPass()
569  );
570 
571  $this->ctrl->saveParameter($this, 'sequence');
572 
573  $this->ctrl->setParameter($this, 'pmode', ilTestPlayerAbstractGUI::PRESENTATION_MODE_VIEW);
574 
575  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
576  }
getQuestionInstance(int $question_id, bool $from_cache=true)
+ Here is the call graph for this function:

◆ editSolutionCmd()

ilTestOutputGUI::editSolutionCmd ( )
protected

◆ executeCommand()

ilTestOutputGUI::executeCommand ( )

Execute Command.

Definition at line 43 of file class.ilTestOutputGUI.php.

References $id, ilTestServiceGUI\$testSessionFactory, ilTestPlayerAbstractGUI\checkReadAccess(), ilTestPlayerAbstractGUI\checkTestExecutable(), ilTestPlayerAbstractGUI\checkTestSessionUser(), ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\ensureExistingTestSession(), exit, ilTestPlayerAbstractGUI\getAnswerChangedParameter(), ilTestServiceGUI\getCommand(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ilTestServiceGUI\getObjectiveOrientedContainer(), ilTestPlayerAbstractGUI\getSequenceElementParameter(), ilTestSessionFactory\getSession(), getTestPlayerTitle(), handleCheckTestPassValid(), ilTestPlayerAbstractGUI\handlePasswordProtectionRedirect(), ilTestPlayerAbstractGUI\initAssessmentSettings(), ilYuiUtil\initConnectionWithAnimation(), iljQueryUtil\initjQuery(), ilTestPlayerAbstractGUI\initProcessLocker(), ilTestPlayerCommands\isTestExecutionCommand(), ILIAS\Repository\lng(), ILIAS\Repository\object(), ilTestPlayerAbstractGUI\setAnswerChangedParameter(), ILIAS\Repository\settings(), ilTestPlayerCommands\SHOW_QUESTION, ILIAS\Repository\tabs(), ilTestPlayerLayoutProvider\TEST_PLAYER_KIOSK_MODE_ENABLED, ilTestPlayerLayoutProvider\TEST_PLAYER_SHORT_TITLE, ilTestPlayerLayoutProvider\TEST_PLAYER_TITLE, ilTestPlayerLayoutProvider\TEST_PLAYER_VIEW_TITLE, and ILIAS\Repository\user().

44  {
45  $this->tabs->clearTargets();
46 
47  $cmd = $this->ctrl->getCmd();
48  $next_class = $this->ctrl->getNextClass($this);
49 
50  if (($read_access = $this->checkReadAccess()) !== true) {
51  if ($cmd === 'autosave') {
52  echo $this->lng->txt('autosave_failed') . ': ' . $read_access;
53  exit;
54  }
55  $this->tpl->setOnScreenMessage('failure', $read_access, true);
56  $this->ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, TestScreenGUI::class]);
57  }
58 
59  $this->ctrl->saveParameter($this, "sequence");
60  $this->ctrl->saveParameter($this, "pmode");
61  $this->ctrl->saveParameter($this, "active_id");
62 
63  $this->initAssessmentSettings();
64 
65  $testSessionFactory = new ilTestSessionFactory($this->object, $this->db, $this->user);
66  $this->test_session = $testSessionFactory->getSession($this->testrequest->int('active_id'));
67 
68  $this->ensureExistingTestSession($this->test_session);
69  $this->checkTestSessionUser($this->test_session);
70 
71  $this->initProcessLocker($this->test_session->getActiveId());
72 
73  $test_sequence_factory = new ilTestSequenceFactory($this->object, $this->db, $this->questioninfo);
74  $this->testSequence = $test_sequence_factory->getSequenceByTestSession($this->test_session);
75  $this->testSequence->loadFromDb();
76  $this->testSequence->loadQuestions();
77 
78  $this->question_related_objectives_list = new ilTestQuestionRelatedObjectivesList();
79 
82 
84 
85  $instance_name = $this->settings->get('short_inst_name') ?? '';
86  if (trim($instance_name) === '') {
87  $instance_name = 'ILIAS';
88  }
89  $this->global_screen->tool()->context()->current()->addAdditionalData(
91  $instance_name
92  );
93  $this->global_screen->tool()->context()->current()->addAdditionalData(
95  $this->object->getKioskMode()
96  );
97 
98  $title = $this->object->getTitle();
99  if (($sequence_index = $this->getSequenceElementParameter()) !== null) {
100  $title .= ' - ' . $this->lng->txt('question') . $sequence_index;
101  }
102  $this->global_screen->tool()->context()->current()->addAdditionalData(
104  $title
105  );
106  $this->global_screen->tool()->context()->current()->addAdditionalData(
108  $this->getTestPlayerTitle()
109  );
110 
111 
112  $cmd = $this->getCommand($cmd);
113 
114  switch ($next_class) {
115  case 'ilassquestionpagegui':
116  $this->checkTestExecutable();
117 
118  $questionId = $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement());
119 
120  $page_gui = new ilAssQuestionPageGUI($questionId);
121  $ret = $this->ctrl->forwardCommand($page_gui);
122  break;
123 
124  case 'iltestsubmissionreviewgui':
125  $this->checkTestExecutable();
126  $this->handleCheckTestPassValid();
127 
128  $gui = new ilTestSubmissionReviewGUI($this, $this->object, $this->test_session);
129  $gui->setObjectiveOrientedContainer($this->getObjectiveOrientedContainer());
130  $ret = $this->ctrl->forwardCommand($gui);
131  break;
132 
133  case 'ilassquestionhintrequestgui':
134  $this->checkTestExecutable();
135 
136  $questionGUI = $this->object->createQuestionGUI(
137  "",
138  $this->testSequence->getQuestionForSequence($this->getCurrentSequenceElement())
139  );
140 
141  $questionHintTracking = new ilAssQuestionHintTracking(
142  $questionGUI->object->getId(),
143  $this->test_session->getActiveId(),
144  $this->test_session->getPass()
145  );
146 
147  $gui = new ilAssQuestionHintRequestGUI(
148  $this,
150  $questionGUI,
151  $questionHintTracking,
152  $this->ctrl,
153  $this->lng,
154  $this->tpl,
155  $this->tabs,
156  $this->global_screen
157  );
158 
159  // fau: testNav - save the 'answer changed' status for viewing hint requests
161  // fau.
162  $ret = $this->ctrl->forwardCommand($gui);
163 
164  break;
165  case 'ilassspecfeedbackpagegui':
166  case 'ilassgenfeedbackpagegui':
167  $id = $this->testrequest->int('pg_id');
168  if ($this->ctrl->getCmd() !== 'displayMediaFullscreen'
169  || $id === 0) {
170  break;
171  }
172 
173  (new ilPageObjectGUI(
174  $next_class === 'ilassgenfeedbackpagegui' ? 'qfbg' : 'qfbs',
175  $id
176  ))->displayMediaFullscreen();
177  break;
178 
179  case 'iltestpasswordprotectiongui':
180  $this->checkTestExecutable();
181 
182  $gui = new ilTestPasswordProtectionGUI(
183  $this->ctrl,
184  $this->tpl,
185  $this->lng,
186  $this,
187  $this->passwordChecker,
188  $this->testrequest,
189  $this->global_screen
190  );
191  $ret = $this->ctrl->forwardCommand($gui);
192  break;
193 
194  default:
195  if ($cmd !== 'autosave' && ilTestPlayerCommands::isTestExecutionCommand($cmd)) {
196  $this->checkTestExecutable();
197  }
198 
199  if (strtolower($cmd) === 'showquestion') {
200  $testPassesSelector = new ilTestPassesSelector($this->db, $this->object);
201  $testPassesSelector->setActiveId($this->test_session->getActiveId());
202  $testPassesSelector->setLastFinishedPass($this->test_session->getLastFinishedPass());
203 
204  if (!$testPassesSelector->openPassExists()) {
205  $this->tpl->setOnScreenMessage('info', $this->lng->txt('tst_pass_finished'), true);
206  $this->ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, ilTestScreenGUI::class]);
207  }
208  }
209 
210  if ($cmd === 'outQuestionSummary'
211  || $cmd === 'submitSolution') {
212  $this->handleCheckTestPassValid();
213  }
214 
215  $cmd .= 'Cmd';
216  $ret = $this->$cmd();
217  break;
218  }
219  return $ret;
220  }
exit
Definition: login.php:29
setAnswerChangedParameter($changed=true)
Set the 'answer changed' url parameter for generated links.
Class ilPageObjectGUI.
getSession(?int $active_id=null)
Creates and returns an instance of a test sequence that corresponds to the current test mode...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
checkTestSessionUser(ilTestSession $test_session)
Class ilTestSubmissionReviewGUI.
getCommand($cmd)
Retrieves the ilCtrl command.
ensureExistingTestSession(ilTestSession $test_session)
ilTestSessionFactory $testSessionFactory
getAnswerChangedParameter()
Get the 'answer changed' status from the current request It may be set by ilTestPlayerNavigationContr...
static initjQuery(ilGlobalTemplateInterface $a_tpl=null)
inits and adds the jQuery JS-File to the global or a passed template
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
static initConnectionWithAnimation()
Init YUI connection and animation module used in Modules/Test (Jan 2022)
+ Here is the call graph for this function:

◆ generateRandomTestPassForActiveUser()

ilTestOutputGUI::generateRandomTestPassForActiveUser ( )
protected

Definition at line 833 of file class.ilTestOutputGUI.php.

References ilTestServiceGUI\$component_repository, ilTestServiceGUI\$questioninfo, ilTestRandomQuestionSetBuilder\getInstance(), ILIAS\Repository\lng(), ilTestRandomQuestionSetConfig\loadFromDb(), and performTearsAndAngerBrokenConfessionChecks().

Referenced by resumePlayerCmd(), and startTestCmd().

834  {
835  $questionSetConfig = new ilTestRandomQuestionSetConfig(
836  $this->tree,
837  $this->db,
838  $this->lng,
839  $this->logging_services->root(),
841  $this->object,
843  );
844  $questionSetConfig->loadFromDb();
845 
846  $sourcePoolDefinitionFactory = new ilTestRandomQuestionSetSourcePoolDefinitionFactory($this->db, $this->object);
847 
848  $sourcePoolDefinitionList = new ilTestRandomQuestionSetSourcePoolDefinitionList($this->db, $this->object, $sourcePoolDefinitionFactory);
849  $sourcePoolDefinitionList->loadDefinitions();
850 
851  $this->processLocker->executeRandomPassBuildOperation(function () use ($questionSetConfig, $sourcePoolDefinitionList) {
853  $stagingPoolQuestionList = new ilTestRandomQuestionSetStagingPoolQuestionList($this->db, $this->component_repository);
854 
855  $questionSetBuilder = ilTestRandomQuestionSetBuilder::getInstance(
856  $this->db,
857  $this->lng,
858  $this->logging_services->root(),
859  $this->object,
860  $questionSetConfig,
861  $sourcePoolDefinitionList,
862  $stagingPoolQuestionList
863  );
864 
865  $questionSetBuilder->performBuild($this->test_session);
866  }
867  }, $sourcePoolDefinitionList->hasTaxonomyFilters());
868  }
ilComponentRepository $component_repository
static getInstance(ilDBInterface $db, ilLanguage $lng, ilLogger $log, ilObjTest $testOBJ, ilTestRandomQuestionSetConfig $questionSetConfig, ilTestRandomQuestionSetSourcePoolDefinitionList $sourcePoolDefinitionList, ilTestRandomQuestionSetStagingPoolQuestionList $stagingPoolQuestionList)
ILIAS TestQuestionPool QuestionInfoService $questioninfo
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ getCurrentQuestionId()

ilTestOutputGUI::getCurrentQuestionId ( )
protected
Returns
integer

Definition at line 687 of file class.ilTestOutputGUI.php.

687  : int
688  {
689  return $this->testSequence->getQuestionForSequence($this->testrequest->int('sequence'));
690  }

◆ getTestPlayerTitle()

ilTestOutputGUI::getTestPlayerTitle ( )
protected

Definition at line 996 of file class.ilTestOutputGUI.php.

References ilObjTest\buildExamId(), ILIAS\Repository\lng(), ILIAS\Repository\object(), and ILIAS\Repository\user().

Referenced by executeCommand().

996  : string
997  {
998  $titleContent = $this->ui_factory->listing()->property();
999 
1000  if ($this->object->getShowKioskModeParticipant()) {
1001  $testParticipantNameLabel = $this->lng->txt("conf_user_name");
1002  // this is a placeholder solution with inline html tags to differentiate the different elements
1003  // should be removed when a title component with grouping and visual weighting is available
1004  // see: https://github.com/ILIAS-eLearning/ILIAS/pull/7311
1005  $testParticipantNameValue = "<span class='il-test-kiosk-head__participant-name'>" . $this->user->getFullname() . "</span>";
1006  $titleContent = $titleContent->withProperty($testParticipantNameLabel, $testParticipantNameValue, false);
1007  }
1008 
1009  if ($this->object->isShowExamIdInTestPassEnabled()) {
1010  $testExamIdLabel = $this->lng->txt("exam_id_label");
1011  $testExamIdValue = ilObjTest::buildExamId(
1012  $this->test_session->getActiveId(),
1013  $this->test_session->getPass(),
1014  $this->object->getId()
1015  );
1016  $titleContent = $titleContent->withProperty($testExamIdLabel, $testExamIdValue);
1017  }
1018 
1019  if ($this->object->getShowKioskModeTitle()) {
1020  $testNameLabel = $this->lng->txt("test");
1021  $testNameValue = $this->object->getTitle();
1022  $titleContent = $titleContent->withProperty($testNameLabel, $testNameValue, false);
1023  }
1024 
1025  return $this->ui_renderer->render($titleContent);
1026  }
static buildExamId($active_id, $pass, $test_obj_id=null)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ handleCheckTestPassValid()

ilTestOutputGUI::handleCheckTestPassValid ( )
protected

Definition at line 614 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestScreenGUI\DEFAULT_CMD, and ILIAS\Repository\lng().

Referenced by executeCommand(), nextQuestionCmd(), and previousQuestionCmd().

614  : void
615  {
616  $testObj = new ilObjTest($this->ref_id, true);
617 
618  $participants = $testObj->getActiveParticipantList();
619  $participant = $participants->getParticipantByActiveId($this->testrequest->getActiveId());
620  if (!$participant || !$participant->hasUnfinishedPasses()) {
621  $this->tpl->setOnScreenMessage('failure', $this->lng->txt("tst_current_run_no_longer_valid"), true);
622  $this->ctrl->redirectByClass([ilObjTestGUI::class, ilTestScreenGUI::class], ilTestScreenGUI::DEFAULT_CMD);
623  }
624  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ handlePrimaryButton()

ilTestOutputGUI::handlePrimaryButton ( ilTestNavigationToolbarGUI  $navigationToolbarGUI,
int  $currentQuestionId 
)
protected

Definition at line 968 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\object(), and ilTestNavigationToolbarGUI\setFinishTestButtonPrimary().

Referenced by showQuestionCmd().

968  : bool
969  {
970  $isNextPrimary = true;
971 
972  if ($this->object->isForceInstantFeedbackEnabled()) {
973  $isNextPrimary = false;
974  }
975 
976  $questionsMissingResult = $this->questioninfo->getQuestionsMissingResultRecord(
977  $this->test_session->getActiveId(),
978  $this->test_session->getPass(),
979  $this->testSequence->getOrderedSequenceQuestions()
980  );
981 
982  if ($questionsMissingResult === []) {
983  $navigationToolbarGUI->setFinishTestButtonPrimary(true);
984  return false;
985  }
986 
987  if (count($questionsMissingResult) === 1
988  && $currentQuestionId === current($questionsMissingResult)) {
989  $navigationToolbarGUI->setFinishTestButtonPrimary(true);
990  return false;
991  }
992 
993  return $isNextPrimary;
994  }
setFinishTestButtonPrimary($finishTestButtonPrimary)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ handleQuestionActionCmd()

ilTestOutputGUI::handleQuestionActionCmd ( )
protected

Definition at line 792 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ilTestPlayerAbstractGUI\isParticipantsAnswerFixed(), saveQuestionSolution(), ilTestPlayerAbstractGUI\setAnswerChangedParameter(), ilTestPlayerCommands\SHOW_QUESTION, and ilTestPlayerAbstractGUI\updateWorkingTime().

793  {
794  $questionId = $this->testSequence->getQuestionForSequence(
796  );
797 
798  if (!$this->isParticipantsAnswerFixed($questionId)) {
799  $this->updateWorkingTime();
800  $this->saveQuestionSolution(false);
801  // fau: testNav - add changed status of the question
802  $this->setAnswerChangedParameter(true);
803  // fau.
804  }
805 
806  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
807  }
setAnswerChangedParameter($changed=true)
Set the &#39;answer changed&#39; url parameter for generated links.
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not ...
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
+ Here is the call graph for this function:

◆ handleQuestionPostponing()

ilTestOutputGUI::handleQuestionPostponing (   $sequence_element)
protected

Definition at line 598 of file class.ilTestOutputGUI.php.

Referenced by nextQuestionCmd().

599  {
600  $questionId = $this->testSequence->getQuestionForSequence($sequence_element);
601 
602  $isQuestionWorkedThrough = $this->questioninfo->lookupResultRecordExist(
603  $this->test_session->getActiveId(),
604  $questionId,
605  $this->test_session->getPass()
606  );
607 
608  if (!$isQuestionWorkedThrough) {
609  $this->testSequence->postponeQuestion($questionId);
610  $this->testSequence->saveToDb();
611  }
612  }
+ Here is the caller graph for this function:

◆ handleTearsAndAngerNoObjectiveOrientedQuestion()

ilTestOutputGUI::handleTearsAndAngerNoObjectiveOrientedQuestion ( )
protected

Definition at line 962 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), and ILIAS\Repository\lng().

Referenced by showQuestionCmd().

963  {
964  $this->tpl->setOnScreenMessage('failure', sprintf($this->lng->txt('tst_objective_oriented_test_pass_without_questions'), $this->object->getTitle()), true);
965  $this->ctrl->redirectByClass(ilObjTestGUI::class);
966  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isFirstQuestionInSequence()

ilTestOutputGUI::isFirstQuestionInSequence (   $sequence_element)
protected

Definition at line 664 of file class.ilTestOutputGUI.php.

664  : bool
665  {
666  return $sequence_element == $this->testSequence->getFirstSequence();
667  }

◆ isLastQuestionInSequence()

ilTestOutputGUI::isLastQuestionInSequence (   $sequence_element)
protected

Definition at line 669 of file class.ilTestOutputGUI.php.

669  : bool
670  {
671  return $sequence_element == $this->testSequence->getLastSequence();
672  }

◆ isOptionalQuestionAnsweringConfirmationRequired()

ilTestOutputGUI::isOptionalQuestionAnsweringConfirmationRequired (   $sequenceKey)
protected

Definition at line 942 of file class.ilTestOutputGUI.php.

942  : bool
943  {
944  if ($this->testSequence->isAnsweringOptionalQuestionsConfirmed()) {
945  return false;
946  }
947 
948  $questionId = $this->testSequence->getQuestionForSequence($sequenceKey);
949 
950  if (!$this->testSequence->isQuestionOptional($questionId)) {
951  return false;
952  }
953 
954  return true;
955  }

◆ isQuestionSummaryFinishTestButtonRequired()

ilTestOutputGUI::isQuestionSummaryFinishTestButtonRequired ( )
protected

Definition at line 957 of file class.ilTestOutputGUI.php.

957  : bool
958  {
959  return true;
960  }

◆ isShowingPostponeStatusReguired()

ilTestOutputGUI::isShowingPostponeStatusReguired (   $questionId)
protected

Definition at line 919 of file class.ilTestOutputGUI.php.

919  : bool
920  {
921  return $this->testSequence->isPostponedQuestion($questionId);
922  }

◆ isValidSequenceElement()

ilTestOutputGUI::isValidSequenceElement (   $sequence_element)
private

Definition at line 309 of file class.ilTestOutputGUI.php.

Referenced by nextQuestionCmd(), previousQuestionCmd(), showQuestionCmd(), skipQuestionCmd(), and submitSolutionAndNextCmd().

309  : bool
310  {
311  if ($sequence_element === false) {
312  return false;
313  }
314 
315  if ($sequence_element < 1) {
316  return false;
317  }
318 
319  if (!$this->testSequence->getPositionOfSequence($sequence_element)) {
320  return false;
321  }
322 
323  return true;
324  }
+ Here is the caller graph for this function:

◆ nextQuestionCmd()

ilTestOutputGUI::nextQuestionCmd ( )
protected

Definition at line 626 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), handleCheckTestPassValid(), handleQuestionPostponing(), isValidSequenceElement(), ILIAS\Repository\object(), and ilTestPlayerCommands\SHOW_QUESTION.

627  {
628  $this->handleCheckTestPassValid();
629  $lastSequenceElement = $this->getCurrentSequenceElement();
630  $nextSequenceElement = $this->testSequence->getNextSequence($lastSequenceElement);
631 
632  if ($this->object->isPostponingEnabled()) {
633  $this->handleQuestionPostponing($lastSequenceElement);
634  }
635 
636  if (!$this->isValidSequenceElement($nextSequenceElement)) {
637  $nextSequenceElement = $this->testSequence->getFirstSequence();
638  }
639 
640  $this->ctrl->setParameter($this, 'sequence', $nextSequenceElement);
641  $this->ctrl->setParameter($this, 'pmode', '');
642 
643  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
644  }
isValidSequenceElement($sequence_element)
handleQuestionPostponing($sequence_element)
+ Here is the call graph for this function:

◆ performTearsAndAngerBrokenConfessionChecks()

ilTestOutputGUI::performTearsAndAngerBrokenConfessionChecks ( )
protected

Definition at line 809 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\lng(), and ILIAS\Repository\user().

Referenced by generateRandomTestPassForActiveUser().

809  : bool
810  {
811  if ($this->test_session->getActiveId() > 0) {
812  if ($this->testSequence->hasRandomQuestionsForPass($this->test_session->getActiveId(), $this->test_session->getPass()) > 0) {
813  $this->logging_services->root()->write(
814  __METHOD__ . ' Random Questions allready exists for user ' .
815  $this->user->getId() . ' in test ' . $this->object->getTestId()
816  );
817 
818  return true;
819  }
820  } else {
821  $this->logging_services->root()->write(__METHOD__ . ' ' . sprintf(
822  $this->lng->txt("error_random_question_generation"),
823  $this->user->getId(),
824  $this->object->getTestId()
825  ));
826 
827  return true;
828  };
829 
830  return false;
831  }
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ populateQuestionOptionalMessage()

ilTestOutputGUI::populateQuestionOptionalMessage ( )
abstractprotected

Referenced by adoptUserSolutionsFromPreviousPass(), and showQuestionCmd().

+ Here is the caller graph for this function:

◆ previousQuestionCmd()

ilTestOutputGUI::previousQuestionCmd ( )
protected

Definition at line 646 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), handleCheckTestPassValid(), isValidSequenceElement(), and ilTestPlayerCommands\SHOW_QUESTION.

647  {
648  $this->handleCheckTestPassValid();
649 
650  $sequence_element = $this->testSequence->getPreviousSequence(
652  );
653 
654  if (!$this->isValidSequenceElement($sequence_element)) {
655  $sequence_element = $this->testSequence->getLastSequence();
656  }
657 
658  $this->ctrl->setParameter($this, 'sequence', $sequence_element);
659  $this->ctrl->setParameter($this, 'pmode', '');
660 
661  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
662  }
isValidSequenceElement($sequence_element)
+ Here is the call graph for this function:

◆ resumePlayerCmd()

ilTestOutputGUI::resumePlayerCmd ( )
protected

Resume a test at the last position.

Definition at line 873 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), generateRandomTestPassForActiveUser(), ilTestPlayerAbstractGUI\handleUserSettings(), ILIAS\Repository\object(), ilTestPlayerCommands\QUESTION_SUMMARY, ilSession\set(), and ilTestPlayerCommands\SHOW_QUESTION.

874  {
875  $this->handleUserSettings();
876 
877  $active_id = $this->test_session->getActiveId();
878  $this->ctrl->setParameter($this, "active_id", $active_id);
879 
880  $active_time_id = $this->object->startWorkingTime($active_id, $this->test_session->getPass());
881  ilSession::set("active_time_id", $active_time_id);
882  ilSession::set('tst_pass_finish', 0);
883 
884  if ($this->object->isRandomTest()) {
885  if (!$this->testSequence->hasRandomQuestionsForPass($active_id, $this->test_session->getPass())) {
886  // create a new set of random questions
888  }
889  }
890 
891  $shuffle = $this->object->getShuffleQuestions();
892  if ($this->object->isRandomTest()) {
893  $shuffle = false;
894  }
895 
896  $this->object->updateTestPassResults(
897  $active_id,
898  $this->test_session->getPass(),
899  $this->object->areObligationsEnabled(),
900  null,
901  $this->object->getId()
902  );
903 
904  // ensure existing test sequence
905  if (!$this->testSequence->hasSequence()) {
906  $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
907  $this->testSequence->saveToDb();
908  }
909 
910  if ($this->object->getListOfQuestionsStart()) {
911  $this->ctrl->redirect($this, ilTestPlayerCommands::QUESTION_SUMMARY);
912  }
913 
914  $this->ctrl->setParameter($this, 'sequence', $this->test_session->getLastSequence());
915  $this->ctrl->setParameter($this, 'pmode', '');
916  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
917  }
handleUserSettings()
Handles some form parameters on starting and resuming a test.
static set(string $a_var, $a_val)
Set a value.
+ Here is the call graph for this function:

◆ saveQuestionSolution()

ilTestOutputGUI::saveQuestionSolution (   $authorized = true,
  $force = false 
)

saves the user input of a question

Definition at line 695 of file class.ilTestOutputGUI.php.

References $save_result, ilObjTest\_getPass(), canSaveResult(), ILIAS\Repository\ctrl(), ilSession\get(), ilLOTestQuestionAdapter\getInstance(), ilTestPlayerAbstractGUI\getQuestionInstance(), ilTestPlayerAbstractGUI\handleSkillTriggering(), ILIAS\Repository\int(), ilTestPlayerAbstractGUI\isNrOfTriesReached(), ilTestPlayerAbstractGUI\isParticipantsAnswerFixed(), ILIAS\Repository\object(), ilSession\set(), ilTestPlayerAbstractGUI\updateWorkingTime(), and assQuestionInterface\validateSolutionSubmit().

Referenced by handleQuestionActionCmd(), showInstantResponseCmd(), submitSolutionAndNextCmd(), and submitSolutionCmd().

695  : bool
696  {
697  $this->updateWorkingTime();
698  $this->save_result = false;
699  if (!$force) {
700  $formtimestamp = $_POST["formtimestamp"] ?? '';
701  if (strlen($formtimestamp) == 0) {
702  $formtimestamp = $this->testrequest->raw("formtimestamp");
703  }
704  if (ilSession::get('formtimestamp') == null || $formtimestamp != ilSession::get("formtimestamp")) {
705  ilSession::set("formtimestamp", $formtimestamp);
706  } else {
707  return false;
708  }
709  }
710 
711  /*
712  #21097 - exceed maximum passes
713  this is a battle of conditions; e.g. ilTestPlayerAbstractGUI::autosaveOnTimeLimitCmd forces saving of results.
714  However, if an admin has finished the pass in the meantime, a new pass should not be created.
715  */
716  if ($force && $this->isNrOfTriesReached()) {
717  $force = false;
718  }
719 
720  // save question solution
721  if ($this->canSaveResult() || $force) {
722  // but only if the ending time is not reached
723  $q_id = $this->testSequence->getQuestionForSequence($this->testrequest->int('sequence'));
724 
725  if ($this->isParticipantsAnswerFixed($q_id)) {
726  // should only be reached by firebugging the disabled form in ui
727  throw new ilTestException('not allowed request');
728  }
729 
730  if (is_numeric($q_id) && (int) $q_id) {
731  $questionOBJ = $this->getQuestionInstance($q_id);
732 
733  $active_id = (int) $this->test_session->getActiveId();
734  $pass = ilObjTest::_getPass($active_id);
735  $this->save_result = $questionOBJ->persistWorkingState(
736  $active_id,
737  $pass,
738  $this->object->areObligationsEnabled(),
739  $authorized
740  );
741 
742  if ($authorized && $this->test_session->isObjectiveOriented()) {
743  $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->test_session);
744  $objectivesAdapter->updateQuestionResult($this->test_session, $questionOBJ);
745  }
746 
747  if ($authorized && $this->object->isSkillServiceToBeConsidered()) {
748  $this->handleSkillTriggering($this->test_session);
749  }
750  }
751  }
752 
753  if (!$this->save_result || ($questionOBJ instanceof ilAssQuestionPartiallySaveable && !$questionOBJ->validateSolutionSubmit())) {
754  $this->ctrl->setParameter($this, "save_error", "1");
755  ilSession::set("previouspost", $_POST);
756  }
757 
758  return $this->save_result;
759  }
getQuestionInstance(int $question_id, bool $from_cache=true)
static get(string $a_var)
static _getPass($active_id)
Retrieves the actual pass of a given user for a given test.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
updateWorkingTime()
updates working time and stores state saveresult to see if question has to be stored or not ...
Base Exception for all Exceptions relating to Modules/Test.
static getInstance(ilTestSession $a_test_session)
handleSkillTriggering(ilTestSession $test_session)
static set(string $a_var, $a_val)
Set a value.
canSaveResult()
Returns TRUE if the answers of the current user could be saved.
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ showInstantResponseCmd()

ilTestOutputGUI::showInstantResponseCmd ( )
protected

Definition at line 761 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ilTestPlayerAbstractGUI\getNavigationUrlParameter(), ilTestPlayerAbstractGUI\isParticipantsAnswerFixed(), ILIAS\Repository\object(), ilTestPlayerAbstractGUI\registerForcedFeedbackNavUrl(), ilTestPlayerAbstractGUI\removeIntermediateSolution(), ilTestPlayerAbstractGUI\saveNavigationPreventConfirmation(), saveQuestionSolution(), ilTestPlayerAbstractGUI\setAnswerChangedParameter(), and ilTestPlayerCommands\SHOW_QUESTION.

762  {
763  $questionId = $this->testSequence->getQuestionForSequence(
765  );
766 
767  if (!$this->isParticipantsAnswerFixed($questionId)) {
768  if ($this->saveQuestionSolution(true)) {
770  $this->setAnswerChangedParameter(false);
771  } else {
772  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
773  }
774  $this->testSequence->setQuestionChecked($questionId);
775  $this->testSequence->saveToDb();
776  } elseif ($this->object->isForceInstantFeedbackEnabled()) {
777  $this->testSequence->setQuestionChecked($questionId);
778  $this->testSequence->saveToDb();
779  }
780 
781  $this->ctrl->setParameter($this, 'instresp', 1);
782 
783  // fau: testNav - handle navigation after feedback
784  if ($this->getNavigationUrlParameter()) {
787  }
788  // fau.
789  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
790  }
setAnswerChangedParameter($changed=true)
Set the &#39;answer changed&#39; url parameter for generated links.
saveNavigationPreventConfirmation()
Save the save the switch to prevent the navigation confirmation.
registerForcedFeedbackNavUrl($forcedFeedbackNavUrl)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
+ Here is the call graph for this function:

◆ showQuestionCmd()

ilTestOutputGUI::showQuestionCmd ( )
protected

Definition at line 326 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ilLOTestQuestionAdapter\getInstance(), ilTestPlayerAbstractGUI\getInstantResponseParameter(), ilTestPlayerAbstractGUI\getQuestionGuiInstance(), ilTestPlayerAbstractGUI\getRegisteredForcedFeedbackNavUrl(), ilTestPlayerAbstractGUI\getTestNavigationToolbarGUI(), handlePrimaryButton(), handleTearsAndAngerNoObjectiveOrientedQuestion(), ilTestPlayerAbstractGUI\handleTearsAndAngerQuestionIsNull(), ILIAS\Repository\help(), ilTestPlayerAbstractGUI\isForcedFeedbackNavUrlRegistered(), ilTestPlayerAbstractGUI\isParticipantsAnswerFixed(), ilObjTest\isQuestionObligatory(), isValidSequenceElement(), ILIAS\Repository\lng(), ILIAS\Repository\object(), ilTestPlayerAbstractGUI\populateInstantResponseBlocks(), ilTestPlayerAbstractGUI\populateInstantResponseModal(), ilTestPlayerAbstractGUI\populateQuestionNavigation(), populateQuestionOptionalMessage(), ilTestPlayerAbstractGUI\populateTestNavigationToolbar(), ilTestPlayerAbstractGUI\prepareTestPage(), ilTestPlayerAbstractGUI\PRESENTATION_MODE_EDIT, ilTestPlayerAbstractGUI\PRESENTATION_MODE_VIEW, ilSession\set(), ilTestPlayerAbstractGUI\showQuestionEditable(), ilTestPlayerAbstractGUI\showQuestionViewable(), ilTestPlayerCommands\SUBMIT_INTERMEDIATE_SOLUTION, and ilTestPlayerAbstractGUI\unregisterForcedFeedbackNavUrl().

326  : void
327  {
328  ilSession::set('tst_pass_finish', 0);
329 
331  "active_time_id",
332  $this->object->startWorkingTime(
333  $this->test_session->getActiveId(),
334  $this->test_session->getPass()
335  )
336  );
337 
338  $this->help->setScreenIdComponent("tst");
339  $this->help->setScreenId("assessment");
340  $this->help->setSubScreenId("question");
341 
342  $sequence_element = $this->getCurrentSequenceElement();
343 
344  if (!$this->isValidSequenceElement($sequence_element)) {
345  $sequence_element = $this->testSequence->getFirstSequence();
346  }
347 
348  $this->test_session->setLastSequence($sequence_element ?? 0);
349  $this->test_session->saveToDb();
350 
351  $questionId = $this->testSequence->getQuestionForSequence($sequence_element ?? 0);
352 
353  if (!(int) $questionId && $this->test_session->isObjectiveOriented()) {
355  }
356 
357  if ($questionId !== null && !$this->testSequence->isQuestionPresented($questionId)) {
358  $this->testSequence->setQuestionPresented($questionId);
359  $this->testSequence->saveToDb();
360  }
361 
362  $isQuestionWorkedThrough = $this->questioninfo->lookupResultRecordExist(
363  $this->test_session->getActiveId(),
364  $questionId,
365  $this->test_session->getPass()
366  );
367 
368  // fau: testNav - always use edit mode, except for fixed answer
369  $instant_response = false;
370  if ($this->isParticipantsAnswerFixed($questionId)) {
372  $s = $this->object->getMainSettings()->getQuestionBehaviourSettings();
373  if ($s->getInstantFeedbackGenericEnabled()
374  || $s->getInstantFeedbackPointsEnabled()
375  || $s->getInstantFeedbackSolutionEnabled()
376  || $s->getInstantFeedbackSpecificEnabled()) {
377  $instant_response = true;
378  }
379  } else {
381  // #37025 don't show instant response if a request for it should fix the answer and answer is not yet fixed
382  if (!$this->object->isInstantFeedbackAnswerFixationEnabled()) {
383  $instant_response = $this->getInstantResponseParameter();
384  }
385  }
386  // fau.
387 
388  $questionGui = $this->getQuestionGuiInstance($questionId);
389 
390  if (!($questionGui instanceof assQuestionGUI)) {
391  $this->handleTearsAndAngerQuestionIsNull($questionId, $sequence_element);
392  }
393 
394  $questionGui->setSequenceNumber($this->testSequence->getPositionOfSequence($sequence_element));
395  $questionGui->setQuestionCount($this->testSequence->getUserQuestionCount());
396 
397  $headerBlockBuilder = new ilTestQuestionHeaderBlockBuilder($this->lng);
398  $headerBlockBuilder->setHeaderMode($this->object->getTitleOutput());
399  $headerBlockBuilder->setQuestionTitle($questionGui->object->getTitleForHTMLOutput());
400  $headerBlockBuilder->setQuestionPoints($questionGui->object->getPoints());
401  $headerBlockBuilder->setQuestionPosition($this->testSequence->getPositionOfSequence($sequence_element));
402  $headerBlockBuilder->setQuestionCount($this->testSequence->getUserQuestionCount());
403  $headerBlockBuilder->setQuestionPostponed($this->testSequence->isPostponedQuestion($questionId));
404  $headerBlockBuilder->setQuestionObligatory(
405  $this->object->areObligationsEnabled() && ilObjTest::isQuestionObligatory($questionGui->object->getId())
406  );
407  if ($this->test_session->isObjectiveOriented()) {
408  $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->test_session);
409  $objectivesAdapter->buildQuestionRelatedObjectiveList($this->testSequence, $this->question_related_objectives_list);
410  $this->question_related_objectives_list->loadObjectivesTitles();
411 
412  $objectivesString = $this->question_related_objectives_list->getQuestionRelatedObjectiveTitles($questionId);
413  $headerBlockBuilder->setQuestionRelatedObjectives($objectivesString);
414  }
415  $questionGui->setQuestionHeaderBlockBuilder($headerBlockBuilder);
416 
417  $this->prepareTestPage($sequence_element, $questionId);
418 
419  $navigationToolbarGUI = $this->getTestNavigationToolbarGUI();
420  $navigationToolbarGUI->setFinishTestButtonEnabled(true);
421 
422  $isNextPrimary = $this->handlePrimaryButton($navigationToolbarGUI, $questionId);
423 
424  $this->ctrl->setParameter($this, 'sequence', $sequence_element);
425  $this->ctrl->setParameter($this, 'pmode', $presentationMode);
426  $formAction = $this->ctrl->getFormAction($this, ilTestPlayerCommands::SUBMIT_INTERMEDIATE_SOLUTION);
427 
428  switch ($presentationMode) {
430 
431  // fau: testNav - enable navigation toolbar in edit mode
432  $navigationToolbarGUI->setDisabledStateEnabled(false);
433  // fau.
434  $this->showQuestionEditable($questionGui, $formAction, $isQuestionWorkedThrough, $instant_response);
435 
436  break;
437 
439 
440  if ($this->testSequence->isQuestionOptional($questionGui->object->getId())) {
442  }
443 
444  $this->showQuestionViewable($questionGui, $formAction, $isQuestionWorkedThrough, $instant_response);
445 
446  break;
447 
448  default:
449  throw new ilTestException('no presentation mode given');
450  }
451 
452  $navigationToolbarGUI->build();
453  $this->populateTestNavigationToolbar($navigationToolbarGUI);
454 
455  // fau: testNav - enable the question navigation in edit mode
456  $this->populateQuestionNavigation($sequence_element, $isNextPrimary);
457  // fau.
458 
459  if ($instant_response) {
460  // fau: testNav - always use authorized solution for instant feedback
462  $questionGui,
463  true
464  );
465  // fau.
466  }
467 
468  // fau: testNav - add feedback modal
469  if ($this->isForcedFeedbackNavUrlRegistered()) {
472  }
473  // fau.
474  }
getQuestionGuiInstance($question_id, $fromCache=true)
populateQuestionOptionalMessage()
showQuestionEditable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
populateTestNavigationToolbar(ilTestNavigationToolbarGUI $toolbar_gui)
Base Exception for all Exceptions relating to Modules/Test.
populateInstantResponseBlocks(assQuestionGUI $questionGui, $authorizedSolution)
static isQuestionObligatory($question_id)
checks wether the question with given id is marked as obligatory or not
isValidSequenceElement($sequence_element)
populateQuestionNavigation($sequence_element, $primary_next)
static getInstance(ilTestSession $a_test_session)
handlePrimaryButton(ilTestNavigationToolbarGUI $navigationToolbarGUI, int $currentQuestionId)
Basic GUI class for assessment questions.
showQuestionViewable(assQuestionGUI $questionGui, $formAction, $isQuestionWorkedThrough, $instantResponse)
populateInstantResponseModal(assQuestionGUI $questionGui, $navUrl)
handleTearsAndAngerQuestionIsNull(int $question_id, $sequence_element)
static set(string $a_var, $a_val)
Set a value.
prepareTestPage($sequenceElement, $questionId)
+ Here is the call graph for this function:

◆ skipQuestionCmd()

ilTestOutputGUI::skipQuestionCmd ( )
protected

Definition at line 578 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), isValidSequenceElement(), ILIAS\Repository\object(), and ilTestPlayerCommands\SHOW_QUESTION.

579  {
580  $curSequenceElement = $this->getCurrentSequenceElement();
581  $nextSequenceElement = $this->testSequence->getNextSequence($curSequenceElement);
582 
583  if (!$this->isValidSequenceElement($nextSequenceElement)) {
584  $nextSequenceElement = $this->testSequence->getFirstSequence();
585  }
586 
587  if ($this->object->isPostponingEnabled()) {
588  $this->testSequence->postponeSequence($curSequenceElement);
589  $this->testSequence->saveToDb();
590  }
591 
592  $this->ctrl->setParameter($this, 'sequence', $nextSequenceElement);
593  $this->ctrl->setParameter($this, 'pmode', '');
594 
595  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
596  }
isValidSequenceElement($sequence_element)
+ Here is the call graph for this function:

◆ startTestCmd()

ilTestOutputGUI::startTestCmd ( )
protected

Definition at line 222 of file class.ilTestOutputGUI.php.

References adoptUserSolutionsFromPreviousPass(), ILIAS\Repository\ctrl(), generateRandomTestPassForActiveUser(), ilSession\get(), ilLOTestQuestionAdapter\getInstance(), ilTestServiceGUI\getObjectiveOrientedContainer(), ILIAS\Repository\object(), ilTestPlayerCommands\QUESTION_SUMMARY, ilSession\set(), ilTestPlayerCommands\SHOW_QUESTION, updateLearningProgressOnTestStart(), and ILIAS\Repository\user().

223  {
224  ilSession::set('tst_pass_finish', 0);
225 
226  // ensure existing test session
227  $this->test_session->setUserId($this->user->getId());
228  $access_code = ilSession::get('tst_access_code');
229  if ($access_code != null && isset($access_code[$this->object->getTestId()])) {
230  $this->test_session->setAnonymousId($access_code[$this->object->getTestId()]);
231  }
232  if ($this->getObjectiveOrientedContainer()->isObjectiveOrientedPresentationRequired()) {
233  $this->test_session->setObjectiveOrientedContainerId($this->getObjectiveOrientedContainer()->getObjId());
234  }
235  $this->test_session->saveToDb();
236 
237  $active_id = $this->test_session->getActiveId();
238  $this->ctrl->setParameter($this, "active_id", $active_id);
239 
240  $shuffle = $this->object->getShuffleQuestions();
241  if ($this->object->isRandomTest()) {
243 
244  $this->object->loadQuestions();
245  $shuffle = false; // shuffle is already done during the creation of the random questions
246  }
247 
248  $this->object->updateTestPassResults(
249  $active_id,
250  $this->test_session->getPass(),
251  $this->object->areObligationsEnabled(),
252  null,
253  $this->object->getId()
254  );
255 
256  // ensure existing test sequence
257  if (!$this->testSequence->hasSequence()) {
258  $this->testSequence->createNewSequence($this->object->getQuestionCount(), $shuffle);
259  $this->testSequence->saveToDb();
260  }
261 
262  $this->testSequence->loadFromDb();
263  $this->testSequence->loadQuestions();
264 
265  if ($this->test_session->isObjectiveOriented()) {
266  $objectivesAdapter = ilLOTestQuestionAdapter::getInstance($this->test_session);
267 
268  $objectivesAdapter->notifyTestStart($this->test_session, $this->object->getId());
269  $objectivesAdapter->prepareTestPass($this->test_session, $this->testSequence);
270 
271  $objectivesAdapter->buildQuestionRelatedObjectiveList(
272  $this->testSequence,
273  $this->question_related_objectives_list
274  );
275 
276  if ($this->testSequence->hasOptionalQuestions()) {
278 
279  $this->testSequence->reorderOptionalQuestionsToSequenceEnd();
280  $this->testSequence->saveToDb();
281  }
282  }
283 
284  $active_time_id = $this->object->startWorkingTime(
285  $this->test_session->getActiveId(),
286  $this->test_session->getPass()
287  );
288  ilSession::set("active_time_id", $active_time_id);
289 
291 
292  $sequence_element = $this->testSequence->getFirstSequence();
293 
294  $this->ctrl->setParameter($this, 'sequence', $sequence_element);
295  $this->ctrl->setParameter($this, 'pmode', '');
296 
297  if ($this->object->getListOfQuestionsStart()) {
298  $this->ctrl->redirect($this, ilTestPlayerCommands::QUESTION_SUMMARY);
299  }
300 
301  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
302  }
static get(string $a_var)
static getInstance(ilTestSession $a_test_session)
static set(string $a_var, $a_val)
Set a value.
+ Here is the call graph for this function:

◆ submitSolutionAndNextCmd()

ilTestOutputGUI::submitSolutionAndNextCmd ( )
protected

Definition at line 482 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), isValidSequenceElement(), ILIAS\Repository\object(), ilTestPlayerAbstractGUI\removeIntermediateSolution(), saveQuestionSolution(), ilTestPlayerCommands\SHOW_QUESTION, and submitSolutionCmd().

483  {
484  if ($this->object->isForceInstantFeedbackEnabled()) {
485  $this->submitSolutionCmd();
486  return;
487  }
488 
489  if ($this->saveQuestionSolution(true, false)) {
490  $questionId = $this->testSequence->getQuestionForSequence(
492  );
493 
495 
496  $nextSequenceElement = $this->testSequence->getNextSequence($this->getCurrentSequenceElement());
497 
498  if (!$this->isValidSequenceElement($nextSequenceElement)) {
499  $nextSequenceElement = $this->testSequence->getFirstSequence();
500  }
501 
502  $this->test_session->setLastSequence($nextSequenceElement ?? 0);
503  $this->test_session->saveToDb();
504 
505  $this->ctrl->setParameter($this, 'sequence', $nextSequenceElement);
506  $this->ctrl->setParameter($this, 'pmode', '');
507  }
508 
509  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
510  }
isValidSequenceElement($sequence_element)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
+ Here is the call graph for this function:

◆ submitSolutionCmd()

ilTestOutputGUI::submitSolutionCmd ( )
protected

Definition at line 512 of file class.ilTestOutputGUI.php.

References ILIAS\Repository\ctrl(), ilTestPlayerAbstractGUI\getCurrentSequenceElement(), ilTestPlayerAbstractGUI\getNavigationUrlParameter(), ilTestPlayerAbstractGUI\getNextCommandParameter(), ilTestPlayerAbstractGUI\getNextSequenceParameter(), ILIAS\Repository\object(), ilTestPlayerAbstractGUI\PRESENTATION_MODE_VIEW, ilUtil\redirect(), ilTestPlayerAbstractGUI\removeIntermediateSolution(), ilTestPlayerAbstractGUI\saveNavigationPreventConfirmation(), saveQuestionSolution(), and ilTestPlayerCommands\SHOW_QUESTION.

Referenced by submitSolutionAndNextCmd().

513  {
514  if ($this->saveQuestionSolution(true, false)) {
515  $questionId = $this->testSequence->getQuestionForSequence(
517  );
518 
520 
521  if ($this->object->isForceInstantFeedbackEnabled()) {
522  $this->ctrl->setParameter($this, 'instresp', 1);
523 
524  $this->testSequence->setQuestionChecked($questionId);
525  $this->testSequence->saveToDb();
526  }
527 
528  if ($this->getNextCommandParameter()) {
529  if ($this->getNextSequenceParameter()) {
530  $this->ctrl->setParameter($this, 'sequence', $this->getNextSequenceParameter());
531  $this->ctrl->setParameter($this, 'pmode', '');
532  }
533 
534  $this->ctrl->redirect($this, $this->getNextCommandParameter());
535  }
536 
537  $this->ctrl->setParameter($this, 'pmode', ilTestPlayerAbstractGUI::PRESENTATION_MODE_VIEW);
538  } else {
539  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
540  }
541 
542  // fau: testNav - remember to prevent the navigation confirmation
544  // fau.
545 
546  // fau: testNav - handle navigation after saving
547  if ($this->getNavigationUrlParameter()) {
549  } else {
550  $this->ctrl->saveParameter($this, 'sequence');
551  }
552  // fau.
553  $this->ctrl->redirect($this, ilTestPlayerCommands::SHOW_QUESTION);
554  }
saveNavigationPreventConfirmation()
Save the save the switch to prevent the navigation confirmation.
static redirect(string $a_script)
saveQuestionSolution($authorized=true, $force=false)
saves the user input of a question
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ updateLearningProgressOnTestStart()

ilTestOutputGUI::updateLearningProgressOnTestStart ( )
protected

Definition at line 304 of file class.ilTestOutputGUI.php.

References ilLPStatusWrapper\_updateStatus(), ILIAS\Repository\object(), and ILIAS\Repository\user().

Referenced by startTestCmd().

305  {
306  ilLPStatusWrapper::_updateStatus($this->object->getId(), $this->user->getId());
307  }
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Field Documentation

◆ $question_related_objectives_list

ilTestQuestionRelatedObjectivesList ilTestOutputGUI::$question_related_objectives_list
protected

Definition at line 37 of file class.ilTestOutputGUI.php.

◆ $save_result

bool ilTestOutputGUI::$save_result
protected

Definition at line 38 of file class.ilTestOutputGUI.php.

Referenced by saveQuestionSolution().


The documentation for this class was generated from the following file: