ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
TabsManager.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
21 namespace ILIAS\Test\Presentation;
22 
28 
33 {
38  public const TAB_ID_QUESTIONS = 'assQuestions';
39  public const SUBTAB_ID_QST_LIST_VIEW = 'qst_list_view';
40  public const SUBTAB_ID_QST_PAGE_VIEW = 'qst_page_view';
41 
42  public const TAB_ID_TEST = 'test';
43  public const TAB_ID_INFOSCREEN = 'info_short';
44  public const TAB_ID_SETTINGS = 'settings';
45  public const SUBTAB_ID_GENERAL_SETTINGS = 'general';
46  public const TAB_ID_LEARNING_PROGRESS = 'learning_progress';
47  public const TAB_ID_MANUAL_SCORING = 'manscoring';
48  public const TAB_ID_CORRECTION = 'scoringadjust';
49  public const TAB_ID_HISTORY = 'history';
50  public const TAB_ID_META_DATA = 'meta_data';
51  public const TAB_ID_EXPORT = 'export';
52  public const TAB_ID_PERMISSIONS = 'perm_settings';
53 
54  public const TAB_ID_PARTICIPANTS = 'participants';
55 
56  public const TAB_ID_YOUR_RESULTS = 'your_results';
57  public const SUBTAB_ID_MY_RESULTS = 'myresults';
58  public const SUBTAB_ID_LO_RESULTS = 'loresults';
59  public const SUBTAB_ID_HIGHSCORE = 'highscore';
60  public const SUBTAB_ID_SKILL_RESULTS = 'skillresults';
61  public const SUBTAB_ID_MY_SOLUTIONS = 'mysolutions';
62 
63  private const SETTINGS_SUBTAB_ID_GENERAL = 'general';
64  public const SETTINGS_SUBTAB_ID_MARK_SCHEMA = 'mark_schema';
65  public const SETTINGS_SUBTAB_ID_SCORING = 'scoring';
66  public const SETTINGS_SUBTAB_ID_EDIT_INTRODUCTION_PAGE = 'edit_introduction';
67  public const SETTINGS_SUBTAB_ID_EDIT_CONCLUSION_PAGE = 'edit_concluding_remarks';
68  private const SETTINGS_SUBTAB_ID_CERTIFICATE = 'certificate';
69  public const SETTINGS_SUBTAB_ID_ASSIGN_SKILL_TRESHOLDS = 'tst_skl_sub_tab_thresholds';
70  public const SETTINGS_SUBTAB_ID_ASSIGN_SKILLS_TO_QUESTIONS = 'qpl_skl_sub_tab_quest_assign';
71  private const SETTINGS_SUBTAB_ID_PERSONAL_DEFAULT_SETTINGS = 'tst_default_settings';
72 
73  private const QUESTIONS_SUBTAB_ID_RANDOM_SETTINGS = 'tst_rnd_quest_cfg_tab_general';
74  private const QUESTIONS_SUBTAB_ID_RANDOM_POOLS = 'tst_rnd_quest_cfg_tab_pool';
75 
76  protected ?string $parent_back_href = null;
77  protected ?string $parent_back_label = null;
78 
79  public function __construct(
80  private readonly \ilTabsGUI $tabs,
81  private readonly \ilLanguage $lng,
82  private readonly \ilCtrlInterface $ctrl,
83  private readonly \ilAccess $access,
84  private readonly \ilTestAccess $test_access,
85  private readonly \ilObjTest $test_object,
86  private readonly \ilTestObjectiveOrientedContainer $objective_parent,
87  private readonly \ilTestSession $test_session
88  ) {
89  }
90 
91  public function activateTab(string $tab_id): void
92  {
93  switch ($tab_id) {
94  case self::TAB_ID_PARTICIPANTS:
95  case self::TAB_ID_YOUR_RESULTS:
96  case self::TAB_ID_SETTINGS:
97  case self::TAB_ID_TEST:
98  case self::TAB_ID_LEARNING_PROGRESS:
99  $this->tabs->activateTab($tab_id);
100  }
101  }
102 
103  public function activateSubTab(string $sub_tab_id): void
104  {
105  switch ($sub_tab_id) {
106  case self::SUBTAB_ID_MY_RESULTS:
107  case self::SUBTAB_ID_LO_RESULTS:
108  case self::SUBTAB_ID_HIGHSCORE:
109  case self::SUBTAB_ID_SKILL_RESULTS:
110  case self::SUBTAB_ID_MY_SOLUTIONS:
111 
112  case self::SUBTAB_ID_QST_LIST_VIEW:
113  case self::SUBTAB_ID_QST_PAGE_VIEW:
114 
115  case self::SETTINGS_SUBTAB_ID_GENERAL:
116  case self::SETTINGS_SUBTAB_ID_MARK_SCHEMA:
117  case self::SETTINGS_SUBTAB_ID_SCORING:
118  case self::SETTINGS_SUBTAB_ID_EDIT_INTRODUCTION_PAGE:
119  case self::SETTINGS_SUBTAB_ID_EDIT_CONCLUSION_PAGE:
120  case self::SETTINGS_SUBTAB_ID_CERTIFICATE:
121  case self::SETTINGS_SUBTAB_ID_PERSONAL_DEFAULT_SETTINGS:
122  $this->tabs->activateSubTab($sub_tab_id);
123  }
124  }
125 
126  public function resetTabsAndAddBacklink(string $back_link_target): void
127  {
128  $this->tabs->clearTargets();
129  $this->tabs->setBackTarget($this->lng->txt('back'), $back_link_target);
130  }
131 
132  public function getParentBackLabel(): ?string
133  {
135  }
136 
137  public function setParentBackLabel(?string $parent_back_label)
138  {
139  $this->parent_back_label = $parent_back_label;
140  }
141 
142  public function getParentBackHref(): ?string
143  {
145  }
146 
147  public function setParentBackHref(?string $parent_back_href): void
148  {
149  $this->parent_back_href = $parent_back_href;
150  }
151 
152  public function hasParentBackLink(): bool
153  {
154  if ($this->getParentBackHref() === null) {
155  return false;
156  }
157 
158  if ($this->getParentBackLabel() === null) {
159  return false;
160  }
161 
162  return true;
163  }
164 
165  protected function isReadAccessGranted(): bool
166  {
167  return $this->access->checkAccess('read', '', $this->test_object->getRefId());
168  }
169 
170  protected function isWriteAccessGranted(): bool
171  {
172  return $this->access->checkAccess('write', '', $this->test_object->getRefId());
173  }
174 
175  protected function isHistoryAccessGranted(): bool
176  {
177  return $this->test_object->getTestLogger()->isLoggingEnabled()
178  && $this->access->checkAccess('tst_history_read', '', $this->test_object->getRefId());
179  }
180 
181  protected function isPermissionsAccessGranted(): bool
182  {
183  return $this->access->checkAccess('edit_permission', '', $this->test_object->getRefId());
184  }
185 
186  protected function isLpAccessGranted(): bool
187  {
188  if (!$this->test_access->getAccess()->checkAccess('read', '', $this->test_object->getRefId())) {
189  return false;
190  }
191 
192  return \ilLearningProgressAccess::checkAccess($this->test_object->getRefId());
193  }
194 
195  protected function checkParticipantsTabAccess(): bool
196  {
197  if ($this->test_access->checkManageParticipantsAccess()
198  || $this->test_access->checkParticipantsResultsAccess()) {
199  return true;
200  }
201 
202  return false;
203  }
204 
205  protected function checkScoreParticipantsTabAccess(): bool
206  {
207  return $this->test_access->checkScoreParticipantsAccess();
208  }
209 
210  public function perform(): void
211  {
212  if ($this->isTabsConfigSetupRequired()) {
213  $this->setupTabsGuiConfig();
214  }
215  }
216 
217  protected function isTabsConfigSetupRequired(): bool
218  {
219  if (preg_match('/^ass(.*?)gui$/i', $this->ctrl->getNextClass($this))) {
220  return false;
221  }
222 
223  if ($this->ctrl->getNextClass($this) == 'ilassquestionpagegui') {
224  return false;
225  }
226 
227  if ($this->ctrl->getCmdClass() == 'iltestoutputgui') {
228  return false;
229  }
230 
231  if ($this->ctrl->getCmdClass() == 'iltestevaluationgui') {
232  return in_array($this->ctrl->getCmd(), [
233  '', 'outUserResultsPassOverview', 'outUserListOfAnswerPasses', 'singleResults'
234  ]);
235  }
236 
237  return true;
238  }
239 
240  protected function setupTabsGuiConfig(): void
241  {
242  if ($this->hasParentBackLink()) {
243  $this->tabs->setBack2Target($this->getParentBackLabel(), $this->getParentBackHref());
244  }
245 
246  $class_path = $this->ctrl->getCurrentClassPath();
247 
248  switch (array_pop($class_path)) {
249  case MarkSchemaGUI::class:
250  case SettingsMainGUI::class:
251  case SettingsScoringGUI::class:
252 
253  if ($this->isWriteAccessGranted()) {
254  $this->getSettingsSubTabs();
255  }
256 
257  break;
258  }
259 
260  switch ($this->ctrl->getCmd()) {
261  case 'resume':
262  case 'previous':
263  case 'next':
264  case 'summary':
265  case 'directfeedback':
266  case 'finishTest':
267  case 'outCorrectSolution':
268  case 'showAnswersOfUser':
269  case 'backFromSummary':
270  case 'show_answers':
271  case 'setsolved':
272  case 'resetsolved':
273  case 'confirmFinish':
274  case 'outTestSummary':
275  case 'outQuestionSummary':
276  case 'gotoQuestion':
277  case 'selectImagemapRegion':
278  case 'confirmSubmitAnswers':
279  case 'finalSubmission':
280  case 'postpone':
281  case 'outUserPassDetails':
282  case 'checkPassword':
283  case 'exportCertificate':
284  case 'finishListOfAnswers':
285  case 'backConfirmFinish':
286  case 'showFinalStatement':
287  return;
288  case 'browseForQuestions':
289  case 'filter':
290  case 'resetFilter':
291  case 'resetTextFilter':
292  case 'insertQuestions':
293  $classes = [
294  'iltestdashboardgui',
295  'iltestresultsgui',
296  'illearningprogressgui' // #8497: resetfilter is also used in lp
297  ];
298  if (!in_array($this->ctrl->getNextClass($this), $classes)) {
299  $this->getBrowseForQuestionsTab();
300  }
301  break;
302  case 'scoring':
303  case 'certificate':
304  case 'certificateservice':
305  case 'certificateImport':
306  case 'certificateUpload':
307  case 'certificateEditor':
308  case 'certificateDelete':
309  case 'certificateSave':
310  case 'defaults':
311  case 'deleteDefaults':
312  case 'addDefaults':
313  case 'applyDefaults':
314  case 'inviteParticipants':
315  case 'searchParticipants':
316  if ($this->isWriteAccessGranted() && in_array(strtolower($this->ctrl->getCmdClass()), ['ilobjtestgui', 'ilcertificategui'])) {
317  $this->getSettingsSubTabs();
318  }
319  break;
320  case 'export':
321  case 'print':
322  break;
323  }
324 
325  // test tab
326  if ($this->isReadAccessGranted()) {
327  $this->tabs->addTab(
328  self::TAB_ID_TEST,
329  $this->lng->txt('test'),
330  $this->ctrl->getLinkTargetByClass(
331  [
332  \ilObjTestGUI::class, TestScreenGUI::class],
334  )
335  );
336  }
337 
338  // info tab
339  if ($this->isReadAccessGranted()
340  && !$this->test_object->getMainSettings()->getAdditionalSettings()->getHideInfoTab()) {
341  $this->tabs->addTarget(
342  'info_short',
343  $this->ctrl->getLinkTargetByClass(
344  [
345  \ilRepositoryGUI::class,
346  \ilObjTestGUI::class,
347  \ilInfoScreenGUI::class
348  ]
349  ),
350  ['', 'outIntroductionPage', 'setAnonymousId', 'redirectToInfoScreen']
351  );
352  }
353 
354  // settings tab
355  if ($this->isWriteAccessGranted()) {
356  $settingsCommands = [
357  'marks', 'showMarkSchema','addMarkStep', 'deleteMarkSteps',
358  'resetToSimpleMarkSchema', 'saveMarks', 'certificate',
359  'certificateEditor', 'certificateSave',
360  'certificatePreview', 'certificateDelete', 'certificateUpload', 'certificateImport',
361  'scoring', 'defaults', 'addDefaults', 'deleteDefaults', 'applyDefaults',
362  'inviteParticipants', 'saveFixedParticipantsStatus', 'searchParticipants', 'addParticipants' // ARE THEY RIGHT HERE
363  ];
364 
365  $reflection = new \ReflectionClass(SettingsMainGUI::class);
366  foreach ($reflection->getConstants() as $name => $value) {
367  if (substr($name, 0, 4) === 'CMD_') {
368  $settingsCommands[] = $value;
369  }
370  }
371 
372  $reflection = new \ReflectionClass(SettingsScoringGUI::class);
373  foreach ($reflection->getConstants() as $name => $value) {
374  if (substr($name, 0, 4) === 'CMD_') {
375  $settingsCommands[] = $value;
376  }
377  }
378 
379  $settingsCommands[] = ''; // DO NOT KNOW WHAT THIS IS DOING, BUT IT'S REQUIRED
380 
381  $this->tabs->addTarget(
382  'settings',
383  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, SettingsMainGUI::class]),
384  $settingsCommands,
385  [
386  'ilmarkschemagui',
387  'ilobjtestsettingsmaingui',
388  'ilobjtestsettingsscoringresultsgui',
389  'ilobjtestgui',
390  'ilcertificategui'
391  ]
392  );
393  }
394 
395  if ($this->test_object->isFixedTest()) {
396  $target = $this->ctrl->getLinkTargetByClass(
397  \ilObjTestGUI::class,
399  );
400  }
401 
402  if ($this->test_object->isRandomTest()) {
403  $target = $this->ctrl->getLinkTargetByClass(\ilTestRandomQuestionSetConfigGUI::class);
404  }
405 
406  if ($this->isWriteAccessGranted()) {
407  $this->tabs->addTarget(
408  'assQuestions',
409  $target,
410  [
411  'showQuestions', 'browseForQuestions', 'questionBrowser', 'createQuestion',
412  'filter', 'resetFilter', 'insertQuestions', 'back',
413  'executeCreateQuestion', 'cancelCreateQuestion',
414  'addQuestionpool', 'saveRandomQuestions', 'saveQuestionSelectionMode', 'print',
415  'addsource', 'removesource', 'randomQuestions'
416  ],
417  );
418  }
419 
420  if ($this->needsParticipantsTab()) {
421  $this->tabs->addTab(
422  self::TAB_ID_PARTICIPANTS,
423  $this->lng->txt('participants'),
424  $this->getParticipantsTabTarget()
425  );
426  }
427 
428  if ($this->needsYourResultsTab()) {
429  $this->tabs->addTab(
430  self::TAB_ID_YOUR_RESULTS,
431  $this->lng->txt('your_results'),
432  $this->getYourResultsTabTarget()
433  );
434  }
435 
436  if ($this->checkScoreParticipantsTabAccess()) {
437  if ($this->test_object->getGlobalSettings()->isManualScoringEnabled()) {
438  // scoring tab
439  $this->tabs->addTarget(
440  self::TAB_ID_MANUAL_SCORING,
441  $this->ctrl->getLinkTargetByClass(
442  [\ilObjTestGUI::class, TestScoringByQuestionGUI::class],
443  'showManScoringByQuestionParticipantsTable'
444  ),
445  [
446  'showManScoringParticipantsTable',
447  'applyManScoringParticipantsFilter',
448  'resetManScoringParticipantsFilter',
449  'showManScoringParticipantScreen',
450  'showManScoringByQuestionParticipantsTable',
451  'applyManScoringByQuestionFilter',
452  'resetManScoringByQuestionFilter',
453  'saveManScoringByQuestion'
454  ],
455  ''
456  );
457  }
458  }
459 
460  if ($this->isHistoryAccessGranted()) {
461  $this->tabs->addTarget(
462  self::TAB_ID_HISTORY,
463  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, 'history'),
464  'history',
465  ''
466  );
467  }
468 
469  if ($this->isLpAccessGranted()) {
470  $this->tabs->addTarget(
471  self::TAB_ID_LEARNING_PROGRESS,
472  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilLearningProgressGUI::class], ''),
473  '',
474  [
475  'illplistofobjectsgui',
476  'illplistofsettingsgui',
477  'illearningprogressgui',
478  'illplistofprogressgui'
479  ]
480  );
481  }
482 
483  if ($this->isWriteAccessGranted()) {
484  $mdgui = new \ilObjectMetaDataGUI($this->test_object);
485  $mdtab = $mdgui->getTab(\ilObjTestGUI::class);
486  if ($mdtab) {
487  $this->tabs->addTarget(
488  self::TAB_ID_META_DATA,
489  $mdtab,
490  '',
491  'ilmdeditorgui'
492  );
493  }
494 
495  $this->tabs->addTarget(
496  self::TAB_ID_EXPORT,
497  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilTestExportGUI::class], ''),
498  '',
499  ['iltestexportgui']
500  );
501  }
502 
503  if ($this->isPermissionsAccessGranted()) {
504  $this->tabs->addTarget(
505  self::TAB_ID_PERMISSIONS,
506  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilPermissionGUI::class], 'perm'),
507  ['perm','info','owner'],
508  'ilpermissiongui'
509  );
510  }
511  }
512 
513  protected function getBrowseForQuestionsTab(): void
514  {
515  if ($this->isWriteAccessGranted()) {
516  $this->ctrl->saveParameterByClass($this->ctrl->getCmdClass(), 'q_id');
517  // edit page
518  $this->tabs->setBackTarget(
519  $this->lng->txt('backtocallingtest'),
520  $this->ctrl->getLinkTargetByClass($this->ctrl->getCmdClass(), \ilObjTestGUI::SHOW_QUESTIONS_CMD)
521  );
522  $this->tabs->addTarget(
523  'tst_browse_for_questions',
524  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, 'browseForQuestions'),
525  ['browseForQuestions', 'filter', 'resetFilter', 'resetTextFilter', 'insertQuestions'],
526  '',
527  '',
528  true
529  );
530  }
531  }
532 
533  protected function getRandomQuestionsTab(): void
534  {
535  if ($this->isWriteAccessGranted()) {
536  // edit page
537  $this->tabs->setBackTarget(
538  $this->lng->txt('backtocallingtest'),
539  $this->ctrl->getLinkTargetByClass(\ilTestRandomQuestionSetConfigGUI::class, \ilObjTestGUI::SHOW_QUESTIONS_CMD)
540  );
541  $this->tabs->addTarget(
542  'random_selection',
543  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, 'randomQuestions'),
544  ['randomQuestions'],
545  '',
546  ''
547  );
548  }
549  }
550 
551  public function getQuestionsSubTabs(): void
552  {
553  if (!$this->isWriteAccessGranted()) {
554  return;
555  }
556 
557  $this->tabs->activateTab(self::TAB_ID_QUESTIONS);
558 
559  if ($this->test_object->isRandomTest()) {
560  $this->tabs->addSubTabTarget(
561  self::QUESTIONS_SUBTAB_ID_RANDOM_SETTINGS,
562  $this->ctrl->getLinkTargetByClass(
563  \ilTestRandomQuestionSetConfigGUI::class,
565  ),
566  ['', 'showGeneralConfigForm', 'saveGeneralConfigForm']
567  );
568 
569  $this->tabs->addSubTabTarget(
570  self::QUESTIONS_SUBTAB_ID_RANDOM_POOLS,
571  $this->ctrl->getLinkTargetByClass(
572  \ilTestRandomQuestionSetConfigGUI::class,
574  ),
575  ['showSourcePoolDefinitionList']
576  );
577  }
578 
579  $this->tabs->addSubTab(
580  self::SUBTAB_ID_QST_LIST_VIEW,
581  $this->lng->txt('edit_test_questions'),
582  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, \ilObjTestGUI::SHOW_QUESTIONS_CMD)
583  );
584 
585  if ($this->test_object->isSkillServiceToBeConsidered()) {
586  $this->tabs->addSubTabTarget(
587  self::SETTINGS_SUBTAB_ID_ASSIGN_SKILLS_TO_QUESTIONS,
588  $this->ctrl->getLinkTargetByClass(
589  [
590  \ilTestSkillAdministrationGUI::class,
591  \ilAssQuestionSkillAssignmentsGUI::class
592  ],
594  ),
595  [
598  ]
599  );
600  }
601  }
602 
603  public function getSettingsSubTabs(): void
604  {
605  $this->tabs->addSubTabTarget(
606  self::SETTINGS_SUBTAB_ID_GENERAL,
607  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, SettingsMainGUI::class]),
608  '',
609  [SettingsMainGUI::class]
610  );
611 
612  $this->tabs->addSubTabTarget(
613  self::SETTINGS_SUBTAB_ID_MARK_SCHEMA,
614  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, MarkSchemaGUI::class], 'showMarkSchema'),
615  '',
616  [MarkSchemaGUI::class]
617  );
618 
619  $this->tabs->addSubTabTarget(
620  self::SETTINGS_SUBTAB_ID_SCORING,
621  $this->ctrl->getLinkTargetByClass(
622  [\ilObjTestGUI::class, SettingsScoringGUI::class],
624  ),
625  '',
626  [SettingsScoringGUI::class]
627  );
628 
629  $this->ctrl->setParameterByClass(\ilTestPageGUI::class, 'page_type', 'introductionpage');
630  $this->tabs->addSubTabTarget(
631  self::SETTINGS_SUBTAB_ID_EDIT_INTRODUCTION_PAGE,
632  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilTestPageGUI::class], 'preview'),
633  ['iltestpagegui']
634  );
635 
636  $this->ctrl->setParameterByClass(\ilTestPageGUI::class, 'page_type', 'concludingremarkspage');
637  $this->tabs->addSubTabTarget(
638  self::SETTINGS_SUBTAB_ID_EDIT_CONCLUSION_PAGE,
639  $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilTestPageGUI::class], 'preview'),
640  ['iltestpagegui']
641  );
642  $this->ctrl->clearParameterByClass(\ilTestPageGUI::class, 'page_type');
643 
644  $validator = new \ilCertificateActiveValidator();
645  if ($validator->validate() === true) {
646  $this->tabs->addSubTabTarget(
647  self::SETTINGS_SUBTAB_ID_CERTIFICATE,
648  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, 'certificate'),
649  ['certificate', 'certificateEditor', 'certificateRemoveBackground', 'ceateSave',
650  'certificatePreview', 'certificateDelete', 'certificateUpload', 'certificateImport'],
651  ['', 'ilobjtestgui', 'ilcertificategui']
652  );
653  }
654 
655  if ($this->test_object->isSkillServiceToBeConsidered()) {
656  $this->tabs->addSubTabTarget(
657  self::SETTINGS_SUBTAB_ID_ASSIGN_SKILL_TRESHOLDS,
658  $this->ctrl->getLinkTargetByClass(
659  [
660  \ilTestSkillAdministrationGUI::class,
661  \ilTestSkillLevelThresholdsGUI::class
662  ],
664  ),
666  );
667  }
668 
669  $this->tabs->addSubTabTarget(
670  self::SETTINGS_SUBTAB_ID_PERSONAL_DEFAULT_SETTINGS,
671  $this->ctrl->getLinkTargetByClass(\ilObjTestGUI::class, 'defaults'),
672  ['defaults', 'deleteDefaults', 'addDefaults', 'applyDefaults'],
673  ['', 'ilobjtestgui', 'ilcertificategui']
674  );
675 
676  $lti_settings = new \ilLTIProviderObjectSettingGUI($this->test_object->getRefId());
677  if ($lti_settings->hasSettingsAccess()) {
678  $this->tabs->addSubTabTarget(
679  'lti_provider',
680  $this->ctrl->getLinkTargetByClass(\ilLTIProviderObjectSettingGUI::class),
681  '',
682  [\ilLTIProviderObjectSettingGUI::class]
683  );
684  }
685  }
686 
687  protected function needsParticipantsTab(): bool
688  {
689  if (!$this->checkParticipantsTabAccess()) {
690  return false;
691  }
692 
693  return true;
694  }
695 
696  protected function needsTimeExtensionSubTab(): bool
697  {
698  if (!($this->test_object->getProcessingTimeInSeconds() > 0)) {
699  return false;
700  }
701 
702  if ($this->test_object->getNrOfTries() != 1) {
703  return false;
704  }
705 
706  return true;
707  }
708 
709  protected function getParticipantsTabTarget(): string
710  {
711  return $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilTestParticipantsGUI::class]);
712  }
713 
714  public function needsYourResultsTab(): bool
715  {
716  return $this->test_session->reportableResultsAvailable($this->test_object)
717  || $this->test_session->getActiveId() !== 0
718  && $this->test_object->canShowSolutionPrintview($this->test_session->getUserId());
719  }
720 
721  protected function getYourResultsTabTarget(): string
722  {
723  if ($this->needsLoResultsSubTab()) {
724  return $this->ctrl->getLinkTargetByClass([\ilObjTestGUI::class, \ilTestResultsGUI::class, \ilTestEvalObjectiveOrientedGUI::class]);
725  }
726 
727  if ($this->needsYourSolutionsSubTab()) {
728  return $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilMyTestSolutionsGUI::class, \ilTestEvaluationGUI::class]);
729  }
730 
731  return $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilMyTestResultsGUI::class, \ilTestEvaluationGUI::class]);
732  }
733 
734  protected function needsYourResultsSubTab(): bool
735  {
736  return $this->test_object->isScoreReportingEnabled();
737  }
738 
739  public function needsLoResultsSubTab(): bool
740  {
741  if (!$this->test_object->isScoreReportingEnabled()) {
742  return false;
743  }
744 
745  return $this->objective_parent->isObjectiveOrientedPresentationRequired();
746  }
747 
748  public function needsHighSoreSubTab(): bool
749  {
750  if (!$this->test_object->isScoreReportingEnabled()) {
751  return false;
752  }
753 
754  return $this->test_object->getHighscoreEnabled();
755  }
756 
757  public function needsSkillResultsSubTab(): bool
758  {
759  if (!$this->test_object->isScoreReportingEnabled()) {
760  return false;
761  }
762 
763  return $this->test_object->isSkillServiceToBeConsidered();
764  }
765 
766  public function needsYourSolutionsSubTab(): bool
767  {
768  return $this->test_object->canShowSolutionPrintview($this->test_session->getUserId());
769  }
770 
771  public function getYourResultsSubTabs(): void
772  {
773  if ($this->needsLoResultsSubTab()) {
774  $this->tabs->addSubTab(
775  self::SUBTAB_ID_LO_RESULTS,
776  $this->lng->txt('tst_tab_results_objective_oriented'),
777  $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilTestEvalObjectiveOrientedGUI::class])
778  );
779  }
780 
781  if ($this->needsYourResultsSubTab()) {
782  $myResultsLabel = $this->lng->txt('tst_show_results');
783 
784  if ($this->needsLoResultsSubTab()) {
785  $myResultsLabel = $this->lng->txt('tst_tab_results_pass_oriented');
786  }
787 
788  $this->tabs->addSubTab(
789  self::SUBTAB_ID_MY_RESULTS,
790  $myResultsLabel,
791  $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilMyTestResultsGUI::class, \ilTestEvaluationGUI::class])
792  );
793  }
794 
795  if ($this->needsSkillResultsSubTab()) {
796  $this->tabs->addSubTab(
797  self::SUBTAB_ID_SKILL_RESULTS,
798  $this->lng->txt('tst_show_comp_results'),
799  $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilTestSkillEvaluationGUI::class])
800  );
801  }
802 
803  if ($this->needsHighSoreSubTab()) {
804  $this->tabs->addSubTab(
805  self::SUBTAB_ID_HIGHSCORE,
806  $this->lng->txt('tst_show_toplist'),
807  $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilTestToplistGUI::class], 'outResultsToplist')
808  );
809  }
810 
811  if ($this->needsYourSolutionsSubTab()) {
812  $this->tabs->addSubTab(
813  self::SUBTAB_ID_MY_SOLUTIONS,
814  $this->lng->txt('tst_list_of_answers_show'),
815  $this->ctrl->getLinkTargetByClass([\ilTestResultsGUI::class, \ilMyTestSolutionsGUI::class, \ilTestEvaluationGUI::class])
816  );
817  }
818  }
819 }
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setParentBackLabel(?string $parent_back_label)
__construct(private readonly \ilTabsGUI $tabs, private readonly \ilLanguage $lng, private readonly \ilCtrlInterface $ctrl, private readonly \ilAccess $access, private readonly \ilTestAccess $test_access, private readonly \ilObjTest $test_object, private readonly \ilTestObjectiveOrientedContainer $objective_parent, private readonly \ilTestSession $test_session)
Definition: TabsManager.php:79
resetTabsAndAddBacklink(string $back_link_target)
activateSubTab(string $sub_tab_id)
const TAB_ID_QUESTIONS
(Sub-)Tab ID constants
Definition: TabsManager.php:38
global $lng
Definition: privfeed.php:32
setParentBackHref(?string $parent_back_href)