ILIAS  release_7 Revision v7.30-3-g800a261c036
All Data Structures Namespaces Files Functions Variables Modules Pages
class.ilAssQuestionPreviewGUI.php
Go to the documentation of this file.
1 <?php
19 
34 {
35  const CMD_SHOW = 'show';
36  const CMD_RESET = 'reset';
37  const CMD_STATISTICS = 'assessment';
38  const CMD_INSTANT_RESPONSE = 'instantResponse';
39  const CMD_HANDLE_QUESTION_ACTION = 'handleQuestionAction';
40  const CMD_GATEWAY_CONFIRM_HINT_REQUEST = 'gatewayConfirmHintRequest';
41  const CMD_GATEWAY_SHOW_HINT_LIST = 'gatewayShowHintList';
42 
43  const TAB_ID_QUESTION = 'question';
44 
45  const FEEDBACK_FOCUS_ANCHOR = 'focus';
46 
50  private $rbac_services;
51 
55  protected $ctrl;
56 
60  protected $tabs;
61 
65  protected $tpl;
66 
70  protected $lng;
71 
75  protected $db;
76 
80  protected $user;
81 
85  protected $questionGUI;
86 
90  protected $questionOBJ;
91 
95  protected $previewSettings;
96 
100  protected $previewSession;
101 
105  protected $hintTracking;
106 
107  public function __construct(
108  ilCtrl $ctrl,
115  ) {
116  $this->ctrl = $ctrl;
117  $this->tabs = $tabs;
118  $this->tpl = $tpl;
119  $this->lng = $lng;
120  $this->db = $db;
121  $this->user = $user;
122  $this->rbac_services = $rbac_services;
123 
124  $this->tpl->addCss(ilObjStyleSheet::getContentStylePath(0));
125  $this->tpl->addCss(ilObjStyleSheet::getSyntaxStylePath());
126  }
127 
128  public function initQuestion($questionId, $parentObjId)
129  {
130  require_once 'Modules/TestQuestionPool/classes/class.assQuestion.php';
131 
132  $this->questionGUI = assQuestion::instantiateQuestionGUI($questionId);
133  $this->questionOBJ = $this->questionGUI->object;
134 
135  $this->questionOBJ->setObjId($parentObjId);
136 
137  if ($this->ctrl->getCmd() == 'editQuestion') {
138  $this->questionGUI->setQuestionTabs();
139  } else {
140  if ($_GET["q_id"]) {
141  $this->tabs->clearTargets();
142  $this->tabs->addTarget(
144  $this->ctrl->getLinkTargetByClass('ilAssQuestionPreviewGUI', ilAssQuestionPreviewGUI::CMD_SHOW),
145  array(),
146  array('ilAssQuestionPreviewGUI')
147  );
148  // Assessment of questions sub menu entry
149  $q_type = $this->questionOBJ->getQuestionType();
150  $classname = $q_type . "GUI";
151  $this->tabs->addTarget(
152  "statistics",
153  $this->ctrl->getLinkTargetByClass('ilAssQuestionPreviewGUI', "assessment"),
154  array("assessment"),
155  $classname,
156  ""
157  );
158  if (($_GET["calling_test"] > 0) || ($_GET["test_ref_id"] > 0)) {
159  $ref_id = $_GET["calling_test"];
160  if (strlen($ref_id) == 0) {
161  $ref_id = $_GET["test_ref_id"];
162  }
163 
164  if (!$_GET['test_express_mode'] && !$GLOBALS['___test_express_mode']) {
165  $this->tabs->setBackTarget(
166  $this->lng->txt("backtocallingtest"),
167  "ilias.php?baseClass=ilObjTestGUI&cmd=questions&ref_id=$ref_id"
168  );
169  //BACK FROM Question Page to Test
170  } else {
172  //$this->tabs->setBackTarget($this->lng->txt("backtocallingtest"), $link);
173  $this->tabs->setBackTarget(
174  $this->lng->txt("backtocallingtest"),
175  "ilias.php?baseClass=ilObjTestGUI&cmd=questions&ref_id=$ref_id"
176  );
177  }
178  } elseif (isset($_GET['calling_consumer']) && (int) $_GET['calling_consumer']) {
179  $ref_id = (int) $_GET['calling_consumer'];
180  $consumer = ilObjectFactory::getInstanceByRefId($ref_id);
181  if ($consumer instanceof ilQuestionEditingFormConsumer) {
182  $this->tabs->setBackTarget(
183  $consumer->getQuestionEditingFormBackTargetLabel(),
184  $consumer->getQuestionEditingFormBackTarget($_GET['consumer_context'])
185  );
186  } else {
187  require_once 'Services/Link/classes/class.ilLink.php';
188  $this->tabs->setBackTarget($this->lng->txt("qpl"), ilLink::_getLink($ref_id));
189  }
190  //} elseif (true) {
191  // We're in the underworld and want to go back to the question page
192  } else {
193  $this->tabs->setBackTarget($this->lng->txt("backtocallingpool"), $this->ctrl->getLinkTargetByClass("ilobjquestionpoolgui", "questions"));
194  //BACK FROM Question Page to Pool
195  }
196  }
197  }
198  $this->questionGUI->outAdditionalOutput();
199 
200  $this->questionGUI->populateJavascriptFilesRequiredForWorkForm($this->tpl);
201  $this->questionOBJ->setOutputType(OUTPUT_JAVASCRIPT); // TODO: remove including depending stuff
202 
203  $this->questionGUI->setTargetGui($this);
204  $this->questionGUI->setQuestionActionCmd(self::CMD_HANDLE_QUESTION_ACTION);
205 
206  $this->questionGUI->setRenderPurpose(assQuestionGUI::RENDER_PURPOSE_DEMOPLAY);
207  }
208 
209  public function initPreviewSettings($parentRefId)
210  {
211  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewSettings.php';
212  $this->previewSettings = new ilAssQuestionPreviewSettings($parentRefId);
213 
214  $this->previewSettings->init();
215  }
216 
217  public function initPreviewSession($userId, $questionId)
218  {
219  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewSession.php';
220  $this->previewSession = new ilAssQuestionPreviewSession($userId, $questionId);
221 
222  $this->previewSession->init();
223  }
224 
225  public function initHintTracking()
226  {
227  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionPreviewHintTracking.php';
228  $this->hintTracking = new ilAssQuestionPreviewHintTracking($this->db, $this->previewSession);
229  }
230 
231  public function initStyleSheets()
232  {
233  include_once("./Services/Style/Content/classes/class.ilObjStyleSheet.php");
234 
235  $this->tpl->setCurrentBlock("ContentStyle");
236  $this->tpl->setVariable("LOCATION_CONTENT_STYLESHEET", ilObjStyleSheet::getContentStylePath(0));
237  $this->tpl->parseCurrentBlock();
238 
239  $this->tpl->setCurrentBlock("SyntaxStyle");
240  $this->tpl->setVariable("LOCATION_SYNTAX_STYLESHEET", ilObjStyleSheet::getSyntaxStylePath());
241  $this->tpl->parseCurrentBlock();
242  }
243 
244  public function executeCommand()
245  {
246  global $DIC; /* @var \ILIAS\DI\Container $DIC */
247  $ilHelp = $DIC['ilHelp']; /* @var ilHelpGUI $ilHelp */
248  $ilHelp->setScreenIdComponent('qpl');
249 
250  $this->tabs->setTabActive(self::TAB_ID_QUESTION);
251 
252  $this->lng->loadLanguageModule('content');
253 
254  $nextClass = $this->ctrl->getNextClass($this);
255 
256  switch ($nextClass) {
257  case 'ilassquestionhintrequestgui':
258  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
259  $gui = new ilAssQuestionHintRequestGUI($this, self::CMD_SHOW, $this->questionGUI, $this->hintTracking);
260 
261  $this->ctrl->forwardCommand($gui);
262 
263  break;
264 
265  case 'ilassspecfeedbackpagegui':
266  case 'ilassgenfeedbackpagegui':
267  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionFeedbackPageObjectCommandForwarder.php';
268  $forwarder = new ilAssQuestionFeedbackPageObjectCommandForwarder($this->questionOBJ, $this->ctrl, $this->tabs, $this->lng);
269  $forwarder->forward();
270  break;
271 
272  case 'ilnotegui':
273  $notesGUI = new ilNoteGUI(
274  $this->questionOBJ->getObjId(),
275  $this->questionOBJ->getId(),
276  'quest',
277  false,
278  0,
279  false
280  );
281  $notesGUI->enablePublicNotes(true);
282  $notesGUI->enablePublicNotesDeletion(true);
283  $notesPanelHTML = $this->ctrl->forwardCommand($notesGUI);
284  $this->showCmd($notesPanelHTML);
285  break;
286 
287 
288  default:
289 
290  $cmd = $this->ctrl->getCmd(self::CMD_SHOW) . 'Cmd';
291 
292  $this->$cmd();
293  }
294  }
295 
299  protected function buildPreviewFormAction()
300  {
301  return $this->ctrl->getFormAction($this, self::CMD_SHOW) . '#' . self::FEEDBACK_FOCUS_ANCHOR;
302  }
303 
304  protected function isCommentingRequired()
305  {
306  if ($this->previewSettings->isTestRefId()) {
307  return false;
308  }
309  return (bool) $this->rbac_services->system()->checkAccess('write', (int) $_GET['ref_id']);
310  }
311 
312  private function showCmd($notesPanelHTML = '')
313  {
314  $tpl = new ilTemplate('tpl.qpl_question_preview.html', true, true, 'Modules/TestQuestionPool');
315 
316  $tpl->setVariable('PREVIEW_FORMACTION', $this->buildPreviewFormAction());
317 
319 
321 
323 
324  if ($this->isCommentingRequired()) {
325  $this->populateNotesPanel($tpl, $notesPanelHTML);
326  }
327 
328  $this->tpl->setContent($tpl->get());
329  }
330 
331  private function assessmentCmd()
332  {
333  $this->tabs->activateTab('statistics');
334  $this->questionGUI->assessment();
335  }
336 
341  {
342  $response_required = false;
343  $response_available = false;
344  $jump_to_response = false;
345 
346  if ($this->isShowReachedPointsRequired()) {
347  $this->populateReachedPointsOutput($tpl);
348  $response_required = true;
349  $response_available = true;
350  $jump_to_response = true;
351  }
352 
353  if ($this->isShowBestSolutionRequired()) {
354  $this->populateSolutionOutput($tpl);
355  $response_required = true;
356  $response_available = true;
357  $jump_to_response = true;
358  }
359 
361  $response_required = true;
362  if ($this->populateGenericQuestionFeedback($tpl)) {
363  $response_available = true;
364  $jump_to_response = true;
365  }
366  }
367 
369  $response_required = true;
370 
371  if ($this->questionGUI->hasInlineFeedback()) {
372  // Don't jump to the feedback below the question if some feedback is shown within the question
373  $jump_to_response = false;
374  } else {
375  if ($this->populateSpecificQuestionFeedback($tpl)) {
376  $response_available = true;
377  $jump_to_response = true;
378  }
379  }
380  }
381 
382  if ($response_required) {
383  $this->populateInstantResponseHeader($tpl, $jump_to_response);
384  if (!$response_available) {
385  if ($this->questionGUI->hasInlineFeedback()) {
387  $tpl,
388  $this->lng->txt('tst_feedback_is_given_inline')
389  );
390  } else {
392  $tpl,
393  $this->lng->txt('tst_feedback_not_available_for_answer')
394  );
395  }
396  }
397  }
398  }
399 
400  private function resetCmd()
401  {
402  $this->previewSession->setRandomizerSeed(null);
403  $this->previewSession->setParticipantsSolution(null);
404  $this->previewSession->resetRequestedHints();
405  $this->previewSession->setInstantResponseActive(false);
406 
407  ilUtil::sendInfo($this->lng->txt('qst_preview_reset_msg'), true);
408 
409  $this->ctrl->redirect($this, self::CMD_SHOW);
410  }
411 
412  private function instantResponseCmd()
413  {
414  if ($this->saveQuestionSolution()) {
415  $this->previewSession->setInstantResponseActive(true);
416  } else {
417  $this->previewSession->setInstantResponseActive(false);
418  }
419 
420  $this->ctrl->redirect($this, self::CMD_SHOW);
421  }
422 
423  private function handleQuestionActionCmd()
424  {
425  $this->questionOBJ->persistPreviewState($this->previewSession);
426  $this->ctrl->redirect($this, self::CMD_SHOW);
427  }
428 
430  {
431  $toolbarGUI = new ilAssQuestionPreviewToolbarGUI($this->lng);
432 
433  $toolbarGUI->setFormAction($this->ctrl->getFormAction($this, self::CMD_SHOW));
434  $toolbarGUI->setResetPreviewCmd(self::CMD_RESET);
435 
436  // Check Permissions first, some Toolbar Actions are only available for write access
437  if ($this->rbac_services->system()->checkAccess('write', (int) $_GET['ref_id'])) {
438  $toolbarGUI->setEditPageCmd(
439  $this->ctrl->getLinkTargetByClass('ilAssQuestionPageGUI', 'edit')
440  );
441 
442  $toolbarGUI->setEditQuestionCmd(
443  $this->ctrl->getLinkTargetByClass(
444  array('ilrepositorygui','ilobjquestionpoolgui', get_class($this->questionGUI)),
445  'editQuestion'
446  )
447  );
448  }
449  $toolbarGUI->build();
450 
451  $tpl->setVariable('PREVIEW_TOOLBAR', $this->ctrl->getHTML($toolbarGUI));
452  }
453 
455  {
456  // FOR WHAT EXACTLY IS THIS USEFUL?
457  $this->ctrl->setReturnByClass('ilAssQuestionPageGUI', 'view');
458  $this->ctrl->setReturnByClass('ilObjQuestionPoolGUI', 'questions');
459 
460  include_once("./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php");
461  $pageGUI = new ilAssQuestionPageGUI($this->questionOBJ->getId());
462  $pageGUI->setRenderPageContainer(false);
463  $pageGUI->setEditPreview(true);
464  $pageGUI->setEnabledTabs(false);
465 
466  // FOR WHICH SITUATION IS THIS WORKAROUND NECCESSARY? (sure .. imagemaps, but where this can be done?)
467  if (strlen($this->ctrl->getCmd()) == 0 && !isset($_POST['editImagemapForward_x'])) { // workaround for page edit imagemaps, keep in mind
468  $this->ctrl->setCmdClass(get_class($pageGUI));
469  $this->ctrl->setCmd('preview');
470  }
471 
472  $this->questionGUI->setPreviewSession($this->previewSession);
473  $this->questionGUI->object->setShuffler($this->getQuestionAnswerShuffler());
474 
475  $questionHtml = $this->questionGUI->getPreview(true, $this->isShowSpecificQuestionFeedbackRequired());
476  $this->questionGUI->magicAfterTestOutput();
477 
478  $questionHtml .= $this->getQuestionNavigationHtml();
479 
480  $pageGUI->setQuestionHTML(array($this->questionOBJ->getId() => $questionHtml));
481 
482  //$pageGUI->setHeader($this->questionOBJ->getTitle()); // NO ADDITIONAL HEADER
483  $pageGUI->setPresentationTitle($this->questionOBJ->getTitle());
484 
485  //$pageGUI->setTemplateTargetVar("ADM_CONTENT"); // NOT REQUIRED, OR IS?
486 
487  $tpl->setVariable('QUESTION_OUTPUT', $pageGUI->preview());
488  }
489 
491  {
492  $reachedPoints = $this->questionOBJ->calculateReachedPointsFromPreviewSession($this->previewSession);
493  $maxPoints = $this->questionOBJ->getMaximumPoints();
494 
495  $scoreInformation = sprintf(
496  $this->lng->txt("you_received_a_of_b_points"),
497  $reachedPoints,
498  $maxPoints
499  );
500 
501  $tpl->setCurrentBlock("reached_points_feedback");
502  $tpl->setVariable("REACHED_POINTS_FEEDBACK", $scoreInformation);
503  $tpl->parseCurrentBlock();
504  }
505 
507  {
508  // FOR WHAT EXACTLY IS THIS USEFUL?
509  $this->ctrl->setReturnByClass('ilAssQuestionPageGUI', 'view');
510  $this->ctrl->setReturnByClass('ilObjQuestionPoolGUI', 'questions');
511 
512  include_once("./Modules/TestQuestionPool/classes/class.ilAssQuestionPageGUI.php");
513  $pageGUI = new ilAssQuestionPageGUI($this->questionOBJ->getId());
514 
515  $pageGUI->setEditPreview(true);
516  $pageGUI->setEnabledTabs(false);
517 
518  // FOR WHICH SITUATION IS THIS WORKAROUND NECCESSARY? (sure .. imagemaps, but where this can be done?)
519  if (strlen($this->ctrl->getCmd()) == 0 && !isset($_POST['editImagemapForward_x'])) { // workaround for page edit imagemaps, keep in mind
520  $this->ctrl->setCmdClass(get_class($pageGUI));
521  $this->ctrl->setCmd('preview');
522  }
523 
524  $this->questionGUI->setPreviewSession($this->previewSession);
525 
526  $pageGUI->setQuestionHTML(array($this->questionOBJ->getId() => $this->questionGUI->getSolutionOutput(0, null, false, false, true, false, true, false, false)));
527 
528  //$pageGUI->setHeader($this->questionOBJ->getTitle()); // NO ADDITIONAL HEADER
529  //$pageGUI->setPresentationTitle($this->questionOBJ->getTitle());
530 
531  //$pageGUI->setTemplateTargetVar("ADM_CONTENT"); // NOT REQUIRED, OR IS?
532 
533  $output = $this->questionGUI->getSolutionOutput(0, null, false, false, true, false, true, false, false);
534  //$output = $pageGUI->preview();
535  //$output = str_replace('<h1 class="ilc_page_title_PageTitle"></h1>', '', $output);
536 
537  $tpl->setCurrentBlock('solution_output');
538  $tpl->setVariable('TXT_CORRECT_SOLUTION', $this->lng->txt('tst_best_solution_is'));
539  $tpl->setVariable('SOLUTION_OUTPUT', $output);
540  $tpl->parseCurrentBlock();
541  }
542 
543  private function getQuestionNavigationHtml()
544  {
545  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionRelatedNavigationBarGUI.php';
546  $navGUI = new ilAssQuestionRelatedNavigationBarGUI($this->ctrl, $this->lng);
547 
548  $navGUI->setInstantResponseCmd(self::CMD_INSTANT_RESPONSE);
549  $navGUI->setHintRequestCmd(self::CMD_GATEWAY_CONFIRM_HINT_REQUEST);
550  $navGUI->setHintListCmd(self::CMD_GATEWAY_SHOW_HINT_LIST);
551 
552  $navGUI->setInstantResponseEnabled($this->previewSettings->isInstantFeedbackNavigationRequired());
553  $navGUI->setHintProvidingEnabled($this->previewSettings->isHintProvidingEnabled());
554 
555  $navGUI->setHintRequestsPossible($this->hintTracking->requestsPossible());
556  $navGUI->setHintRequestsExist($this->hintTracking->requestsExist());
557 
558  return $this->ctrl->getHTML($navGUI);
559  }
560 
566  {
567  if ($this->questionOBJ->isPreviewSolutionCorrect($this->previewSession)) {
568  $feedback = $this->questionGUI->getGenericFeedbackOutputForCorrectSolution();
570  } else {
571  $feedback = $this->questionGUI->getGenericFeedbackOutputForIncorrectSolution();
573  }
574 
575  if (strlen($feedback)) {
576  $tpl->setCurrentBlock('instant_feedback_generic');
577  $tpl->setVariable('GENERIC_FEEDBACK', $feedback);
578  $tpl->setVariable('ILC_FB_CSS_CLASS', $cssClass);
579  $tpl->parseCurrentBlock();
580  return true;
581  }
582  return false;
583  }
584 
590  {
591  $fb = $this->questionGUI->getSpecificFeedbackOutput(
592  (array) $this->previewSession->getParticipantsSolution()
593  );
594 
595  if (!empty($fb)) {
596  $tpl->setCurrentBlock('instant_feedback_specific');
597  $tpl->setVariable('ANSWER_FEEDBACK', $fb);
598  $tpl->parseCurrentBlock();
599  return true;
600  }
601  return false;
602  }
603 
604  protected function populateInstantResponseHeader(ilTemplate $tpl, $withFocusAnchor)
605  {
606  if ($withFocusAnchor) {
607  $tpl->setCurrentBlock('inst_resp_id');
608  $tpl->setVariable('INSTANT_RESPONSE_FOCUS_ID', self::FEEDBACK_FOCUS_ANCHOR);
609  $tpl->parseCurrentBlock();
610  }
611 
612  $tpl->setCurrentBlock('instant_response_header');
613  $tpl->setVariable('INSTANT_RESPONSE_HEADER', $this->lng->txt('tst_feedback'));
614  $tpl->parseCurrentBlock();
615  }
616 
617  protected function populateInstantResponseMessage(ilTemplate $tpl, string $a_message)
618  {
619  $tpl->setCurrentBlock('instant_response_message');
620  $tpl->setVariable('INSTANT_RESPONSE_MESSAGE', $a_message);
621  $tpl->parseCurrentBlock();
622  }
623 
624  private function isShowBestSolutionRequired()
625  {
626  if (!$this->previewSettings->isBestSolutionEnabled()) {
627  return false;
628  }
629 
630  return $this->previewSession->isInstantResponseActive();
631  }
632 
634  {
635  if (!$this->previewSettings->isGenericFeedbackEnabled()) {
636  return false;
637  }
638 
639  return $this->previewSession->isInstantResponseActive();
640  }
641 
643  {
644  if (!$this->previewSettings->isSpecificFeedbackEnabled()) {
645  return false;
646  }
647 
648  return $this->previewSession->isInstantResponseActive();
649  }
650 
651  private function isShowReachedPointsRequired()
652  {
653  if (!$this->previewSettings->isReachedPointsEnabled()) {
654  return false;
655  }
656 
657  return $this->previewSession->isInstantResponseActive();
658  }
659 
660  public function saveQuestionSolution()
661  {
662  return $this->questionOBJ->persistPreviewState($this->previewSession);
663  }
664 
666  {
667  if (!$this->saveQuestionSolution()) {
668  $this->previewSession->setInstantResponseActive(false);
669  $this->showCmd();
670  return;
671  }
672 
673  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
674 
675  $this->ctrl->redirectByClass(
676  'ilAssQuestionHintRequestGUI',
678  );
679  }
680 
681  public function gatewayShowHintListCmd()
682  {
683  if (!$this->saveQuestionSolution()) {
684  $this->previewSession->setInstantResponseActive(false);
685  $this->showCmd();
686  return;
687  }
688 
689  require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintRequestGUI.php';
690 
691  $this->ctrl->redirectByClass(
692  'ilAssQuestionHintRequestGUI',
694  );
695  }
696 
700  private function getQuestionAnswerShuffler()
701  {
702  require_once 'Services/Randomization/classes/class.ilArrayElementShuffler.php';
703  $shuffler = new ilArrayElementShuffler();
704 
705  if (!$this->previewSession->randomizerSeedExists()) {
706  $this->previewSession->setRandomizerSeed($shuffler->buildRandomSeed());
707  }
708 
709  $shuffler->setSeed($this->previewSession->getRandomizerSeed());
710 
711  return $shuffler;
712  }
713 
714  protected function populateNotesPanel(ilTemplate $tpl, $notesPanelHTML)
715  {
716  if (!strlen($notesPanelHTML)) {
717  $notesPanelHTML = $this->questionGUI->getNotesHTML();
718  }
719 
720  $tpl->setCurrentBlock('notes_panel');
721  $tpl->setVariable('NOTES_PANEL', $notesPanelHTML);
722  $tpl->parseCurrentBlock();
723  }
724 }
static getContentStylePath($a_style_id, $add_random=true, $add_token=true)
get content style path
populateNotesPanel(ilTemplate $tpl, $notesPanelHTML)
__construct(ilCtrl $ctrl, ilTabsGUI $tabs, ilGlobalTemplateInterface $tpl, ilLanguage $lng, ilDBInterface $db, ilObjUser $user, RBACServices $rbac_services)
This class provides processing control methods.
setEditPreview($a_editpreview)
Set Display first Edit tab, then Preview tab, instead of Page and Edit.
Tabs GUI.
$_GET["client_id"]
enablePublicNotes($a_enable=true)
enable public notes
const OUTPUT_JAVASCRIPT
Question page GUI class.
user()
Definition: user.php:4
Notes GUI class.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
setVariable($variable, $value='')
Sets a variable value.
Definition: IT.php:615
static getReturnToPageLink($q_id=null)
global $DIC
Definition: goto.php:24
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
Definition: PEAR.php:64
Provides fluid interface to RBAC services.
Definition: RBACServices.php:9
populateGenericQuestionFeedback(ilTemplate $tpl)
Populate the block for an instant generic feedback.
setRenderPageContainer($a_val)
Set render page container.
populateInstantResponseHeader(ilTemplate $tpl, $withFocusAnchor)
static getSyntaxStylePath()
get syntax style path
populateInstantResponseMessage(ilTemplate $tpl, string $a_message)
setCurrentBlock($part="DEFAULT")
Überladene Funktion, die sich hier lokal noch den aktuellen Block merkt.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
initQuestion($questionId, $parentObjId)
static getInstanceByRefId($a_ref_id, $stop_on_error=true)
get an instance of an Ilias object by reference id
$_POST["username"]
parseCurrentBlock($part="DEFAULT")
Überladene Funktion, die auf den aktuelle Block vorher noch ein replace ausführt public...
static instantiateQuestionGUI($a_question_id)
Creates an instance of a question gui with a given question id.
populateSpecificQuestionFeedback(ilTemplate $tpl)
Populate the block for an instant specific feedback.