ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
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(ilObjAdvancedEditing::_getUsedHTMLTags("assessment"));
257  $property->setRTESupport($this->questionOBJ->getId(), "qpl", "assessment");
258  } else {
260  $property->setUseTagsForRteOnly(false);
261  }
262 
263  $property->setRTESupport($this->questionOBJ->getId(), "qpl", "assessment");
264  }
265 
266  return $property;
267  }
268 
274  final public function getGenericFeedbackContent(int $question_id, bool $solution_completed): string
275  {
276  $res = $this->db->queryF(
277  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
278  ['integer', 'text'],
279  [$question_id, (int) $solution_completed]
280  );
281 
282  $feedback_content = '';
283 
284  if ($this->db->numRows($res) > 0) {
285  $row = $this->db->fetchAssoc($res);
286  $feedback_content = ilRTE::_replaceMediaObjectImageSrc(
287  $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($row['feedback'] ?? ''),
288  1
289  );
290  }
291  return $feedback_content;
292  }
293 
294  abstract public function getSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index): string;
295 
296  abstract public function getAllSpecificAnswerFeedbackContents(int $question_id): string;
297 
298  public function isSpecificAnswerFeedbackAvailable(int $question_id): bool
299  {
300  $res = $this->db->queryF(
301  "SELECT answer FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s",
302  ['integer'],
303  [$question_id]
304  );
305 
306  $all_feedback_contents = '';
307 
308  while ($row = $this->db->fetchAssoc($res)) {
309  $all_feedback_contents .= $this->getSpecificAnswerFeedbackExportPresentation(
310  $this->questionOBJ->getId(),
311  0,
312  $row['answer']
313  );
314  }
315 
316  return trim(strip_tags($all_feedback_contents)) !== '';
317  }
318 
324  final public function saveGenericFeedbackContent(int $question_id, bool $solution_completed, string $feedback_content): int
325  {
326  $feedbackId = $this->getGenericFeedbackId($question_id, $solution_completed);
327 
328  if ($feedback_content !== '') {
329  $feedback_content = $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($feedback_content);
330  $feedback_content = ilRTE::_replaceMediaObjectImageSrc($feedback_content, 0);
331  }
332 
333  if ($feedbackId !== -1) {
334  $this->db->update(
336  [
337  'feedback' => ['clob', $feedback_content],
338  'tstamp' => ['integer', time()]
339  ],
340  [
341  'feedback_id' => ['integer', $feedbackId]
342  ]
343  );
344  } else {
345  $feedbackId = $this->db->nextId($this->getGenericFeedbackTableName());
346 
347  $this->db->insert($this->getGenericFeedbackTableName(), [
348  'feedback_id' => ['integer', $feedbackId],
349  'question_fi' => ['integer', $question_id],
350  'correctness' => ['text', (int) $solution_completed], // text ?
351  'feedback' => ['clob', $feedback_content],
352  'tstamp' => ['integer', time()]
353  ]);
354  }
355 
356  return $feedbackId;
357  }
358 
359  abstract public function saveSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index, string $feedback_content): int;
360 
365  final public function deleteGenericFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject): void
366  {
367  if ($isAdditionalContentEditingModePageObject) {
370  $this->getGenericFeedbackPageObjectId($question_id, true)
371  );
372 
375  $this->getGenericFeedbackPageObjectId($question_id, false)
376  );
377  }
378 
379  $this->db->manipulateF(
380  "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
381  ['integer'],
382  [$question_id]
383  );
384  }
385 
386  abstract public function deleteSpecificAnswerFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject): void;
387 
392  final public function duplicateFeedback(int $originalQuestionId, int $duplicateQuestionId): void
393  {
394  $this->duplicateGenericFeedback($originalQuestionId, $duplicateQuestionId);
395  $this->cloneSpecificFeedback($originalQuestionId, $duplicateQuestionId);
396  }
397 
402  private function duplicateGenericFeedback(int $originalQuestionId, int $duplicateQuestionId): void
403  {
404  $res = $this->db->queryF(
405  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
406  ['integer'],
407  [$originalQuestionId]
408  );
409 
410  while ($row = $this->db->fetchAssoc($res)) {
411  $feedbackId = $this->db->nextId($this->getGenericFeedbackTableName());
412 
413  $this->db->insert($this->getGenericFeedbackTableName(), [
414  'feedback_id' => ['integer', $feedbackId],
415  'question_fi' => ['integer', $duplicateQuestionId],
416  'correctness' => ['text', $row['correctness']],
417  'feedback' => ['clob', $row['feedback']],
418  'tstamp' => ['integer', time()]
419  ]);
420 
421  if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
422  $page_object_type = $this->getGenericFeedbackPageObjectType();
423  $this->clonePageObject($page_object_type, $row['feedback_id'], $feedbackId, $duplicateQuestionId);
424  }
425  }
426  }
427 
432  abstract protected function cloneSpecificFeedback(int $originalQuestionId, int $duplicateQuestionId): void;
433 
437  final public function cloneFeedback(int $originalQuestionId, int $duplicateQuestionId): void
438  {
439  $this->cloneGenericFeedback($originalQuestionId, $duplicateQuestionId);
440  $this->cloneSpecificFeedback($originalQuestionId, $duplicateQuestionId);
441  }
442 
446  private function cloneGenericFeedback(int $originalQuestionId, int $duplicateQuestionId): void
447  {
448  // delete generic feedback of the original question
449  $this->db->manipulateF(
450  "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
451  ['integer'],
452  [$originalQuestionId]
453  );
454 
455  // get generic feedback of the actual (duplicated) question
456  $result = $this->db->queryF(
457  "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
458  ['integer'],
459  [$duplicateQuestionId]
460  );
461 
462  // save generic feedback to the original question
463  while ($row = $this->db->fetchAssoc($result)) {
464  $nextId = $this->db->nextId($this->getGenericFeedbackTableName());
465 
466  $this->db->insert($this->getGenericFeedbackTableName(), [
467  'feedback_id' => ['integer', $nextId],
468  'question_fi' => ['integer', $originalQuestionId],
469  'correctness' => ['text', $row['correctness']],
470  'feedback' => ['clob', $row['feedback']],
471  'tstamp' => ['integer', time()]
472  ]);
473  }
474  }
475 
479  final protected function getGenericFeedbackId(int $question_id, bool $solution_completed): int
480  {
481  $res = $this->db->queryF(
482  "SELECT feedback_id FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
483  ['integer','text'],
484  [$question_id, (int) $solution_completed]
485  );
486 
487  $feedbackId = -1;
488  if ($this->db->numRows($res)) {
489  $row = $this->db->fetchAssoc($res);
490  $feedbackId = (int) $row['feedback_id'];
491  }
492 
493  return $feedbackId;
494  }
495 
496  protected function isGenericFeedbackId(int $feedbackId): bool
497  {
498  $row = $this->db->fetchAssoc($this->db->queryF(
499  "SELECT COUNT(feedback_id) cnt FROM {$this->getGenericFeedbackTableName()}
500  WHERE question_fi = %s AND feedback_id = %s",
501  ['integer','integer'],
502  [$this->questionOBJ->getId(), $feedbackId]
503  ));
504 
505 
506  return (bool) $row['cnt'];
507  }
508 
509  abstract protected function isSpecificAnswerFeedbackId(int $feedbackId): bool;
510 
511  final public function checkFeedbackParent(int $feedbackId): bool
512  {
513  if ($this->isGenericFeedbackId($feedbackId)) {
514  return true;
515  }
516 
517  if ($this->isSpecificAnswerFeedbackId($feedbackId)) {
518  return true;
519  }
520 
521  return false;
522  }
523 
524  final protected function getGenericFeedbackTableName(): string
525  {
526  return self::TABLE_NAME_GENERIC_FEEDBACK;
527  }
528 
533  final protected function getPageObjectNonEditableValueHTML(string $page_object_type, int $page_object_id): string
534  {
535  $link = $this->getPageObjectEditingLink($page_object_type, $page_object_id);
536  $content = $this->getPageObjectContent($page_object_type, $page_object_id);
537  return sprintf(
538  '<a href="%s">%s</a><br /><br />%s',
539  $link,
540  $this->lng->txt('tst_question_feedback_edit_page'),
541  $content
542  );
543  }
544 
545  public function getClassNameByType(string $a_type, bool $a_gui = false): string
546  {
547  $gui = ($a_gui) ? "GUI" : "";
548 
550  return "ilAssGenFeedbackPage" . $gui;
551  }
552 
553  //if ($a_type == ilAssQuestionFeedback::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK) {
554  return "ilAssSpecFeedbackPage" . $gui;
555  }
556 
557  private function getPageObjectEditingLink(string $page_object_type, int $page_object_id): string
558  {
559  $cl = $this->getClassNameByType($page_object_type, true);
560  $this->ctrl->setParameterByClass($cl, 'feedback_type', $page_object_type);
561  $this->ctrl->setParameterByClass($cl, 'feedback_id', $page_object_id);
562 
563  return $this->ctrl->getLinkTargetByClass($cl, 'edit');
564  }
565 
566  final public function setPageObjectOutputMode(string $page_obj_output_mode): void
567  {
568  $this->page_obj_output_mode = $page_obj_output_mode;
569  }
570 
571  final public function getPageObjectOutputMode(): string
572  {
574  }
575 
576  final protected function getPageObjectContent(string $page_object_type, int $page_object_id): string
577  {
578  $cl = $this->getClassNameByType($page_object_type, true);
579 
580  $this->ensurePageObjectExists($page_object_type, $page_object_id);
581 
582  $mode = ($this->ctrl->isAsynch()) ? "presentation" : $this->getPageObjectOutputMode();
583 
585  $pageObjectGUI = new $cl($page_object_id);
586  return $pageObjectGUI->presentation($mode);
587  }
588 
589  final protected function getPageObjectXML(string $page_object_type, int $page_object_id): string
590  {
591  $cl = $this->getClassNameByType($page_object_type);
592 
593  $this->ensurePageObjectExists($page_object_type, $page_object_id);
594 
595  $pageObject = new $cl($page_object_id);
596  return $pageObject->getXMLContent();
597  }
598 
599  private function ensurePageObjectExists(string $page_object_type, int $page_object_id): void
600  {
602  && !ilAssGenFeedbackPage::_exists($page_object_type, $page_object_id, '', true)) {
603  $pageObject = new ilAssGenFeedbackPage();
604  $pageObject->setParentId($this->questionOBJ->getId());
605  $pageObject->setId($page_object_id);
606  $pageObject->createFromXML();
607  }
609  && !ilAssSpecFeedbackPage::_exists($page_object_type, $page_object_id, '', true)) {
610  $pageObject = new ilAssSpecFeedbackPage();
611  $pageObject->setParentId($this->questionOBJ->getId());
612  $pageObject->setId($page_object_id);
613  $pageObject->createFromXML();
614  }
615  }
616 
617  final protected function createPageObject(string $page_object_type, int $page_object_id, string $page_object_content): void
618  {
619  $cl = $this->getClassNameByType($page_object_type);
620 
621  $pageObject = new $cl();
622  $pageObject->setParentId($this->questionOBJ->getId());
623  $pageObject->setId($page_object_id);
624  $pageObject->setXMLContent($page_object_content);
625  $pageObject->createFromXML();
626  }
627 
628  final protected function clonePageObject(
629  string $page_object_type,
630  int $source_page_object_id,
631  int $target_page_object_id,
632  int $target_page_object_parent_id
633  ): void {
634  $this->ensurePageObjectExists($page_object_type, $source_page_object_id);
635  $this->ensurePageObjectExists($page_object_type, $target_page_object_id);
636 
637  $cl = $this->getClassNameByType($page_object_type);
638 
639  $pageObject = new $cl($source_page_object_id);
640  $pageObject->setParentId($target_page_object_parent_id);
641  $pageObject->setId($target_page_object_id);
642  $pageObject->updateFromXML();
643  }
644 
645  final protected function ensurePageObjectDeleted(string $page_object_type, int $page_object_id): void
646  {
647  if ($page_object_id === -1) {
648  return;
649  }
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:69
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)
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 file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
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...
static _getUsedHTMLTags(string $a_module="")
Returns an array of all allowed HTML tags for text editing.
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...