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);
262 $property->setInfo($this->
lng->txt(
'latex_edit_info'));
264 $property->setRTESupport($this->questionOBJ->getId(),
"qpl",
"assessment");
277 $res = $this->db->queryF(
278 "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
280 [$question_id, (
int) $solution_completed]
283 $feedback_content =
'';
285 if ($this->db->numRows(
$res) > 0) {
286 $row = $this->db->fetchAssoc(
$res);
288 $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($row[
'feedback'] ??
''),
292 return $feedback_content;
301 $res = $this->db->queryF(
302 "SELECT answer FROM {$this->getSpecificFeedbackTableName()} WHERE question_fi = %s",
307 $all_feedback_contents =
'';
309 while ($row = $this->db->fetchAssoc(
$res)) {
311 $this->questionOBJ->getId(),
317 return trim(strip_tags($all_feedback_contents)) !==
'';
329 if ($feedback_content !==
'') {
330 $feedback_content = $this->questionOBJ->getHtmlQuestionContentPurifier()->purify($feedback_content);
334 if ($feedbackId !== -1) {
338 'feedback' => [
'clob', $feedback_content],
339 'tstamp' => [
'integer', time()]
342 'feedback_id' => [
'integer', $feedbackId]
349 'feedback_id' => [
'integer', $feedbackId],
350 'question_fi' => [
'integer', $question_id],
351 'correctness' => [
'text', (
int) $solution_completed],
352 'feedback' => [
'clob', $feedback_content],
353 'tstamp' => [
'integer', time()]
368 if ($page_object_id === -1) {
371 if ($isAdditionalContentEditingModePageObject) {
383 $this->db->manipulateF(
384 "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
396 final public function duplicateFeedback(
int $originalQuestionId,
int $duplicateQuestionId): void
408 $res = $this->db->queryF(
409 "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
411 [$originalQuestionId]
414 while ($row = $this->db->fetchAssoc(
$res)) {
418 'feedback_id' => [
'integer', $feedbackId],
419 'question_fi' => [
'integer', $duplicateQuestionId],
420 'correctness' => [
'text', $row[
'correctness']],
421 'feedback' => [
'clob', $row[
'feedback']],
422 'tstamp' => [
'integer', time()]
425 if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
427 $this->
clonePageObject($page_object_type, $row[
'feedback_id'], $feedbackId, $duplicateQuestionId);
436 abstract protected function cloneSpecificFeedback(
int $originalQuestionId,
int $duplicateQuestionId): void;
441 final public function cloneFeedback(
int $originalQuestionId,
int $duplicateQuestionId): void
453 $this->db->manipulateF(
454 "DELETE FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
456 [$originalQuestionId]
460 $result = $this->db->queryF(
461 "SELECT * FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s",
463 [$duplicateQuestionId]
467 while ($row = $this->db->fetchAssoc($result)) {
471 'feedback_id' => [
'integer', $nextId],
472 'question_fi' => [
'integer', $originalQuestionId],
473 'correctness' => [
'text', $row[
'correctness']],
474 'feedback' => [
'clob', $row[
'feedback']],
475 'tstamp' => [
'integer', time()]
485 $res = $this->db->queryF(
486 "SELECT feedback_id FROM {$this->getGenericFeedbackTableName()} WHERE question_fi = %s AND correctness = %s",
488 [$question_id, (
int) $solution_completed]
492 if ($this->db->numRows(
$res)) {
493 $row = $this->db->fetchAssoc(
$res);
494 $feedbackId = (
int) $row[
'feedback_id'];
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]
510 return (
bool) $row[
'cnt'];
530 return self::TABLE_NAME_GENERIC_FEEDBACK;
540 $content = $this->getPageObjectContent($page_object_type, $page_object_id);
542 '<a href="%s">%s</a><br /><br />%s',
544 $this->
lng->txt(
'tst_question_feedback_edit_page'),
551 $gui = ($a_gui) ?
"GUI" :
"";
554 return "ilAssGenFeedbackPage" . $gui;
558 return "ilAssSpecFeedbackPage" . $gui;
564 $this->
ctrl->setParameterByClass($cl,
'feedback_type', $page_object_type);
565 $this->
ctrl->setParameterByClass($cl,
'feedback_id', $page_object_id);
567 return $this->
ctrl->getLinkTargetByClass($cl,
'edit');
580 final protected function getPageObjectContent(
string $page_object_type,
int $page_object_id):
string 589 $pageObjectGUI =
new $cl($page_object_id);
590 return $pageObjectGUI->presentation($mode);
593 final protected function getPageObjectXML(
string $page_object_type,
int $page_object_id): string
599 $pageObject =
new $cl($page_object_id);
600 return $pageObject->getXMLContent();
608 $pageObject->setParentId($this->questionOBJ->getId());
609 $pageObject->setId($page_object_id);
610 $pageObject->createFromXML();
615 $pageObject->setParentId($this->questionOBJ->getId());
616 $pageObject->setId($page_object_id);
617 $pageObject->createFromXML();
621 final protected function createPageObject(
string $page_object_type,
int $page_object_id,
string $page_object_content): void
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();
633 string $page_object_type,
634 int $source_page_object_id,
635 int $target_page_object_id,
636 int $target_page_object_parent_id
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();
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)
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 ...
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...
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...