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);
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'];
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:
697 $page_object_id = $this->getGenericFeedbackId($question_id, $solution_completed);
698 return $page_object_id;
707 if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
708 $genericFeedbackExportPresentation = $this->getPageObjectXML(
709 $this->getGenericFeedbackPageObjectType(),
710 $this->getGenericFeedbackPageObjectId($question_id, $solution_completed)
713 $genericFeedbackExportPresentation = $this->getGenericFeedbackContent($question_id, $solution_completed);
716 return $genericFeedbackExportPresentation;
731 if ($this->questionOBJ->isAdditionalContentEditingModePageObject()) {
732 $page_object_id = $this->saveGenericFeedbackContent($question_id, $solution_completed,
'');
733 $page_object_type = $this->getGenericFeedbackPageObjectType();
735 $this->createPageObject($page_object_type, $page_object_id, $feedback_content);
737 $this->saveGenericFeedbackContent($question_id, $solution_completed, $feedback_content);
746 $this->getGenericFeedbackContent($question_id,
true)
750 $this->getGenericFeedbackContent($question_id,
false)
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) {
773 $page_object_id_complete = $this->saveGenericFeedbackContent(
774 $this->questionOBJ->getId(),
778 $this->ensurePageObjectExists($page_object_type, $page_object_id_complete);
780 $page_object_id_incomplete = $this->saveGenericFeedbackContent(
781 $this->questionOBJ->getId(),
785 $this->ensurePageObjectExists($page_object_type, $page_object_id_incomplete);
787 $page_object_id = ($mode ===
'complete') ? $page_object_id_complete : $page_object_id_incomplete;
788 return $this->getPageObjectEditingLink(
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
const FEEDBACK_SOLUTION_COMPLETE_PAGE_OBJECT_ID
id for page object relating to generic complete solution feedback
saveGenericFormProperties(ilPropertyFormGUI $form)
saves a given form object's GENERIC form properties relating to all question types
getGenericFeedbackTestPresentation(int $question_id, bool $solution_completed)
returns the html of GENERIC feedback for the given question id for test presentation (either for the ...
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...
const PAGE_OBJECT_TYPE_GENERIC_FEEDBACK
type for generic feedback page objects
completeGenericFormProperties(ilPropertyFormGUI $form)
completes a given form object with the GENERIC form properties required by all question types
initGenericFormProperties(ilPropertyFormGUI $form)
initialises a given form object's GENERIC form properties relating to all question types
checkFeedbackParent(int $feedbackId)
getPageObjectOutputMode()
getPageObjectXML(string $page_object_type, int $page_object_id)
const TABLE_NAME_GENERIC_FEEDBACK
__construct(assQuestion $questionOBJ, ilCtrl $ctrl, ilDBInterface $db, ilLanguage $lng)
constructor
getGenericFeedbackPageObjectType()
getClassNameByType(string $a_type, bool $a_gui=false)
cloneGenericFeedback(int $originalQuestionId, int $duplicateQuestionId)
syncs the GENERIC feedback from a duplicated question back to the original question
getPageObjectEditingLink(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...
getGenericFeedbackContent(int $question_id, bool $solution_completed)
returns the GENERIC feedback content for a given question state.
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...
const CSS_CLASS_FEEDBACK_WRONG
ensurePageObjectExists(string $page_object_type, int $page_object_id)
clonePageObject(string $page_object_type, int $source_page_object_id, int $target_page_object_id, int $target_page_object_parent_id)
cloneFeedback(int $originalQuestionId, int $duplicateQuestionId)
syncs the feedback from a duplicated question back to the original question
const PAGE_OBJECT_TYPE_SPECIFIC_FEEDBACK
type for specific 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...
getSpecificAnswerFeedbackPageObjectType()
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...
completeSpecificFormProperties(ilPropertyFormGUI $form)
completes a given form object with the SPECIFIC form properties required by this question type
const CSS_CLASS_FEEDBACK_CORRECT
getGenericFeedbackExportPresentation(int $question_id, bool $solution_completed)
returns the generic feedback export presentation for given question id either for solution completed ...
const FEEDBACK_SOLUTION_INCOMPLETE_PAGE_OBJECT_ID
id for page object relating to generic incomplete solution feedback
saveGenericFeedbackContent(int $question_id, bool $solution_completed, string $feedback_content)
saves GENERIC feedback content for the given question id to the database.
migrateContentForLearningModule(ilAssSelfAssessmentMigrator $migrator, int $question_id)
isSaveableInPageObjectEditingMode()
returns the fact wether the feedback editing form is saveable in page object editing or not.
cleanupPageContent(string $content)
string $page_obj_output_mode
isSpecificAnswerFeedbackAvailable(int $question_id)
createPageObject(string $page_object_type, int $page_object_id, string $page_object_content)
cloneSpecificFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the SPECIFIC feedback relating to the given original question id and saves it for the give...
static isValidFeedbackPageObjectType(string $feedbackPageObjectType)
returns the fact whether the given page object type relates to generic or specific feedback page obje...
importSpecificAnswerFeedback(int $question_id, int $question_index, int $answer_index, string $feedback_content)
isSpecificAnswerFeedbackId(int $feedbackId)
deleteGenericFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject)
deletes all GENERIC feedback contents (and page objects if required) for the given question id
deleteSpecificAnswerFeedbacks(int $question_id, bool $isAdditionalContentEditingModePageObject)
getSpecificAnswerFeedbackExportPresentation(int $question_id, int $question_index, int $answer_index)
returns the generic feedback export presentation for given question id either for solution completed ...
createFeedbackPages(string $mode)
getGenericFeedbackId(int $question_id, bool $solution_completed)
returns the SPECIFIC answer feedback ID for a given question id and answer index.
setPageObjectOutputMode(string $page_obj_output_mode)
getAllSpecificAnswerFeedbackContents(int $question_id)
getGenericFeedbackTableName()
initSpecificFormProperties(ilPropertyFormGUI $form)
initialises a given form object's SPECIFIC form properties relating to this question type
saveSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index, string $feedback_content)
duplicateGenericFeedback(int $originalQuestionId, int $duplicateQuestionId)
duplicates the GENERIC feedback relating to the given original question id and saves it for the given...
isGenericFeedbackId(int $feedbackId)
getSpecificAnswerFeedbackContent(int $question_id, int $question_index, int $answer_index)
saveSpecificFormProperties(ilPropertyFormGUI $form)
saves a given form object's SPECIFIC form properties relating to this question type
ensurePageObjectDeleted(string $page_object_type, int $page_object_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilCtrl provides processing control methods.
This class represents a non editable value in a property form.
static _exists(string $a_parent_type, int $a_id, string $a_lang="", bool $a_no_cache=false)
Checks whether page exists.
static _getUsedHTMLTags(string $module='')
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...
This class represents a text area property in a property form.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
migrateToLmContent($content)