From 02a73fbb5952f6cbe92b21a21e0db00b3a0c7b72 Mon Sep 17 00:00:00 2001 From: qualitus-dahme Date: Tue, 7 Apr 2026 14:26:06 +0200 Subject: [PATCH] ScormAicc: clean up SCORM 2004 and LP fragments on delete --- .../classes/class.ilObjSAHSLearningModule.php | 83 +++++++++++++++++-- .../classes/class.ilLPObjSettings.php | 30 ++++--- 2 files changed, 90 insertions(+), 23 deletions(-) diff --git a/components/ILIAS/ScormAicc/classes/class.ilObjSAHSLearningModule.php b/components/ILIAS/ScormAicc/classes/class.ilObjSAHSLearningModule.php index 246419679482..7f7ec50f931c 100755 --- a/components/ILIAS/ScormAicc/classes/class.ilObjSAHSLearningModule.php +++ b/components/ILIAS/ScormAicc/classes/class.ilObjSAHSLearningModule.php @@ -1034,9 +1034,79 @@ public function delete(): bool } $sc_tree->removeTree($sc_tree->getTreeId()); } - } - - if ($this->getSubType() !== "scorm") { + } elseif ($this->getSubType() === "scorm2004") { + $object_id = $ilDB->quote($this->getId(), 'integer'); + $queries = array(); + + $queries[] = "DELETE FROM cmi_gobjective WHERE scope_id = " . $object_id; + $queries[] = "DELETE FROM cmi_correct_response WHERE cmi_interaction_id IN (" . + "SELECT cmi_interaction_id FROM cmi_interaction WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")" . + ")"; + $queries[] = "DELETE FROM cmi_interaction WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cmi_comment WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cmi_objective WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cmi_custom WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cmi_node WHERE cmi_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + + $queries[] = "DELETE FROM cp_sequencing WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_rule WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_resource WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_package WHERE obj_id = " . $object_id; + $queries[] = "DELETE FROM cp_organization WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_objective WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_mapinfo WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_hidelmsui WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_file WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_condition WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_auxilaryresource WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_manifest WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_node WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_item WHERE cp_node_id IN (" . + "SELECT child FROM cp_tree WHERE obj_id = " . $object_id . + ")"; + $queries[] = "DELETE FROM cp_tree WHERE obj_id = " . $object_id; + + foreach ($queries as $query) { + $ilLog->debug("SAHS Delete(SAHSLM): " . $query); + $ilDB->manipulate($query); + } + } else { // delete aicc data $res = $ilDB->queryF( ' @@ -1077,14 +1147,13 @@ public function delete(): bool } $ilDB->manipulateF( - ' - DELETE FROM aicc_object WHERE slm_id = %s', + 'DELETE FROM aicc_object WHERE slm_id = %s', array('integer'), array($this->getId()) ); } - $q_log = "DELETE FROM scorm_tracking WHERE obj_id = " . $ilDB->quote($this->getId()); + $q_log = "DELETE FROM scorm_tracking WHERE obj_id = " . $ilDB->quote($this->getId(), "integer"); $ilLog->write("SAHS Delete(SAHSLM): " . $q_log); $ilDB->manipulateF( @@ -1093,7 +1162,7 @@ public function delete(): bool array($this->getId()) ); - $q_log = "DELETE FROM sahs_user WHERE obj_id = " . $ilDB->quote($this->getId()); + $q_log = "DELETE FROM sahs_user WHERE obj_id = " . $ilDB->quote($this->getId(), "integer"); $ilLog->write("SAHS Delete(SAHSLM): " . $q_log); $ilDB->manipulateF( diff --git a/components/ILIAS/Tracking/classes/class.ilLPObjSettings.php b/components/ILIAS/Tracking/classes/class.ilLPObjSettings.php index e351ba17f841..4abbd9b2ea48 100755 --- a/components/ILIAS/Tracking/classes/class.ilLPObjSettings.php +++ b/components/ILIAS/Tracking/classes/class.ilLPObjSettings.php @@ -403,11 +403,19 @@ public static function _delete(int $a_obj_id): bool global $DIC; $ilDB = $DIC['ilDB']; - $query = "DELETE FROM ut_lp_settings WHERE obj_id = " . $ilDB->quote( - $a_obj_id, - 'integer' - ); - $res = $ilDB->manipulate($query); + $obj_id = $ilDB->quote($a_obj_id, 'integer'); + $queries = array(); + + $queries[] = "DELETE FROM ut_lp_settings WHERE obj_id = " . $obj_id; + $queries[] = "DELETE FROM ut_lp_collections WHERE obj_id = " . $obj_id; + $queries[] = "DELETE FROM ut_lp_marks WHERE obj_id = " . $obj_id; + $queries[] = "DELETE FROM ut_lp_coll_manual WHERE obj_id = " . $obj_id; + $queries[] = "DELETE FROM ut_lp_user_status WHERE obj_id = " . $obj_id; + + foreach ($queries as $query) { + $ilDB->manipulate($query); + } + return true; } @@ -499,16 +507,6 @@ public static function getClassMap(): array public static function _deleteByObjId(int $a_obj_id): void { - global $DIC; - - $ilDB = $DIC['ilDB']; - // we are only removing settings for now - // invalid ut_lp_collections-entries are filtered - // ut_lp_marks is deemed private user data - - $ilDB->manipulate( - "DELETE FROM ut_lp_settings" . - " WHERE obj_id = " . $ilDB->quote($a_obj_id, "integer") - ); + self::_delete($a_obj_id); } }