ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilAssQuestionFeedback.php
Go to the documentation of this file.
1 <?php
2 
29 abstract class ilAssQuestionFeedback
30 {
31  public const CSS_CLASS_FEEDBACK_CORRECT = 'ilc_qfeedr_FeedbackRight';
32  public const CSS_CLASS_FEEDBACK_WRONG = 'ilc_qfeedw_FeedbackWrong';
33 
37  public const PAGE_OBJECT_TYPE_GENERIC_FEEDBACK = 'qfbg';
38 
42  public const PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK = 'qfbs';
43 
48 
53 
54  public const TABLE_NAME_GENERIC_FEEDBACK = 'qpl_fb_generic';
55 
57 
58  protected ilCtrl $ctrl;
59 
60  protected ilDBInterface $db;
61 
62  protected ilLanguage $lng;
63 
64  protected string $page_obj_output_mode = "presentation";
65 
76  final public function __construct(assQuestion $questionOBJ, ilCtrl $ctrl, ilDBInterface $db, ilLanguage $lng)
77  {
78  $this->questionOBJ = $questionOBJ;
79  $this->ctrl = $ctrl;
80  $this->lng = $lng;
81  $this->db = $db;
82  }
83 
88  public function getGenericFeedbackTestPresentation(int $question_id, bool $solution_completed): string
89  {
90  if ($this->page_obj_output_mode == "edit") {
91  return '';
92  }
93  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
94  return $this->cleanupPageContent(
95  $this->getPageObjectContent(
97  $this->getGenericFeedbackPageObjectId($question_id, $solution_completed)
98  )
99  );
100  }
101  return $this->getGenericFeedbackContent($question_id, $solution_completed);
102  }
103 
115  abstract public function getSpecificAnswerFeedbackTestPresentation(int $question_id, int $question_index, int $answer_index): string;
116 
121  final public function completeGenericFormProperties(ilPropertyFormGUI $form): void
122  {
124  $this->lng->txt('feedback_complete_solution'),
125  'feedback_complete',
126  $this->questionOBJ->isAdditionalContentEditingModePageObject()
127  ));
128 
130  $this->lng->txt('feedback_incomplete_solution'),
131  'feedback_incomplete',
132  $this->questionOBJ->isAdditionalContentEditingModePageObject()
133  ));
134  }
135 
144  abstract public function completeSpecificFormProperties(ilPropertyFormGUI $form): void;
145 
150  final public function initGenericFormProperties(ilPropertyFormGUI $form): void
151  {
152  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
153  $page_object_type = $this->getGenericFeedbackPageObjectType();
154 
155  $page_object_id = $this->getGenericFeedbackId($this->questionOBJ->getId(), true);
156 
157  if ($page_object_id === -1) {
158  $this->ctrl->setParameterByClass(ilAssQuestionFeedbackEditingGUI::class, 'feedback_type', $page_object_type);
159  $this->ctrl->setParameterByClass(ilAssQuestionFeedbackEditingGUI::class, 'fb_mode', 'complete');
160  $link = $this->ctrl->getLinkTargetByClass(ilAssQuestionFeedbackEditingGUI::class, 'createFeedbackPage');
161  $value_feedback_solution_complete = sprintf(
162  '<a href="%s">%s</a>',
163  $link,
164  $this->lng->txt('tst_question_feedback_edit_page')
165  );
166  $this->ctrl->setParameterByClass(ilAssQuestionFeedbackEditingGUI::class, 'fb_mode', 'incomplete');
167  $link = $this->ctrl->getLinkTargetByClass(ilAssQuestionFeedbackEditingGUI::class, 'createFeedbackPage');
168  $value_feedback_solution_incomplete = sprintf(
169  '<a href="%s">%s</a>',
170  $link,
171  $this->lng->txt('tst_question_feedback_edit_page')
172  );
173  } else {
174  $this->ensurePageObjectExists($page_object_type, $page_object_id);
175 
176  $value_feedback_solution_complete = $this->getPageObjectNonEditableValueHTML(
177  $page_object_type,
178  $this->getGenericFeedbackPageObjectId($this->questionOBJ->getId(), true)
179  );
180  $value_feedback_solution_incomplete = $this->getPageObjectNonEditableValueHTML(
181  $page_object_type,
182  $this->getGenericFeedbackPageObjectId($this->questionOBJ->getId(), false)
183  );
184  }
185 
186  } else {
187  $value_feedback_solution_complete = $this->getGenericFeedbackContent(
188  $this->questionOBJ->getId(),
189  true
190  );
191 
192  $value_feedback_solution_incomplete = $this->getGenericFeedbackContent(
193  $this->questionOBJ->getId(),
194  false
195  );
196  }
197 
198  $form->getItemByPostVar('feedback_complete')->setValue($value_feedback_solution_complete);
199  $form->getItemByPostVar('feedback_incomplete')->setValue($value_feedback_solution_incomplete);
200  }
201 
206  abstract public function initSpecificFormProperties(ilPropertyFormGUI $form): void;
207 
212  final public function saveGenericFormProperties(ilPropertyFormGUI $form): void
213  {
214  if (!$this->questionOBJ->isAdditionalContentEditingModePageObject()) {
215  $this->saveGenericFeedbackContent($this->questionOBJ->getId(), false, (string) $form->getInput('feedback_incomplete'));
216  $this->saveGenericFeedbackContent($this->questionOBJ->getId(), true, (string) $form->getInput('feedback_complete'));
217  }
218  }
219 
224  abstract public function saveSpecificFormProperties(ilPropertyFormGUI $form): void;
225 
231  public function isSaveableInPageObjectEditingMode(): bool
232  {
233  return false;
234  }
235 
244  final protected function buildFeedbackContentFormProperty(string $label, string $post_var, bool $as_non_editable): ilSubEnabledFormPropertyGUI
245  {
246  if ($as_non_editable) {
247  $property = new ilNonEditableValueGUI($label, $post_var, true);
248  } else {
249  $property = new ilTextAreaInputGUI($label, $post_var);
250  $property->setRequired(false);
251  $property->setRows(10);
252  $property->setCols(80);
253 
254  if (!$this->questionOBJ->getPreventRteUsage()) {
255  $property->setUseRte(true);
256  $property->setRteTags(ilRTESettings::_getUsedHTMLTags("assessment"));
257  $property->setRTESupport($this->questionOBJ->getId(), "qpl", "assessment");
258  } else {
260  $property->setUseTagsForRteOnly(false);
261  }
262  $property->setInfo($this->lng->txt('latex_edit_info'));
263 
264  $property->setRTESupport($this->questionOBJ->getId(), "qpl", "assessment");
265  }
266 
267  return $property;
268  }
269 
275  final public function getGenericFeedbackContent(int $question_id, bool $solution_completed): string
276  {
277  $res = $this->db->queryF(
278  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
279  ['integer', 'text'],
280  [$question_id, (int) $solution_completed]
281  );
282 
283  $feedback_content = '';
284 
285  if ($this->db->numRows($res) > 0) {
286  $row = $this->db->fetchAssoc($res);
287  $feedback_content = ilRTE::_replaceMediaObjectImageSrc(
288  $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($row['feedback'] ?? ''),
289  1
290  );
291  }
292  return $feedback_content;
293  }
294 
295  abstract public function getSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index): string;
296 
297  abstract public function getAllSpecificAnswerFeedbackContents(int $question_id): string;
298 
299  public function isSpecificAnswerFeedbackAvailable(int $question_id): bool
300  {
301  $res = $this->db->queryF(
302  "SELECT answer FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s",
303  ['integer'],
304  [$question_id]
305  );
306 
307  $all_feedback_contents = '';
308 
309  while ($row = $this->db->fetchAssoc($res)) {
310  $all_feedback_contents .= $this->getSpecificAnswerFeedbackExportPresentation(
311  $this->questionOBJ->getId(),
312  0,
313  $row['answer']
314  );
315  }
316 
317  return trim(strip_tags($all_feedback_contents)) !== '';
318  }
319 
325  final public function saveGenericFeedbackContent(int $question_id, bool $solution_completed, string $feedback_content): int
326  {
327  $feedbackId = $this->getGenericFeedbackId($question_id, $solution_completed);
328 
329  if ($feedback_content !== '') {
330  $feedback_content = $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($feedback_content);
331  $feedback_content = ilRTE::_replaceMediaObjectImageSrc($feedback_content, 0);
332  }
333 
334  if ($feedbackId !== -1) {
335  $this->db->update(
337  [
338  'feedback' => ['clob', $feedback_content],
339  'tstamp' => ['integer', time()]
340  ],
341  [
342  'feedback_id' => ['integer', $feedbackId]
343  ]
344  );
345  } else {
346  $feedbackId = $this->db->nextId($this->getGenericFeedbackTableName());
347 
348  $this->db->insert($this->getGenericFeedbackTableName(), [
349  'feedback_id' => ['integer', $feedbackId],
350  'question_fi' => ['integer', $question_id],
351  'correctness' => ['text', (int) $solution_completed], // text ?
352  'feedback' => ['clob', $feedback_content],
353  'tstamp' => ['integer', time()]
354  ]);
355  }
356 
357  return $feedbackId;
358  }
359 
360  abstract public function saveSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index, string $feedback_content): int;
361 
366  final public function deleteGenericFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject): void
367  {
368  if ($page_object_id === -1) {
369  return;
370  }
371  if ($isAdditionalContentEditingModePageObject) {
374  $this->getGenericFeedbackPageObjectId($question_id, true)
375  );
376 
379  $this->getGenericFeedbackPageObjectId($question_id, false)
380  );
381  }
382 
383  $this->db->manipulateF(
384  "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
385  ['integer'],
386  [$question_id]
387  );
388  }
389 
390  abstract public function deleteSpecificAnswerFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject): void;
391 
396  final public function duplicateFeedback(int $originalQuestionId, int $duplicateQuestionId): void
397  {
398  $this->duplicateGenericFeedback($originalQuestionId, $duplicateQuestionId);
399  $this->cloneSpecificFeedback($originalQuestionId, $duplicateQuestionId);
400  }
401 
406  private function duplicateGenericFeedback(int $originalQuestionId, int $duplicateQuestionId): void
407  {
408  $res = $this->db->queryF(
409  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
410  ['integer'],
411  [$originalQuestionId]
412  );
413 
414  while ($row = $this->db->fetchAssoc($res)) {
415  $feedbackId = $this->db->nextId($this->getGenericFeedbackTableName());
416 
417  $this->db->insert($this->getGenericFeedbackTableName(), [
418  'feedback_id' => ['integer', $feedbackId],
419  'question_fi' => ['integer', $duplicateQuestionId],
420  'correctness' => ['text', $row['correctness']],
421  'feedback' => ['clob', $row['feedback']],
422  'tstamp' => ['integer', time()]
423  ]);
424 
425  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
426  $page_object_type = $this->getGenericFeedbackPageObjectType();
427  $this->clonePageObject($page_object_type, $row['feedback_id'], $feedbackId, $duplicateQuestionId);
428  }
429  }
430  }
431 
436  abstract protected function cloneSpecificFeedback(int $originalQuestionId, int $duplicateQuestionId): void;
437 
441  final public function cloneFeedback(int $originalQuestionId, int $duplicateQuestionId): void
442  {
443  $this->cloneGenericFeedback($originalQuestionId, $duplicateQuestionId);
444  $this->cloneSpecificFeedback($originalQuestionId, $duplicateQuestionId);
445  }
446 
450  private function cloneGenericFeedback(int $originalQuestionId, int $duplicateQuestionId): void
451  {
452  // delete generic feedback of the original question
453  $this->db->manipulateF(
454  "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
455  ['integer'],
456  [$originalQuestionId]
457  );
458 
459  // get generic feedback of the actual (duplicated) question
460  $result = $this->db->queryF(
461  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
462  ['integer'],
463  [$duplicateQuestionId]
464  );
465 
466  // save generic feedback to the original question
467  while ($row = $this->db->fetchAssoc($result)) {
468  $nextId = $this->db->nextId($this->getGenericFeedbackTableName());
469 
470  $this->db->insert($this->getGenericFeedbackTableName(), [
471  'feedback_id' => ['integer', $nextId],
472  'question_fi' => ['integer', $originalQuestionId],
473  'correctness' => ['text', $row['correctness']],
474  'feedback' => ['clob', $row['feedback']],
475  'tstamp' => ['integer', time()]
476  ]);
477  }
478  }
479 
483  final protected function getGenericFeedbackId(int $question_id, bool $solution_completed): int
484  {
485  $res = $this->db->queryF(
486  "SELECT feedback_id FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
487  ['integer','text'],
488  [$question_id, (int) $solution_completed]
489  );
490 
491  $feedbackId = -1;
492  if ($this->db->numRows($res)) {
493  $row = $this->db->fetchAssoc($res);
494  $feedbackId = (int) $row['feedback_id'];
495  }
496 
497  return $feedbackId;
498  }
499 
500  protected function isGenericFeedbackId(int $feedbackId): bool
501  {
502  $row = $this->db->fetchAssoc($this->db->queryF(
503  "SELECT COUNT(feedback_id) cnt FROM {$this->getGenericFeedbackTableName()}
504  WHERE question_fi = %s AND feedback_id = %s",
505  ['integer','integer'],
506  [$this->questionOBJ->getId(), $feedbackId]
507  ));
508 
509 
510  return (bool) $row['cnt'];
511  }
512 
513  abstract protected function isSpecificAnswerFeedbackId(int $feedbackId): bool;
514 
515  final public function checkFeedbackParent(int $feedbackId): bool
516  {
517  if ($this->isGenericFeedbackId($feedbackId)) {
518  return true;
519  }
520 
521  if ($this->isSpecificAnswerFeedbackId($feedbackId)) {
522  return true;
523  }
524 
525  return false;
526  }
527 
528  final protected function getGenericFeedbackTableName(): string
529  {
530  return self::TABLE_NAME_GENERIC_FEEDBACK;
531  }
532 
537  final protected function getPageObjectNonEditableValueHTML(string $page_object_type, int $page_object_id): string
538  {
539  $link = $this->getPageObjectEditingLink($page_object_type, $page_object_id);
540  $content = $this->getPageObjectContent($page_object_type, $page_object_id);
541  return sprintf(
542  '<a href="%s">%s</a><br /><br />%s',
543  $link,
544  $this->lng->txt('tst_question_feedback_edit_page'),
545  $content
546  );
547  }
548 
549  public function getClassNameByType(string $a_type, bool $a_gui = false): string
550  {
551  $gui = ($a_gui) ? "GUI" : "";
552 
554  return "ilAssGenFeedbackPage" . $gui;
555  }
556 
557  //if ($a_type == ilAssQuestionFeedback::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK) {
558  return "ilAssSpecFeedbackPage" . $gui;
559  }
560 
561  private function getPageObjectEditingLink(string $page_object_type, int $page_object_id): string
562  {
563  $cl = $this->getClassNameByType($page_object_type, true);
564  $this->ctrl->setParameterByClass($cl, 'feedback_type', $page_object_type);
565  $this->ctrl->setParameterByClass($cl, 'feedback_id', $page_object_id);
566 
567  return $this->ctrl->getLinkTargetByClass($cl, 'edit');
568  }
569 
570  final public function setPageObjectOutputMode(string $page_obj_output_mode): void
571  {
572  $this->page_obj_output_mode = $page_obj_output_mode;
573  }
574 
575  final public function getPageObjectOutputMode(): string
576  {
578  }
579 
580  final protected function getPageObjectContent(string $page_object_type, int $page_object_id): string
581  {
582  $cl = $this->getClassNameByType($page_object_type, true);
583 
584  $this->ensurePageObjectExists($page_object_type, $page_object_id);
585 
586  $mode = ($this->ctrl->isAsynch()) ? "presentation" : $this->getPageObjectOutputMode();
587 
589  $pageObjectGUI = new $cl($page_object_id);
590  return $pageObjectGUI->presentation($mode);
591  }
592 
593  final protected function getPageObjectXML(string $page_object_type, int $page_object_id): string
594  {
595  $cl = $this->getClassNameByType($page_object_type);
596 
597  $this->ensurePageObjectExists($page_object_type, $page_object_id);
598 
599  $pageObject = new $cl($page_object_id);
600  return $pageObject->getXMLContent();
601  }
602 
603  private function ensurePageObjectExists(string $page_object_type, int $page_object_id): void
604  {
606  && !ilAssGenFeedbackPage::_exists($page_object_type, $page_object_id, '', true)) {
607  $pageObject = new ilAssGenFeedbackPage();
608  $pageObject->setParentId($this->questionOBJ->getId());
609  $pageObject->setId($page_object_id);
610  $pageObject->createFromXML();
611  }
613  && !ilAssSpecFeedbackPage::_exists($page_object_type, $page_object_id, '', true)) {
614  $pageObject = new ilAssSpecFeedbackPage();
615  $pageObject->setParentId($this->questionOBJ->getId());
616  $pageObject->setId($page_object_id);
617  $pageObject->createFromXML();
618  }
619  }
620 
621  final protected function createPageObject(string $page_object_type, int $page_object_id, string $page_object_content): void
622  {
623  $cl = $this->getClassNameByType($page_object_type);
624 
625  $pageObject = new $cl();
626  $pageObject->setParentId($this->questionOBJ->getId());
627  $pageObject->setId($page_object_id);
628  $pageObject->setXMLContent($page_object_content);
629  $pageObject->createFromXML();
630  }
631 
632  final protected function clonePageObject(
633  string $page_object_type,
634  int $source_page_object_id,
635  int $target_page_object_id,
636  int $target_page_object_parent_id
637  ): void {
638  $this->ensurePageObjectExists($page_object_type, $source_page_object_id);
639  $this->ensurePageObjectExists($page_object_type, $target_page_object_id);
640 
641  $cl = $this->getClassNameByType($page_object_type);
642 
643  $pageObject = new $cl($source_page_object_id);
644  $pageObject->setParentId($target_page_object_parent_id);
645  $pageObject->setId($target_page_object_id);
646  $pageObject->updateFromXML();
647  }
648 
649  final protected function ensurePageObjectDeleted(string $page_object_type, int $page_object_id): void
650  {
652  if (ilAssGenFeedbackPage::_exists($page_object_type, $page_object_id)) {
653  $pageObject = new ilAssGenFeedbackPage($page_object_id);
654  $pageObject->delete();
655  }
656  }
658  if (ilAssSpecFeedbackPage::_exists($page_object_type, $page_object_id)) {
659  $pageObject = new ilAssSpecFeedbackPage($page_object_id);
660  $pageObject->delete();
661  }
662  }
663  }
664 
665  final protected function getGenericFeedbackPageObjectType(): string
666  {
667  return self::PAGE_OBJECT_TYPE_GENERIC_FEEDBACK;
668  }
669 
670  final protected function getSpecificAnswerFeedbackPageObjectType(): string
671  {
672  return self::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK;
673  }
674 
679  final public static function isValidFeedbackPageObjectType(string $feedbackPageObjectType): bool
680  {
681  switch ($feedbackPageObjectType) {
682  case self::PAGE_OBJECT_TYPE_GENERIC_FEEDBACK:
683  case self::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK:
684  return true;
685  }
686 
687  return false;
688  }
689 
695  final protected function getGenericFeedbackPageObjectId(int $question_id, bool $solution_completed): int
696  {
697  $page_object_id = $this->getGenericFeedbackId($question_id, $solution_completed);
698  return $page_object_id;
699  }
700 
705  public function getGenericFeedbackExportPresentation(int $question_id, bool $solution_completed): string
706  {
707  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
708  $genericFeedbackExportPresentation = $this->getPageObjectXML(
710  $this->getGenericFeedbackPageObjectId($question_id, $solution_completed)
711  );
712  } else {
713  $genericFeedbackExportPresentation = $this->getGenericFeedbackContent($question_id, $solution_completed);
714  }
715 
716  return $genericFeedbackExportPresentation;
717  }
718 
723  abstract public function getSpecificAnswerFeedbackExportPresentation(int $question_id, int $question_index, int $answer_index): string;
724 
729  public function importGenericFeedback(int $question_id, bool $solution_completed, string $feedback_content): void
730  {
731  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
732  $page_object_id = $this->saveGenericFeedbackContent($question_id, $solution_completed, '');
733  $page_object_type = $this->getGenericFeedbackPageObjectType();
734 
735  $this->createPageObject($page_object_type, $page_object_id, $feedback_content);
736  } else {
737  $this->saveGenericFeedbackContent($question_id, $solution_completed, $feedback_content);
738  }
739  }
740 
741  abstract public function importSpecificAnswerFeedback(int $question_id, int $question_index, int $answer_index, string $feedback_content): void;
742 
743  public function migrateContentForLearningModule(ilAssSelfAssessmentMigrator $migrator, int $question_id): void
744  {
745  $this->saveGenericFeedbackContent($question_id, true, $migrator->migrateToLmContent(
746  $this->getGenericFeedbackContent($question_id, true)
747  ));
748 
749  $this->saveGenericFeedbackContent($question_id, false, $migrator->migrateToLmContent(
750  $this->getGenericFeedbackContent($question_id, false)
751  ));
752  }
753 
754  protected function cleanupPageContent(string $content): string
755  {
756  $doc = new DOMDocument('1.0', 'UTF-8');
757  if (@$doc->loadHTML('<html><body>' . $content . '</body></html>')) {
758  $xpath = new DOMXPath($doc);
759  $nodes_after_comments = $xpath->query('//comment()/following-sibling::*[1]');
760  foreach ($nodes_after_comments as $node_after_comments) {
761  if (trim($node_after_comments->nodeValue) === ''
762  && $node_after_comments->childElementCount === 0) {
763  return '';
764  }
765  }
766  }
767  return $content;
768  }
769 
770  public function createFeedbackPages(string $mode): string
771  {
773  $page_object_id_complete = $this->saveGenericFeedbackContent(
774  $this->questionOBJ->getId(),
775  true,
776  ''
777  );
778  $this->ensurePageObjectExists($page_object_type, $page_object_id_complete);
779 
780  $page_object_id_incomplete = $this->saveGenericFeedbackContent(
781  $this->questionOBJ->getId(),
782  false,
783  ''
784  );
785  $this->ensurePageObjectExists($page_object_type, $page_object_id_incomplete);
786 
787  $page_object_id = ($mode === 'complete') ? $page_object_id_complete : $page_object_id_incomplete;
788  return $this->getPageObjectEditingLink(
789  $page_object_type,
790  $page_object_id
791  );
792  }
793 
794 }
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
clonePageObject(string $page_object_type, int $source_page_object_id, int $target_page_object_id, int $target_page_object_parent_id)
static getSelfAssessmentTags()
Get tags allowed in question tags in self assessment mode.
initSpecificFormProperties(ilPropertyFormGUI $form)
initialises a given form object&#39;s SPECIFIC form properties relating to this question type ...
$res
Definition: ltiservices.php:66
saveGenericFeedbackContent(int $question_id, bool $solution_completed, string $feedback_content)
saves GENERIC feedback content for the given question id to the database.
ensurePageObjectExists(string $page_object_type, int $page_object_id)
getItemByPostVar(string $a_post_var)
importSpecificAnswerFeedback(int $question_id, int $question_index, int $answer_index, string $feedback_content)
cloneSpecificFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the SPECIFIC feedback relating to the given original question id and saves it for the give...
__construct(assQuestion $questionOBJ, ilCtrl $ctrl, ilDBInterface $db, ilLanguage $lng)
constructor
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getPageObjectEditingLink(string $page_object_type, int $page_object_id)
deleteGenericFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject)
deletes all GENERIC feedback contents (and page objects if required) for the given question id ...
getClassNameByType(string $a_type, bool $a_gui=false)
saveSpecificFormProperties(ilPropertyFormGUI $form)
saves a given form object&#39;s SPECIFIC form properties relating to this question type ...
static isValidFeedbackPageObjectType(string $feedbackPageObjectType)
returns the fact whether the given page object type relates to generic or specific feedback page obje...
getInput(string $a_post_var, bool $ensureValidation=true)
Returns the input of an item, if item provides getInput method and as fallback the value of the HTTP-...
deleteSpecificAnswerFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject)
saveSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index, string $feedback_content)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
migrateContentForLearningModule(ilAssSelfAssessmentMigrator $migrator, int $question_id)
static _getUsedHTMLTags(string $module='')
cloneFeedback(int $originalQuestionId, int $duplicateQuestionId)
syncs the feedback from a duplicated question back to the original question
getPageObjectXML(string $page_object_type, int $page_object_id)
getGenericFeedbackContent(int $question_id, bool $solution_completed)
returns the GENERIC feedback content for a given question state.
isSpecificAnswerFeedbackId(int $feedbackId)
isSpecificAnswerFeedbackAvailable(int $question_id)
getSpecificAnswerFeedbackExportPresentation(int $question_id, int $question_index, int $answer_index)
returns the generic feedback export presentation for given question id either for solution completed ...
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
createPageObject(string $page_object_type, int $page_object_id, string $page_object_content)
const PAGE_OBJECT_TYPE_GENERIC_FEEDBACK
type for generic feedback page objects
duplicateFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the feedback relating to the given original question id and saves it for the given duplica...
getAllSpecificAnswerFeedbackContents(int $question_id)
const FEEDBACK_SOLUTION_INCOMPLETE_PAGE_OBJECT_ID
id for page object relating to generic incomplete solution feedback
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getPageObjectNonEditableValueHTML(string $page_object_type, int $page_object_id)
returns html content to be used as value for non editable value form properties in feedback editing f...
getSpecificAnswerFeedbackTestPresentation(int $question_id, int $question_index, int $answer_index)
returns the html of SPECIFIC feedback for the given question id and answer index for test presentatio...
isSaveableInPageObjectEditingMode()
returns the fact wether the feedback editing form is saveable in page object editing or not...
cloneGenericFeedback(int $originalQuestionId, int $duplicateQuestionId)
syncs the GENERIC feedback from a duplicated question back to the original question ...
saveGenericFormProperties(ilPropertyFormGUI $form)
saves a given form object&#39;s GENERIC form properties relating to all question types ...
const FEEDBACK_SOLUTION_COMPLETE_PAGE_OBJECT_ID
id for page object relating to generic complete solution feedback
getGenericFeedbackId(int $question_id, bool $solution_completed)
returns the SPECIFIC answer feedback ID for a given question id and answer index. ...
getGenericFeedbackTestPresentation(int $question_id, bool $solution_completed)
returns the html of GENERIC feedback for the given question id for test presentation (either for the ...
getSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index)
This class represents a property that may include a sub form.
This class represents a text area property in a property form.
completeGenericFormProperties(ilPropertyFormGUI $form)
completes a given form object with the GENERIC form properties required by all question types ...
completeSpecificFormProperties(ilPropertyFormGUI $form)
completes a given form object with the SPECIFIC form properties required by this question type ...
initGenericFormProperties(ilPropertyFormGUI $form)
initialises a given form object&#39;s GENERIC form properties relating to all question types ...
duplicateGenericFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the GENERIC feedback relating to the given original question id and saves it for the given...
setPageObjectOutputMode(string $page_obj_output_mode)
getGenericFeedbackExportPresentation(int $question_id, bool $solution_completed)
returns the generic feedback export presentation for given question id either for solution completed ...
ensurePageObjectDeleted(string $page_object_type, int $page_object_id)
buildFeedbackContentFormProperty(string $label, string $post_var, bool $as_non_editable)
builds and returns a form property gui object with the given label and postvar that is addable to pro...
getGenericFeedbackPageObjectId(int $question_id, bool $solution_completed)
returns a useable page object id for generic feedback page objects for the given question id for eith...
const PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK
type for specific feedback page objects
importGenericFeedback(int $question_id, bool $solution_completed, string $feedback_content)
imports the given feedback content as generic feedback for the given question id for either the compl...