90         if ($this->page_obj_output_mode == 
"edit") {
    93         if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
    95                 $this->getPageObjectContent(
   124             $this->
lng->txt(
'feedback_complete_solution'),
   126             $this->questionOBJ->isAdditionalContentEditingModePageObject()
   130             $this->
lng->txt(
'feedback_incomplete_solution'),
   131             'feedback_incomplete',
   132             $this->questionOBJ->isAdditionalContentEditingModePageObject()
   152         if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
   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>',
   164                     $this->
lng->txt(
'tst_question_feedback_edit_page')
   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>',
   171                     $this->
lng->txt(
'tst_question_feedback_edit_page')
   188                 $this->questionOBJ->getId(),
   193                 $this->questionOBJ->getId(),
   198         $form->
getItemByPostVar(
'feedback_complete')->setValue($value_feedback_solution_complete);
   199         $form->
getItemByPostVar(
'feedback_incomplete')->setValue($value_feedback_solution_incomplete);
   214         if (!$this->questionOBJ->isAdditionalContentEditingModePageObject()) {
   246         if ($as_non_editable) {
   250             $property->setRequired(
false);
   251             $property->setRows(10);
   252             $property->setCols(80);
   254             if (!$this->questionOBJ->getPreventRteUsage()) {
   255                 $property->setUseRte(
true);
   257                 $property->setRTESupport($this->questionOBJ->getId(), 
"qpl", 
"assessment");
   260                 $property->setUseTagsForRteOnly(
false);
   263             $property->setRTESupport($this->questionOBJ->getId(), 
"qpl", 
"assessment");
   276         $res = $this->db->queryF(
   277             "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
   279             [$question_id, (
int) $solution_completed]
   282         $feedback_content = 
'';
   284         if ($this->db->numRows(
$res) > 0) {
   285             $row = $this->db->fetchAssoc(
$res);
   287                 $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($row[
'feedback'] ?? 
''),
   291         return $feedback_content;
   300         $res = $this->db->queryF(
   301             "SELECT answer FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s",
   306         $all_feedback_contents = 
'';
   308         while ($row = $this->db->fetchAssoc(
$res)) {
   310                 $this->questionOBJ->getId(),
   316         return trim(strip_tags($all_feedback_contents)) !== 
'';
   328         if ($feedback_content !== 
'') {
   329             $feedback_content = $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($feedback_content);
   333         if ($feedbackId !== -1) {
   337                     'feedback' => [
'clob', $feedback_content],
   338                     'tstamp' => [
'integer', time()]
   341                     'feedback_id' => [
'integer', $feedbackId]
   348                 'feedback_id' => [
'integer', $feedbackId],
   349                 'question_fi' => [
'integer', $question_id],
   350                 'correctness' => [
'text', (
int) $solution_completed], 
   351                 'feedback' => [
'clob', $feedback_content],
   352                 'tstamp' => [
'integer', time()]
   367         if ($isAdditionalContentEditingModePageObject) {
   379         $this->db->manipulateF(
   380             "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
   392     final public function duplicateFeedback(
int $originalQuestionId, 
int $duplicateQuestionId): void
   404         $res = $this->db->queryF(
   405             "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
   407             [$originalQuestionId]
   410         while ($row = $this->db->fetchAssoc(
$res)) {
   414                 'feedback_id' => [
'integer', $feedbackId],
   415                 'question_fi' => [
'integer', $duplicateQuestionId],
   416                 'correctness' => [
'text', $row[
'correctness']],
   417                 'feedback' => [
'clob', $row[
'feedback']],
   418                 'tstamp' => [
'integer', time()]
   421             if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
   423                 $this->
clonePageObject($page_object_type, $row[
'feedback_id'], $feedbackId, $duplicateQuestionId);
   432     abstract protected function cloneSpecificFeedback(
int $originalQuestionId, 
int $duplicateQuestionId): void;
   437     final public function cloneFeedback(
int $originalQuestionId, 
int $duplicateQuestionId): void
   449         $this->db->manipulateF(
   450             "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
   452             [$originalQuestionId]
   456         $result = $this->db->queryF(
   457             "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
   459             [$duplicateQuestionId]
   463         while ($row = $this->db->fetchAssoc($result)) {
   467                 'feedback_id' => [
'integer', $nextId],
   468                 'question_fi' => [
'integer', $originalQuestionId],
   469                 'correctness' => [
'text', $row[
'correctness']],
   470                 'feedback' => [
'clob', $row[
'feedback']],
   471                 'tstamp' => [
'integer', time()]
   481         $res = $this->db->queryF(
   482             "SELECT feedback_id FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
   484             [$question_id, (
int) $solution_completed]
   488         if ($this->db->numRows(
$res)) {
   489             $row = $this->db->fetchAssoc(
$res);
   490             $feedbackId = (
int) $row[
'feedback_id'];
   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]
   506         return (
bool) $row[
'cnt'];
   526         return self::TABLE_NAME_GENERIC_FEEDBACK;
   536         $content = $this->getPageObjectContent($page_object_type, $page_object_id);
   538             '<a href="%s">%s</a><br /><br />%s',
   540             $this->
lng->txt(
'tst_question_feedback_edit_page'),
   547         $gui = ($a_gui) ? 
"GUI" : 
"";
   550             return "ilAssGenFeedbackPage" . $gui;
   554         return "ilAssSpecFeedbackPage" . $gui;
   560         $this->
ctrl->setParameterByClass($cl, 
'feedback_type', $page_object_type);
   561         $this->
ctrl->setParameterByClass($cl, 
'feedback_id', $page_object_id);
   563         return $this->
ctrl->getLinkTargetByClass($cl, 
'edit');
   576     final protected function getPageObjectContent(
string $page_object_type, 
int $page_object_id): 
string   585         $pageObjectGUI = 
new $cl($page_object_id);
   586         return $pageObjectGUI->presentation($mode);
   589     final protected function getPageObjectXML(
string $page_object_type, 
int $page_object_id): string
   595         $pageObject = 
new $cl($page_object_id);
   596         return $pageObject->getXMLContent();
   604             $pageObject->setParentId($this->questionOBJ->getId());
   605             $pageObject->setId($page_object_id);
   606             $pageObject->createFromXML();
   611             $pageObject->setParentId($this->questionOBJ->getId());
   612             $pageObject->setId($page_object_id);
   613             $pageObject->createFromXML();
   617     final protected function createPageObject(
string $page_object_type, 
int $page_object_id, 
string $page_object_content): void
   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();
   629         string $page_object_type,
   630         int $source_page_object_id,
   631         int $target_page_object_id,
   632         int $target_page_object_parent_id
   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();
   647         if ($page_object_id === -1) {
   654                 $pageObject->delete();
   660                 $pageObject->delete();
   667         return self::PAGE_OBJECT_TYPE_GENERIC_FEEDBACK;
   672         return self::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK;
   681         switch ($feedbackPageObjectType) {
   682             case self::PAGE_OBJECT_TYPE_GENERIC_FEEDBACK:
   683             case self::PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK:
   698         return $page_object_id;
   707         if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
   716         return $genericFeedbackExportPresentation;
   731         if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
   735             $this->
createPageObject($page_object_type, $page_object_id, $feedback_content);
   741     abstract public function importSpecificAnswerFeedback(
int $question_id, 
int $question_index, 
int $answer_index, 
string $feedback_content): void;
   746             $this->getGenericFeedbackContent($question_id, 
true)
   750             $this->getGenericFeedbackContent($question_id, 
false)
   757         if (@$doc->loadHTML(
'<html><body>' . $content . 
'</body></html>')) {
   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) {
   774             $this->questionOBJ->getId(),
   781             $this->questionOBJ->getId(),
   787         $page_object_id = ($mode === 
'complete') ? $page_object_id_complete : $page_object_id_incomplete;
 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)
 
initSpecificFormProperties(ilPropertyFormGUI $form)
initialises a given form object's SPECIFIC form properties relating to this question type ...
 
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)
 
getPageObjectOutputMode()
 
importSpecificAnswerFeedback(int $question_id, int $question_index, int $answer_index, string $feedback_content)
 
getSpecificAnswerFeedbackPageObjectType()
 
getGenericFeedbackTableName()
 
cleanupPageContent(string $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)
 
migrateToLmContent($content)
 
saveSpecificFormProperties(ilPropertyFormGUI $form)
saves a given form object's SPECIFIC form properties relating to this question type ...
 
const CSS_CLASS_FEEDBACK_CORRECT
 
static isValidFeedbackPageObjectType(string $feedbackPageObjectType)
returns the fact whether the given page object type relates to generic or specific feedback page obje...
 
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 ...
 
const TABLE_NAME_GENERIC_FEEDBACK
 
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 
 
string $page_obj_output_mode
 
duplicateFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the feedback relating to the given original question id and saves it for the given duplica...
 
const CSS_CLASS_FEEDBACK_WRONG
 
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'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)
 
createFeedbackPages(string $mode)
 
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's GENERIC form properties relating to all question types ...
 
getGenericFeedbackPageObjectType()
 
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 ...
 
checkFeedbackParent(int $feedbackId)
 
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...
 
isGenericFeedbackId(int $feedbackId)
 
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...