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...