diff --git a/main/install/install.lib.php b/main/install/install.lib.php index 631d43f4a6..e42b3aca95 100755 --- a/main/install/install.lib.php +++ b/main/install/install.lib.php @@ -1641,6 +1641,8 @@ function panel($content = null, $title = null, $id = null, $style = null) * @param string $formFieldName * @param string $parameterValue * @param string $displayWhenUpdate + * + * @return string */ function display_configuration_parameter( $installType, @@ -2785,6 +2787,195 @@ function fixIds(EntityManager $em) } } +/** + * @param \Doctrine\DBAL\Connection $connection + * @param $debug + * + * @throws \Doctrine\DBAL\DBALException + */ +function fixLpId($connection, $debug) +{ + if ($debug) { + error_log('Fix lp.id lp.iids'); + } + + $sql = "SELECT id, title, code FROM course"; + $result = $connection->query($sql); + $courses = $result->fetchAll(); + + $sql = "SELECT id FROM session"; + $result = $connection->query($sql); + $sessions = $result->fetchAll(); + + $tblCLp = Database::get_course_table(TABLE_LP_MAIN); + $tblCLpItem = Database::get_course_table(TABLE_LP_ITEM); + $toolTable = Database::get_course_table(TABLE_TOOL_LIST); + + if (!empty($sessions)) { + $sessions = array_column($sessions, 'id'); + } else { + $sessions = [0]; + } + + foreach ($courses as $course) { + $courseId = $course['id']; + $sql = "SELECT * FROM $tblCLp WHERE c_id = $courseId AND iid <> id"; + $result = $connection->query($sql); + if ($debug) { + error_log('-------------'); + error_log("Entering Lps in course #$courseId"); + error_log($sql); + } + $lpList = $result->fetchAll(); + if (!empty($lpList)) { + foreach ($lpList as $lpInfo) { + $lpIid = $lpInfo['iid']; + $oldId = $lpInfo['id']; + + if ($lpIid == $oldId) { + // Do nothing + continue; + } + $sql = "SELECT * FROM $tblCLpItem WHERE c_id = $courseId AND lp_id = $oldId"; + + $result = $connection->query($sql); + $items = $result->fetchAll(); + $itemList = []; + foreach ($items as $subItem) { + $itemList[$subItem['id']] = $subItem['iid']; + } + $variablesToFix = [ + 'parent_item_id', + 'next_item_id', + 'prerequisite', + 'previous_item_id' + ]; + + foreach ($sessions as $sessionId) { + $correctLink = "lp/lp_controller.php?action=view&lp_id=$lpIid&id_session=$sessionId"; + $link = "newscorm/lp_controller.php?action=view&lp_id=$oldId&id_session=$sessionId"; + $secondLink = "lp/lp_controller.php?action=view&lp_id=$oldId&id_session=$sessionId"; + $sql = "UPDATE $toolTable + SET link = '$correctLink' + WHERE c_id = $courseId AND (link = '$link' OR link ='$secondLink')"; + $connection->query($sql); + if ($debug) { + error_log("Fix wrong c_tool links"); + error_log($sql); + } + } + + foreach ($items as $item) { + $itemIid = $item['iid']; + $itemId = $item['id']; + foreach ($variablesToFix as $variable) { + if (!empty($item[$variable]) && isset($itemList[$item[$variable]])) { + $newId = $itemList[$item[$variable]]; + $sql = "UPDATE $tblCLpItem SET $variable = $newId + WHERE iid = $itemIid AND c_id = $courseId AND lp_id = $oldId"; + $connection->query($sql); + if ($debug) { + error_log($sql); + } + } + } + + if ($item['item_type'] == 'document' && !empty($item['path'])) { + $oldDocumentId = $item['path']; + $sql = "SELECT * FROM c_document WHERE c_id = $courseId AND id = $oldDocumentId"; + $result = $connection->query($sql); + $document = $result->fetch(); + if (!empty($document)) { + $newDocumentId = $document['iid']; + if (!empty($newDocumentId)) { + $sql = "UPDATE $tblCLpItem SET path = $newDocumentId + WHERE iid = $itemIid AND c_id = $courseId"; + $connection->query($sql); + if ($debug) { + error_log("Fix document: "); + error_log($sql); + } + } + } + } + + // c_lp_view + $sql = "UPDATE c_lp_view SET last_item = $itemIid + WHERE c_id = $courseId AND last_item = $itemId AND lp_id = $oldId"; + $connection->query($sql); + + // c_lp_item_view + $sql = "UPDATE c_lp_item_view SET lp_item_id = $itemIid + WHERE c_id = $courseId AND lp_item_id = $itemId"; + $connection->query($sql); + + // Update track_exercises + $sql = "UPDATE track_e_exercises SET orig_lp_item_id = $itemIid + WHERE c_id = $courseId AND orig_lp_id = $oldId AND orig_lp_item_id = $itemId"; + $connection->query($sql); + + // c_forum_thread + $sql = "UPDATE c_forum_thread SET lp_item_id = $itemIid + WHERE c_id = $courseId AND lp_item_id = $itemId"; + $connection->query($sql); + + // orig_lp_item_view_id + $sql = "SELECT * FROM c_lp_view + WHERE c_id = $courseId AND lp_id = $oldId"; + $itemViewList = Database::store_result(Database::query($sql),'ASSOC'); + if ($itemViewList) { + foreach ($itemViewList as $itemView) { + $userId = $itemView['user_id']; + $oldItemViewId = $itemView['id']; + $newItemView = $itemView['iid']; + if (empty($oldItemViewId)) { + continue; + } + + $sql = "UPDATE track_e_exercises + SET orig_lp_item_view_id = $newItemView + WHERE + c_id = $courseId AND + orig_lp_id = $oldId AND + orig_lp_item_id = $itemIid AND + orig_lp_item_view_id = $oldItemViewId AND + exe_user_id = $userId + "; + $connection->query($sql); + } + } + + $sql = "UPDATE $tblCLpItem SET lp_id = $lpIid + WHERE iid = $itemIid AND c_id = $courseId AND lp_id = $oldId"; + $connection->query($sql); + + $sql = "UPDATE $tblCLpItem SET id = iid + WHERE c_id = $courseId AND lp_id = $oldId"; + $connection->query($sql); + } + + $sql = "UPDATE $tblCLp SET id = iid WHERE c_id = $courseId AND iid = $lpIid"; + $connection->query($sql); + + $sql = "UPDATE c_lp_view SET lp_id = $lpIid WHERE c_id = $courseId AND lp_id = $oldId"; + $connection->query($sql); + + $sql = "UPDATE c_forum_forum SET lp_id = $lpIid WHERE c_id = $courseId AND lp_id = $oldId"; + $connection->query($sql); + + // Update track_exercises + $sql = "UPDATE track_e_exercises SET orig_lp_id = $lpIid + WHERE c_id = $courseId AND orig_lp_id = $oldId"; + $connection->query($sql); + } + } + } + + if ($debug) { + error_log('----- END - fixIds'); + } +} + /** * After the schema was created (table creation), the function adds * admin/platform information. @@ -3220,6 +3411,7 @@ function migrateSwitch($fromVersion, $manager, $processFiles = true) if ($result) { error_log('Migrations files were executed ('.date('Y-m-d H:i:s').')'); fixIds($manager); + fixLpId($manager->getConnection(), true); error_log('fixIds finished ('.date('Y-m-d H:i:s').')'); $connection->executeQuery("UPDATE settings_current SET selected_value = '1.10.0' WHERE variable = 'chamilo_database_version'"); @@ -3272,6 +3464,8 @@ function migrateSwitch($fromVersion, $manager, $processFiles = true) ); if ($result) { + fixLpId($connection, true); + error_log('Migrations files were executed ('.date('Y-m-d H:i:s').')'); fixPostGroupIds($connection);