19 declare(strict_types=1);
55 $question_id = $this->testrequest->getQuestionId();
56 if ($question_id !== 0) {
59 $this->test_access =
new ilTestAccess($test_obj->getRefId());
64 if (!$this->test_access->checkCorrectionsAccess()
65 || $this->question_gui !==
null 67 ilObjTestGUI::accessViolationRedirect();
70 if ($this->testrequest->isset(
'removeQid') && (
int) $this->testrequest->raw(
'removeQid')) {
71 $this->confirmQuestionRemoval();
75 $this->
ctrl->saveParameterByClass(self::class,
'q_id');
76 $command = $this->
ctrl->getCmd(
'showQuestionList');
87 $this->main_tpl->setContent($form->getHTML());
93 $form->setFormAction($this->
ctrl->getFormAction($this));
94 $form->setId(
'tst_question_correction');
96 $form->setTitle($this->
language->txt(
'tst_corrections_qst_form'));
106 $scoring->setQuestionId($question_gui->
getObject()->getId());
108 if ($scoring->getNumManualScorings()) {
109 $form->addCommandButton(
'confirmManualScoringReset', $this->
language->txt(
'save'));
111 $form->addCommandButton(
'saveQuestion', $this->
language->txt(
'save'));
127 $scoring->setQuestionId($this->question_gui->getObject()->getId());
129 $confirmation = sprintf(
130 $this->
language->txt(
'tst_corrections_manscore_reset_warning'),
131 $scoring->getNumManualScorings(),
132 $this->question_gui->getObject()->getTitleForHTMLOutput(),
133 $this->question_gui->getObject()->getId()
137 $gui->setHeaderText($confirmation);
138 $gui->setFormAction($this->
ctrl->getFormAction($this));
139 $gui->setCancel($this->
language->txt(
'cancel'),
'showQuestion');
140 $gui->setConfirm($this->
language->txt(
'confirm'),
'saveQuestion');
144 $this->main_tpl->setContent($gui->getHTML());
151 $form->setValuesByPost();
153 if (!$form->checkInput()) {
162 $question->setPoints($question_gui->
getObject()->getMaximumPoints());
172 $scoring->setPreserveManualScores(
false);
173 $scoring->setQuestionId($question_gui->
getObject()->getId());
174 $scoring->recalculateSolutions();
176 if ($this->
logger->isLoggingEnabled()) {
177 $this->
logger->logQuestionAdministrationInteraction(
178 $question_gui->
getObject()->toQuestionAdministrationInteraction(
179 $this->
logger->getAdditionalInformationGenerator(),
180 $this->test_obj->getRefId(),
186 $this->main_tpl->setOnScreenMessage(
'success', $this->
language->txt(
'saved_successfully'),
true);
187 $this->
ctrl->redirectByClass([ilObjTestGUI::class, self::class],
'showQuestion');
195 $this->
ctrl->getLinkTargetByClass(ilObjTestGUI::class,
'downloadFile')
197 $page_gui->setRenderPageContainer(
false);
198 $page_gui->setEditPreview(
true);
199 $page_gui->setEnabledTabs(
false);
213 $page_gui->setQuestionHTML([$question_gui->
getObject()->getId() => $solution_html]);
214 $page_gui->setPresentationTitle($question_gui->
getObject()->getTitleForHTMLOutput());
216 $tpl =
new ilTemplate(
'tpl.tst_corrections_solution_presentation.html',
true,
true,
'components/ILIAS/Test');
217 $tpl->setVariable(
'SOLUTION_PRESENTATION', $page_gui->preview());
222 $this->main_tpl->setContent($tpl->get());
224 $this->main_tpl->setCurrentBlock(
"ContentStyle");
225 $this->main_tpl->setVariable(
226 "LOCATION_CONTENT_STYLESHEET",
229 $this->main_tpl->parseCurrentBlock();
231 $this->main_tpl->setCurrentBlock(
"SyntaxStyle");
232 $this->main_tpl->setVariable(
233 "LOCATION_SYNTAX_STYLESHEET",
236 $this->main_tpl->parseCurrentBlock();
244 $solutions = $participant_results
246 : $this->
getSolutions($this->question_gui->getObject());
252 foreach ($this->question_gui->getSubQuestionsIndex() as $subQuestionIndex) {
253 $table = $this->question_gui->getAnswerFrequencyTableGUI(
255 'showAnswerStatistic',
260 $tablesHtml .= $table->getHTML() . $table->getAdditionalHtml();
264 $this->main_tpl->setContent($tablesHtml);
274 ))->buildAddAnswerModal(
'')
275 ->withRequest($this->testrequest->getRequest());
277 $data = $form->getData();
279 $question_index =
$data[
'question_index'];
280 $answer_value =
$data[
'answer_value'];
281 $points =
$data[
'points'];
284 $this->main_tpl->setOnScreenMessage(
'failure', $this->
language->txt(
'err_no_numeric_value'));
289 $question = $this->question_gui->getObject();
290 if ($question->isAddableAnswerOptionValue($question_index, $answer_value)) {
291 $question->addAnswerOptionValue($question_index, $answer_value, $points);
292 $question->saveToDb();
301 $scoring->setPreserveManualScores(
true);
302 $scoring->setQuestionId($question_index);
303 $participant_results = $scoring->recalculateSolutions();
305 if ($this->
logger->isLoggingEnabled()) {
306 $this->
logger->logQuestionAdministrationInteraction(
307 $question->toQuestionAdministrationInteraction(
308 $this->logger->getAdditionalInformationGenerator(),
309 $this->test_obj->getRefId(),
315 $this->main_tpl->setOnScreenMessage(
'success', $this->
language->txt(
'saved_successfully'));
321 foreach ($array as $name => $value) {
322 if ($name ==
'cmd' && !count($curPath)) {
326 if (count($curPath)) {
330 if (is_array($value)) {
331 $nextPath = array_merge($curPath, [$name]);
334 $postVar = implode(
'', $curPath) . $name;
342 $this->
tabs->clearTargets();
343 $this->
tabs->clearSubTabs();
345 $this->
help->setScreenIdComponent(
'tst');
346 $this->
help->setScreenId(
'scoringadjust');
347 $this->
help->setSubScreenId($active_tab_id);
349 $this->
ctrl->setParameterByClass(self::class,
'q_id', $question_gui->
getObject()->getId());
352 $this->
language->txt(
'tst_corrections_tab_question'),
353 $this->
ctrl->getLinkTargetByClass([ilObjTestGUI::class, self::class],
'showQuestion')
358 $this->
language->txt(
'tst_corrections_tab_solution'),
359 $this->
ctrl->getLinkTargetByClass([ilObjTestGUI::class, self::class],
'showSolution')
365 $this->
language->txt(
'tst_corrections_tab_statistics'),
366 $this->
ctrl->getLinkTargetByClass([ilObjTestGUI::class, self::class],
'showAnswerStatistic')
370 $this->
tabs->setBackTarget(
372 $this->
ctrl->getLinkTargetByClass(ilObjTestGUI::class,
'showQuestions')
375 $this->
tabs->activateTab($active_tab_id);
380 $this->main_tpl->setTitle($question_gui->
getObject()->getTitleForHTMLOutput());
386 if (!$this->test_obj->isTestQuestion($this->question_gui->getObject()->getId())) {
399 return $this->test_obj->getRefId();
404 $question_gui = assQuestion::instantiateQuestionGUI($question_id);
405 if ($question_gui ===
null) {
409 $question->setPoints($question_gui->
getObject()->getMaximumPoints());
418 foreach (array_keys($this->test_obj->getParticipants()) as $active_id) {
420 $passes_selector->setActiveId($active_id);
421 $passes_selector->loadLastFinishedPass();
423 foreach ($passes_selector->getClosedPasses() as $pass) {
425 $solution_rows[] = $row;
430 return $solution_rows;
440 foreach ($participant_results as $active_id => $result) {
441 foreach ($result->getPasses() as $pass) {
454 if (!$this->test_obj->getGlobalSettings()->isAdjustingQuestionsWithResultsAllowed()) {
459 $this->test_obj->getTestQuestions(),
460 function (array
$c, array $v): array {
saveCorrectionsFormProperties(ilPropertyFormGUI $form)
getSolutionValues(int $active_id, ?int $pass=null, bool $authorized=true)
Loads solutions of a given user from the database an returns it.
ilTestAccess $test_access
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
showAnswerStatistic(?array $participant_results=null)
setObject(assQuestion $question)
addHiddenItem(string $a_post_var, string $a_value)
showQuestion(?ilPropertyFormGUI $form=null)
isAnswerFrequencyStatisticSupported()
prepareReprintableCorrectionsForm(ilPropertyFormGUI $form)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
populateCorrectionsFormProperties(ilPropertyFormGUI $form)
TestQuestionAdministrationInteractionTypes
__construct(private readonly ilDBInterface $database, private readonly ilCtrlInterface $ctrl, private readonly ilLanguage $language, private readonly ilTabsGUI $tabs, private readonly ilHelpGUI $help, private readonly UIFactory $ui_factory, private readonly ilGlobalTemplateInterface $main_tpl, private readonly RefineryFactory $refinery, private readonly TestLogger $logger, private readonly RequestDataCollector $testrequest, private readonly ilObjTest $test_obj, private readonly ilObjUser $scorer,)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
assQuestionGUI $question_gui
getSolutions(assQuestion $question)
getQuestionGUI(int $question_id)
static getSyntaxStylePath()
confirmManualScoringReset()
setCorrectionTabsContext(assQuestionGUI $question_gui, string $active_tab_id)
static getContentStylePath(int $a_style_id, bool $add_random=true, bool $add_token=true)
get content style path static (to avoid full reading)
supportsAdjustment(\assQuestionGUI $question_object)
Returns if the given question object support scoring adjustment.
addHiddenItemsFromArray(ilConfirmationGUI $gui, $array, $curPath=[])
setFileDownloadLink(string $a_download_link)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getSolutionsByParticipantResults(assQuestion $question, array $participant_results)
buildQuestionCorrectionForm(assQuestionGUI $question_gui)
language()
description: > Example for rendring a language glyph.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getSolutionOutput(int $active_id, ?int $pass=null, bool $graphical_output=false, bool $result_output=false, bool $show_question_only=true, bool $show_feedback=false, bool $show_correct_solution=false, bool $show_manual_scoring=false, bool $show_question_text=true, bool $show_inline_feedback=true)
populatePageTitleAndDescription(assQuestionGUI $question_gui)