19declare(strict_types=1);
60 $this->
object->getTestLogger()
76 $cmd = $this->
ctrl->getCmd(self::DEFAULT_CMD);
77 $next_class = $this->
ctrl->getNextClass($this);
78 $this->
ctrl->saveParameter($this,
'sequence');
79 $this->
ctrl->saveParameter($this,
'active_id');
81 switch ($next_class) {
82 case 'iltestpassdetailsoverviewtablegui':
84 $this->
ctrl->forwardCommand($tableGUI);
88 if (in_array($cmd, [
'excel_scored_test_run',
'excel_all_test_runs'])) {
89 $ret = $this->exportEvaluation($cmd);
90 } elseif (in_array($cmd, [
'excel_all_test_runs_a'])) {
91 $ret = $this->exportAggregatedResults($cmd);
108 if ($original_id > 0) {
118 if ($this->
object->getShowSolutionAnswersOnly()) {
126 $this->
ctrl->saveParameterByClass(self::class,
'active_ids');
127 $this->global_screen->tool()->context()->current()->addAdditionalData(
128 PrintLayoutProvider::TEST_CONTEXT_PRINT,
132 $selected_active_ids = explode(
',', $this->testrequest->strVal(
'active_ids'));
133 $results_panel = $this->ui_factory->panel()->report(
134 $this->
lng->txt(
'tst_results'),
136 function (
string $v): SubPanel {
140 return $this->ui_factory->panel()->sub(
152 $this->tpl->setVariable(
154 $this->ui_renderer->render([
156 $this->ui_factory->legacy()->content(
'')->withAdditionalOnLoadCode(
157 fn(
string $id):
string =>
'setTimeout(() => {window.print();}, 50)'
166 $this->
ctrl->saveParameterByClass(self::class,
'active_ids');
167 $selected_active_ids = explode(
',', $this->testrequest->strVal(
'active_ids'));
172 $current_active_id = (
int) $selected_active_ids[0];
173 if (count($selected_active_ids) > 1
174 && ($selected_active_id = $this->testrequest->getActiveId()) > 0
175 && array_search($selected_active_id, $selected_active_ids) !==
false) {
176 $current_active_id = $selected_active_id;
179 if ($this->testrequest->isset(
'attempt')) {
180 $attempt_id = $this->testrequest->int(
'attempt');
185 $results_panel = $this->ui_factory->panel()->report(
190 $this->buildAttemptComponents($current_active_id, $attempt_id,
true,
false)
193 $attempts_ids_array = $this->results_data_factory->getAttemptIdsArrayFor(
198 if (count($attempts_ids_array) > 1) {
199 $results_panel = $results_panel->withViewControls([
207 if (count($selected_active_ids) > 1) {
211 $this->tpl->setVariable(
213 $this->ui_renderer->render($results_panel)
216 $this->
tabs->setBackTarget(
217 $this->
lng->txt(
'back'),
218 $this->ctrl->getLinkTargetByClass([
'ilTestParticipantsGUI'])
224 $this->
tabs->clearSubTabs();
225 $this->
tabs->setBackTarget($this->
lng->txt(
'tst_results_back_overview'), $this->ctrl->getLinkTarget($this));
227 $test_session = $this->test_session_factory->getSession();
229 if (!$this->
object->getShowPassDetails()) {
230 $this->
ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, ilInfoScreenGUI::class]);
233 $active_id = $test_session->getActiveId();
234 $user_id = $test_session->getUserId();
236 $this->
ctrl->saveParameter($this,
'pass');
237 $pass = $this->testrequest->int(
'pass');
239 $test_result_header_label_builder =
new ResultsTitlesBuilder($this->
lng, $this->obj_cache);
241 $objectives_list =
null;
243 $consider_hidden_questions =
true;
244 $consider_optional_questions =
true;
247 $consider_hidden_questions =
false;
248 $consider_optional_questions =
true;
250 $test_sequence = $this->test_sequence_factory->getSequenceByActiveIdAndPass($active_id, $pass);
251 $test_sequence->loadFromDb();
252 $test_sequence->loadQuestions();
254 if ($this->
object->isRandomTest() && !$test_sequence->isAnsweringOptionalQuestionsConfirmed()) {
255 $consider_optional_questions =
false;
261 $objectives_list->loadObjectivesTitles();
263 $test_result_header_label_builder->setObjectiveOrientedContainerId($test_session->getObjectiveOrientedContainerId());
264 $test_result_header_label_builder->setUserId($test_session->getUserId());
265 $test_result_header_label_builder->setTestObjId($this->
object->getId());
266 $test_result_header_label_builder->setTestRefId($this->
object->getRefId());
267 $test_result_header_label_builder->initObjectiveOrientedMode();
270 $tpl =
new ilTemplate(
'tpl.il_as_tst_pass_details_overview_participants.html',
true,
true,
'components/ILIAS/Test');
282 if ($this->
object->isShowExamIdInTestResultsEnabled()) {
283 if ($this->
object->isShowExamIdInTestResultsEnabled()) {
285 $test_session->getActiveId(),
295 $grading_message_builder->buildMessage();
296 $grading_message_builder->sendMessage();
299 $data = $this->
object->getCompleteEvaluationData();
300 $reached =
$data->getParticipant($active_id)->getPass($pass)->getReachedPoints();
301 $max =
$data->getParticipant($active_id)->getPass($pass)->getMaxPoints();
302 $percent = $max ? $reached / $max * 100.0 : 0;
303 $result =
$data->getParticipant($active_id)->getPass($pass)->getReachedPoints() .
' ' . strtolower($this->
lng->txt(
'of')) .
' ' .
$data->getParticipant($active_id)->getPass($pass)->getMaxPoints() .
' (' . sprintf(
'%2.2f', $percent) .
' %' .
')';
305 $tpl->
setVariable(
'TOTAL_RESULT_TEXT', $this->
lng->txt(
'tst_stat_result_resultspoints'));
309 $tpl->
setVariable(
'TEXT_RESULTS', $test_result_header_label_builder->getPassDetailsHeaderLabel($pass + 1));
317 $settings = $this->results_presentation_factory->getAttemptResultsSettings(
321 $table = $this->results_presentation_factory->getAttemptResultsPresentationTable(
322 $this->results_data_factory->getAttemptResultsFor(
330 $this->buildResultsTitle($this->user->getFullname(), $pass),
338 $this->tpl->setContent(
345 $test_session = $this->test_session_factory->getSession();
346 $active_id = $test_session->getActiveId();
348 $uname = $this->
object->userLookupFullName(
$user_id,
true);
350 if (!$this->
object->canShowTestResults($test_session)) {
351 $this->
ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, ilInfoScreenGUI::class]);
354 $templatehead =
new ilTemplate(
'tpl.il_as_tst_results_participants.html',
true,
true,
'components/ILIAS/Test');
355 $template =
new ilTemplate(
'tpl.il_as_tst_results_participant.html',
true,
true,
'components/ILIAS/Test');
363 $test_result_header_label_builder =
new ResultsTitlesBuilder($this->
lng, $this->obj_cache);
365 $test_result_header_label_builder->setObjectiveOrientedContainerId($test_session->getObjectiveOrientedContainerId());
366 $test_result_header_label_builder->setUserId($test_session->getUserId());
367 $test_result_header_label_builder->setTestObjId($this->
object->getId());
368 $test_result_header_label_builder->setTestRefId($this->
object->getRefId());
369 $test_result_header_label_builder->initObjectiveOrientedMode();
372 $template->setCurrentBlock(
'pass_overview');
375 $test_passes_selector->setActiveId($test_session->getActiveId());
376 $test_passes_selector->setLastFinishedPass($test_session->getLastFinishedPass());
379 $pass_overview_table_gui->setActiveId($test_session->getActiveId());
380 $pass_overview_table_gui->setResultPresentationEnabled(
true);
381 if ($this->
object->getShowPassDetails()) {
382 $pass_overview_table_gui->setPassDetailsCommand(
'outUserPassDetails');
384 if ($this->
object->isPassDeletionAllowed()) {
385 $pass_overview_table_gui->setPassDeletionCommand(
'confirmDeletePass');
387 $pass_overview_table_gui->init();
388 $pass_overview_table_gui->setData($this->
getPassOverviewTableData($test_session, $test_passes_selector->getReportablePasses(),
true));
389 $pass_overview_table_gui->setTitle($test_result_header_label_builder->getPassOverviewHeaderLabel());
390 $overview = $pass_overview_table_gui->getHTML();
400 $lo_status->setUsrId($test_session->getUserId());
401 $overview .=
'<br />' . $lo_status->getHTML();
403 $template->setVariable(
'PASS_OVERVIEW', $overview);
404 $template->parseCurrentBlock();
408 $grading_message_builder->buildMessage();
409 $grading_message_builder->sendMessage();
415 if ($this->
object->getAnonymity()) {
416 $template->setVariable(
'TEXT_HEADING', $this->
lng->txt(
'tst_result'));
418 $template->setVariable(
'TEXT_HEADING', sprintf($this->
lng->txt(
'tst_result_user_name'), $uname));
419 $template->setVariable(
'USER_DATA', $user_data);
424 $templatehead->setVariable(
'RESULTS_PARTICIPANT', $template->get());
425 $this->tpl->setContent($templatehead->get());
430 if (!$this->
object->getShowSolutionPrintview()) {
431 $this->tpl->setOnScreenMessage(
'info', $this->
lng->txt(
'no_permission'),
true);
432 $this->
ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, ilInfoScreenGUI::class]);
435 $template =
new ilTemplate(
'tpl.il_as_tst_info_list_of_answers.html',
true,
true,
'components/ILIAS/Test');
439 $test_session = $this->test_session_factory->getSession();
440 $active_id = $test_session->getActiveId();
442 if ($this->testrequest->isset(
'attempt')) {
443 $attempt = $this->testrequest->int(
'attempt');
449 $test_passes_selector->setActiveId($test_session->getActiveId());
450 $test_passes_selector->setLastFinishedPass($test_session->getLastFinishedPass());
452 if (count($test_passes_selector->getClosedPasses()) > 1) {
458 $test_result_header_label_builder =
new ResultsTitlesBuilder($this->
lng, $this->obj_cache);
459 $test_result_header_label_builder->setAttemptLastAccessDate(
460 (
new \DateTimeImmutable(
461 '@' . ilObjTest::lookupLastTestPassAccess($test_session->getActiveId(), $attempt)
462 ))->setTimezone(
new \DateTimeZone($this->
user->getTimeZone()))
463 ->format($this->user->getDateTimeFormat()->toString())
466 $objectives_list =
null;
468 $test_sequence = $this->test_sequence_factory->getSequenceByActiveIdAndPass($active_id, $attempt);
469 $test_sequence->loadFromDb();
470 $test_sequence->loadQuestions();
475 $objectives_list->loadObjectivesTitles();
477 $test_result_header_label_builder->setObjectiveOrientedContainerId($test_session->getObjectiveOrientedContainerId());
478 $test_result_header_label_builder->setUserId($test_session->getUserId());
479 $test_result_header_label_builder->setTestObjId($this->
object->getId());
480 $test_result_header_label_builder->setTestRefId($this->
object->getRefId());
481 $test_result_header_label_builder->initObjectiveOrientedMode();
484 $result_array = $this->
object->getTestResult(
492 $show_all_answers =
true;
494 $show_all_answers =
false;
507 $test_result_header_label_builder
509 $template->setVariable(
'PASS_DETAILS', $answers);
512 $template->setVariable(
'USER_DATA', $user_data);
513 if (strlen($signature)) {
514 $template->setVariable(
'SIGNATURE', $signature);
516 if (!is_null($attempt) && $this->
object->isShowExamIdInTestResultsEnabled()) {
517 $template->setCurrentBlock(
'exam_id_footer');
519 $test_session->getActiveId(),
522 $template->setVariable(
'EXAM_ID_TXT', $this->
lng->txt(
'exam_id'));
523 $template->parseCurrentBlock();
527 $this->tpl->setVariable(
'ADM_CONTENT', $template->get());
538 $this->
lng->txt(
'error_creating_certificate_pdf')
541 $pdfAction->downloadPdf($this->
user->getId(), $this->object->getId());
546 if ($this->testrequest->isset(
'context') && strlen($this->testrequest->raw(
'context'))) {
547 $context = $this->testrequest->raw(
'context');
552 if (!$this->
object->isPassDeletionAllowed()) {
557 $confirm->build($this->testrequest->getActiveId(
'active_id'), $this->testrequest->int(
'pass'),
$context);
559 $this->tpl->setContent($this->
ctrl->getHTML($confirm));
572 $this->
ctrl->redirect($this,
'outUserResultsOverview');
576 $this->
ctrl->redirectByClass([ilRepositoryGUI::class, ilObjTestGUI::class, ilInfoScreenGUI::class]);
583 $active_fi = $this->testrequest->int(
'active_id');
584 $pass = $this->testrequest->int(
'pass');
586 if (!$this->
object->isPassDeletionAllowed()) {
592 if ($active_fi === 0 || !$this->testrequest->isset(
'pass')) {
593 $this->
ctrl->redirect($this,
'outUserResultsOverview');
597 $this->
ctrl->redirect($this,
'outUserResultsOverview');
601 $result =
$ilDB->query(
"
602 SELECT tst_active.tries, tst_active.last_finished_pass, tst_sequence.pass
604 LEFT JOIN tst_sequence
605 ON tst_sequence.active_fi = tst_active.active_id
606 AND tst_sequence.pass = tst_active.tries
607 WHERE tst_active.active_id = {$ilDB->quote($active_fi, 'integer')}
610 $row =
$ilDB->fetchAssoc($result);
612 $tries = $row[
'tries'];
613 $lastFinishedPass = is_numeric($row[
'last_finished_pass']) ? $row[
'last_finished_pass'] : -1;
615 if ($pass < $lastFinishedPass) {
616 $isActivePass =
false;
617 $must_renumber =
true;
618 } elseif ($pass == $lastFinishedPass) {
619 $isActivePass =
false;
621 if ($tries == $row[
'pass']) {
622 $must_renumber =
true;
624 $must_renumber =
false;
626 } elseif ($pass == $row[
'pass']) {
627 $isActivePass =
true;
628 $must_renumber =
false;
630 throw new ilTestException(
'This should not happen, please contact Bjoern Heyser to clean up this pass salad!');
634 $this->
ctrl->redirect($this,
'outUserResultsOverview');
638 ($lastFinishedPass == 0 && $tries == 1 && $tries != $row[
'pass'])
639 || ($isActivePass ==
true)
652 WHERE active_id = ' .
$ilDB->quote($active_fi,
'integer')
654 } elseif (!$isActivePass) {
657 SET tries = ' .
$ilDB->quote($tries - 1,
'integer') .
',
658 last_finished_pass = ' .
$ilDB->quote($lastFinishedPass - 1,
'integer') .
'
659 WHERE active_id = ' .
$ilDB->quote($active_fi,
'integer')
666 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
667 AND pass = ' .
$ilDB->quote($pass,
'integer')
670 if ($must_renumber) {
672 'UPDATE tst_manual_fb
674 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
675 AND pass > ' .
$ilDB->quote($pass,
'integer')
685 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
686 AND pass = ' .
$ilDB->quote($pass,
'integer')
689 if ($must_renumber) {
691 'UPDATE tst_pass_result
693 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
694 AND pass > ' .
$ilDB->quote($pass,
'integer')
701 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
702 AND pass = ' .
$ilDB->quote($pass,
'integer')
705 if ($must_renumber) {
709 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
710 AND pass > ' .
$ilDB->quote($pass,
'integer')
718 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
719 AND pass = ' .
$ilDB->quote($pass,
'integer')
722 if ($must_renumber) {
724 'UPDATE tst_solutions
726 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
727 AND pass > ' .
$ilDB->quote($pass,
'integer')
735 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
736 AND pass = ' .
$ilDB->quote($pass,
'integer')
739 if ($must_renumber) {
741 'UPDATE tst_test_result
743 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
744 AND pass > ' .
$ilDB->quote($pass,
'integer')
754 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
755 AND pass = ' .
$ilDB->quote($pass,
'integer')
758 if ($must_renumber) {
762 WHERE active_fi = ' .
$ilDB->quote($active_fi,
'integer') .
'
763 AND pass > ' .
$ilDB->quote($pass,
'integer')
767 $this->test_result_repository->updateTestResultCache((
int) $active_fi);
774 $this->
ctrl->redirectByClass(ilTestParticipantsGUI::class);
779 $this->
http->saveResponse($this->
http->response()->withBody(
780 Streams::ofString($page)
782 $this->
http->sendResponse();
783 $this->
http->close();
788 if ($this->
object->getAnonymity()) {
790 $this->
lng->txt(
'tst_eval_results_by_pass_lo'),
795 $this->
lng->txt(
'tst_result_user_name_pass'),
804 bool $with_test_results_overview,
807 $settings = $this->results_presentation_factory->getAttemptResultsSettings(
811 $attempt_overview = $this->ui_factory->panel()->sub(
812 $this->
lng->txt(
'question_summary'),
813 $this->results_data_factory->getAttemptOverviewFor(
818 )->getAsDescriptiveListing(
822 'timezone' =>
new DateTimeZone($this->
user->getTimeZone()),
823 'datetimeformat' => $this->user->getDateTimeFormat()->toString()
828 if ($with_test_results_overview) {
829 $attempt_overview = $attempt_overview->withFurtherInformation(
830 $this->ui_factory->card()->standard($this->lng->txt(
'overview'))->withSections([
831 $this->results_data_factory->getOverviewDataForTest($this->object)
832 ->getAsDescriptiveListing(
840 $results_presentation_table = $this->results_presentation_factory->getAttemptResultsPresentationTable(
841 $this->results_data_factory->getAttemptResultsFor(
851 )->getTableComponent();
854 $signal = $results_presentation_table->getExpandAllSignal();
855 $results_presentation_table = [
856 $results_presentation_table,
857 $this->ui_factory->legacy(
'')->withAdditionalOnLoadCode(
858 fn(
string $id):
string =>
"$(document).trigger('{$signal->getId()}',"
859 .
'{"options" : ' . json_encode($signal->getOptions()) .
'}); '
866 $attempt_details = $this->ui_factory->panel()->sub(
867 $this->
lng->txt(
'details'),
868 $results_presentation_table
871 return [$attempt_overview, $attempt_details];
876 $link = $this->
ctrl->getLinkTargetByClass(self::class,
'printResults');
878 $this->ui_factory->button()->standard(
879 $this->lng->txt(
'print'),
882 fn(
$id):
string =>
"document.getElementById('{$id}').addEventListener('click', "
883 .
"(e) => {window.open('{$link}');}"
892 $this->ui_factory->button()->standard(
893 $this->lng->txt(
'print'),
896 fn(
$id):
string =>
"document.getElementById('{$id}').addEventListener('click', "
897 .
"()=>{window.print();}"
906 $this->ui_factory->button()->standard(
907 $this->lng->txt(
'certificate'),
908 $this->ctrl->getLinkTargetByClass(self::class,
'outCertificate')
915 if ($this->testrequest->isset(
'show_best_solutions')) {
917 'tst_results_show_best_solutions',
918 $this->testrequest->int(
'show_best_solutions') === 1
923 $this->
ctrl->setParameter($this,
'show_best_solutions',
'0');
924 $label = $this->
lng->txt(
'tst_btn_hide_best_solutions');
926 $this->
ctrl->setParameter($this,
'show_best_solutions',
'1');
927 $label = $this->
lng->txt(
'tst_btn_show_best_solutions');
930 $this->
toolbar->addSeparator();
932 $this->ui_factory->button()->standard(
934 $this->ctrl->getLinkTargetByClass(self::class, $this->ctrl->getCmd(self::DEFAULT_CMD))
937 $this->
ctrl->clearParameters($this,
'show_best_solutions');
941 array $selected_active_ids,
942 int $current_active_id
944 $this->
toolbar->addSeparator();
946 $this->ui_factory->dropdown()
948 $this->buildParticipantSelectorArray($selected_active_ids, $current_active_id)
949 )->withLabel($this->lng->txt(
'tst_res_jump_to_participant_hint_opt'))
954 array $selected_active_ids,
955 int $current_active_id
957 $this->
ctrl->setParameterByClass(self::class,
'active_ids', implode(
',', $selected_active_ids));
958 unset($selected_active_ids[array_search($current_active_id, $selected_active_ids)]);
959 $available_user_links = array_map(
960 function (
int $v): StandardLink {
961 $this->
ctrl->setParameterByClass(self::class,
'active_id', $v);
962 return $this->ui_factory->link()->
standard(
964 $this->ctrl->getLinkTargetByClass(self::class,
'showResults')
969 $this->
ctrl->clearParameterByClass(self::class,
'active_id');
970 $this->
ctrl->clearParameterByClass(self::class,
'active_ids');
971 return $available_user_links;
975 array $available_attempts,
976 int $selected_attempt
980 $this->buildAttemptSwitchingViewControl(
985 $this->
ctrl->clearParameterByClass(self::class,
'attempt');
989 array $available_attempts,
990 int $selected_attempt
992 return $this->ui_factory->viewControl()->mode(
995 function (array
$c,
int $v): array {
996 $this->
ctrl->setParameterByClass(self::class,
'attempt', $v);
998 $c[
"{$this->lng->txt('tst_attempt')} {$attempt}"] = $this
999 ->ctrl->getLinkTargetByClass(self::class, $this->
ctrl->getCmd(self::DEFAULT_CMD));
1004 $this->
lng->txt(
'select_attempt')
1005 )->withActive(
"{$this->lng->txt('tst_attempt')} {$selected_attempt}");
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Stream factory which enables the user to create streams without the knowledge of the concrete class.
Validates if an active certificate is stored in the database and can be downloaded by the user.
Just a wrapper class to create Unit Test for other classes.
static getInstance(ilTestSession $a_test_session)
static getContentStylePath(int $a_style_id, bool $add_random=true, bool $add_token=true)
get content style path static (to avoid full reading)
static _getResultPass($active_id)
Retrieves the pass number that should be counted for a given user.
static lookupExamId($active_id, $pass)
static _lookupFullname(int $a_user_id)
static get(string $a_var)
static set(string $a_var, $a_val)
Set a value.
special template class to simplify handling of ITX/PEAR
Output class for assessment test evaluation.
addParticipantSelectorToToolbar(array $selected_active_ids, int $current_active_id)
executeCommand()
execute command
addPrintButtonToToolbar()
addCertificateDownloadButtonToToolbar()
__construct(ilObjTest $object)
getEvaluationQuestionId($question_id, $original_id='')
Returns the ID of a question for evaluation purposes.
buildParticipantSelectorArray(array $selected_active_ids, int $current_active_id)
outUserListOfAnswerPasses()
ilTestProcessLockerFactory $processLockerFactory
buildAttemptSwitchingViewControl(array $available_attempts, int $selected_attempt)
setTestAccess($testAccess)
addAttemptSwitchingViewControlToToolbar(array $available_attempts, int $selected_attempt)
buildResultsTitle(string $fullname, int $pass)
addToggleBestSolutionButtonToToolbar()
redirectBackToParticipantsScreen()
buildAttemptComponents(int $active_id, int $attempt_id, bool $with_test_results_overview, bool $for_print)
addPrintResultsButtonToToolbar()
redirectToPassDeletionContext(string $context)
Base Exception for all Exceptions relating to Modules/Test.
const CONTEXT_INFO_SCREEN
const CONTEXT_PASS_OVERVIEW
Service GUI class for tests.
buildPassOverviewTableGUI(ilTestEvaluationGUI $target_gui)
getObjectiveOrientedContainer()
setContextResultPresentation(bool $contextResultPresentation)
buildQuestionRelatedObjectivesList(ilLOTestQuestionAdapter $objectives_adapter, ilTestQuestionSequence $test_sequence)
getResultsSignature()
Returns HTML code for a signature field.
populatePassFinishDate(ilTemplate $tpl, ?int $pass_finish_date)
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, ?ResultsTitlesBuilder $testResultHeaderLabelBuilder=null)
Returns the list of answers of a users test pass.
populateExamId(ilTemplate $tpl, int $active_id, int $pass)
readonly ilDBInterface $db
ilGlobalTemplateInterface ilTemplate $tpl
sk 2023-08-01: We need this union type, even if it is wrong! To change this
readonly ilSetting $settings
isGradingMessageRequired()
getAdditionalUsrDataHtmlAndPopulateWindowTitle($testSession, $active_id, $overwrite_anonymity=false)
Returns the user data for a test results output.
getPassOverviewTableData(ilTestSession $test_session, array $passes, bool $with_results)
getGradingMessageBuilder(int $active_id)
static getStyleSheetLocation(string $mode="output", string $a_css_name="")
get full style sheet file name (path inclusive) of current user
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setVariable(string $variable, $value='')
Sets the given variable to the given value.
parseCurrentBlock(string $block_name=self::DEFAULT_BLOCK)
Parses the given block.
setCurrentBlock(string $part=self::DEFAULT_BLOCK)
Sets the template to the given block.
get(string $part=self::DEFAULT_BLOCK)
Renders the given block and returns the html string.
This describes a Sub Panel.
This describes a Mode Control.
static http()
Fetches the global http state from ILIAS.
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc