CourseRecycler.class.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <?php
  2. // $Id: CourseRecycler.class.php 12117 2007-04-24 22:06:36Z pcool $
  3. /*
  4. ==============================================================================
  5. Dokeos - elearning and course management software
  6. Copyright (c) 2004 Dokeos S.A.
  7. Copyright (c) 2003 Ghent University (UGent)
  8. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  9. Copyright (c) Bart Mollet (bart.mollet@hogent.be)
  10. For a full list of contributors, see "credits.txt".
  11. The full license can be read in "license.txt".
  12. This program is free software; you can redistribute it and/or
  13. modify it under the terms of the GNU General Public License
  14. as published by the Free Software Foundation; either version 2
  15. of the License, or (at your option) any later version.
  16. See the GNU General Public License for more details.
  17. Contact address: Dokeos, 44 rue des palais, B-1030 Brussels, Belgium
  18. Mail: info@dokeos.com
  19. ==============================================================================
  20. */
  21. require_once 'Course.class.php';
  22. /**
  23. * Class to delete items from a Dokeos-course
  24. * @author Bart Mollet <bart.mollet@hogent.be>
  25. * @package dokeos.backup
  26. */
  27. class CourseRecycler
  28. {
  29. /**
  30. * A course-object with the items to delete
  31. */
  32. var $course;
  33. /**
  34. * Create a new CourseRecycler
  35. * @param course $course The course-object which contains the items to
  36. * delete
  37. */
  38. function CourseRecycler($course)
  39. {
  40. $this->course = $course;
  41. }
  42. /**
  43. * Delete all items from the course.
  44. * This deletes all items in the course-object from the current Dokeos-
  45. * course
  46. */
  47. function recycle()
  48. {
  49. $table_tool_intro = Database::get_course_table(TABLE_TOOL_INTRO);
  50. $table_linked_resources = Database :: get_course_table(TABLE_LINKED_RESOURCES);
  51. $table_item_properties = Database::get_course_table(TABLE_ITEM_PROPERTY);
  52. foreach ($this->course->resources as $type => $resources)
  53. {
  54. foreach ($resources as $id => $resource)
  55. {
  56. $sql = "DELETE FROM ".$table_linked_resources." WHERE (source_type = '".$type."' AND source_id = '".$id."') OR (resource_type = '".$type."' AND resource_id = '".$id."') ";
  57. Database::query($sql,__FILE__,__LINE__);
  58. if(is_numeric($id))
  59. {
  60. $sql = "DELETE FROM ".$table_item_properties." WHERE tool ='".$resource->get_tool()."' AND ref=".$id;
  61. Database::query($sql, __FILE__, __LINE__);
  62. }
  63. elseif ($type == RESOURCE_TOOL_INTRO)
  64. {
  65. $sql = "DELETE FROM $table_tool_intro WHERE id='$id'";
  66. Database::query($sql, __FILE__, __LINE__);
  67. }
  68. }
  69. }
  70. $this->recycle_links();
  71. $this->recycle_link_categories();
  72. $this->recycle_events();
  73. $this->recycle_announcements();
  74. $this->recycle_documents();
  75. $this->recycle_forums();
  76. $this->recycle_forum_categories();
  77. $this->recycle_quizzes();
  78. $this->recycle_surveys();
  79. $this->recycle_learnpaths();
  80. $this->recycle_cours_description();
  81. }
  82. /**
  83. * Delete documents
  84. */
  85. function recycle_documents()
  86. {
  87. if ($this->course->has_resources(RESOURCE_DOCUMENT))
  88. {
  89. $table = Database :: get_course_table(TABLE_DOCUMENT);
  90. foreach ($this->course->resources[RESOURCE_DOCUMENT] as $id => $document)
  91. {
  92. rmdirr($this->course->backup_path.'/'.$document->path);
  93. }
  94. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_DOCUMENT])));
  95. $sql = "DELETE FROM ".$table." WHERE id IN(".$ids.")";
  96. Database::query($sql,__FILE__,__LINE__);
  97. }
  98. }
  99. /**
  100. * Delete links
  101. */
  102. function recycle_links()
  103. {
  104. if ($this->course->has_resources(RESOURCE_LINK))
  105. {
  106. $table = Database :: get_course_table(TABLE_LINK);
  107. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_LINK])));
  108. $sql = "DELETE FROM ".$table." WHERE id IN(".$ids.")";
  109. Database::query($sql,__FILE__,__LINE__);
  110. }
  111. }
  112. /**
  113. * Delete forums
  114. */
  115. function recycle_forums()
  116. {
  117. if ($this->course->has_resources(RESOURCE_FORUM))
  118. {
  119. $table_category = Database :: get_course_table(TABLE_FORUM_CATEGORY);
  120. $table_forum = Database :: get_course_table(TABLE_FORUM);
  121. $table_thread = Database :: get_course_table(TABLE_FORUM_THREAD);
  122. $table_post = Database :: get_course_table(TABLE_FORUM_POST);
  123. $table_attachment = Database::get_course_table(TABLE_FORUM_ATTACHMENT);
  124. $table_notification = Database::get_course_table(TABLE_FORUM_NOTIFICATION);
  125. $table_mail_queue = Database::get_course_table(TABLE_FORUM_MAIL_QUEUE);
  126. $table_thread_qualify = Database::get_course_table(TABLE_FORUM_THREAD_QUALIFY);
  127. $table_thread_qualify_log = Database::get_course_table(TABLE_FORUM_THREAD_QUALIFY_LOG);
  128. $forum_ids = implode(',', (array_keys($this->course->resources[RESOURCE_FORUM])));
  129. $sql = "DELETE FROM ".$table_attachment.
  130. " USING ".$table_attachment." INNER JOIN ".$table_post.
  131. " WHERE ".$table_attachment.".post_id = ".$table_post.".post_id".
  132. " AND ".$table_post.".forum_id IN(".$forum_ids.");";
  133. Database::query($sql,__FILE__,__LINE__);
  134. $sql = "DELETE FROM ".$table_mail_queue.
  135. " USING ".$table_mail_queue." INNER JOIN ".$table_post.
  136. " WHERE ".$table_mail_queue.".post_id = ".$table_post.".post_id".
  137. " AND ".$table_post.".forum_id IN(".$forum_ids.");";
  138. Database::query($sql,__FILE__,__LINE__);
  139. // Just in case, deleting in the same table using thread_id as record-linker.
  140. $sql = "DELETE FROM ".$table_mail_queue.
  141. " USING ".$table_mail_queue." INNER JOIN ".$table_thread.
  142. " WHERE ".$table_mail_queue.".thread_id = ".$table_thread.".thread_id".
  143. " AND ".$table_thread.".forum_id IN(".$forum_ids.");";
  144. Database::query($sql,__FILE__,__LINE__);
  145. $sql = "DELETE FROM ".$table_thread_qualify.
  146. " USING ".$table_thread_qualify." INNER JOIN ".$table_thread.
  147. " WHERE ".$table_thread_qualify.".thread_id = ".$table_thread.".thread_id".
  148. " AND ".$table_thread.".forum_id IN(".$forum_ids.");";
  149. Database::query($sql,__FILE__,__LINE__);
  150. $sql = "DELETE FROM ".$table_thread_qualify_log.
  151. " USING ".$table_thread_qualify_log." INNER JOIN ".$table_thread.
  152. " WHERE ".$table_thread_qualify_log.".thread_id = ".$table_thread.".thread_id".
  153. " AND ".$table_thread.".forum_id IN(".$forum_ids.");";
  154. Database::query($sql,__FILE__,__LINE__);
  155. $sql = "DELETE FROM ".$table_notification." WHERE forum_id IN(".$forum_ids.")";
  156. Database::query($sql,__FILE__,__LINE__);
  157. $sql = "DELETE FROM ".$table_post." WHERE forum_id IN(".$forum_ids.")";
  158. Database::query($sql,__FILE__,__LINE__);
  159. $sql = "DELETE FROM ".$table_thread." WHERE forum_id IN(".$forum_ids.")";
  160. Database::query($sql,__FILE__,__LINE__);
  161. $sql = "DELETE FROM ".$table_forum." WHERE forum_id IN(".$forum_ids.")";
  162. Database::query($sql,__FILE__,__LINE__);
  163. }
  164. }
  165. /**
  166. * Delete forum-categories
  167. * Deletes all forum-categories from current course without forums
  168. */
  169. function recycle_forum_categories()
  170. {
  171. $table_forum = Database :: get_course_table(TABLE_FORUM);
  172. $table_forumcat = Database :: get_course_table(TABLE_FORUM_CATEGORY);
  173. $sql = "SELECT fc.cat_id FROM ".$table_forumcat." fc LEFT JOIN ".$table_forum." f ON fc.cat_id=f.forum_category WHERE f.forum_id IS NULL";
  174. $res = Database::query($sql,__FILE__,__LINE__);
  175. while ($obj = Database::fetch_object($res))
  176. {
  177. $sql = "DELETE FROM ".$table_forumcat." WHERE cat_id = ".$obj->cat_id;
  178. Database::query($sql,__FILE__,__LINE__);
  179. }
  180. }
  181. /**
  182. * Delete link-categories
  183. * Deletes all empty link-categories (=without links) from current course
  184. */
  185. function recycle_link_categories()
  186. {
  187. $link_cat_table = Database :: get_course_table(TABLE_LINK_CATEGORY);
  188. $link_table = Database :: get_course_table(TABLE_LINK);
  189. $sql = "SELECT lc.id FROM ".$link_cat_table." lc LEFT JOIN ".$link_table." l ON lc.id=l.category_id WHERE l.id IS NULL";
  190. $res = Database::query($sql,__FILE__,__LINE__);
  191. while ($obj = Database::fetch_object($res))
  192. {
  193. $sql = "DELETE FROM ".$link_cat_table." WHERE id = ".$obj->id;
  194. Database::query($sql,__FILE__,__LINE__);
  195. }
  196. }
  197. /**
  198. * Delete events
  199. */
  200. function recycle_events()
  201. {
  202. if ($this->course->has_resources(RESOURCE_EVENT))
  203. {
  204. $table = Database :: get_course_table(TABLE_AGENDA);
  205. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_EVENT])));
  206. $sql = "DELETE FROM ".$table." WHERE id IN(".$ids.")";
  207. Database::query($sql,__FILE__,__LINE__);
  208. }
  209. }
  210. /**
  211. * Delete announcements
  212. */
  213. function recycle_announcements()
  214. {
  215. if ($this->course->has_resources(RESOURCE_ANNOUNCEMENT))
  216. {
  217. $table = Database :: get_course_table(TABLE_ANNOUNCEMENT);
  218. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_ANNOUNCEMENT])));
  219. $sql = "DELETE FROM ".$table." WHERE id IN(".$ids.")";
  220. Database::query($sql,__FILE__,__LINE__);
  221. }
  222. }
  223. /**
  224. * Recycle quizzes - doesn't remove the questions and their answers, as they might still be used later
  225. */
  226. function recycle_quizzes()
  227. {
  228. if ($this->course->has_resources(RESOURCE_QUIZ))
  229. {
  230. $table_qui_que = Database :: get_course_table(TABLE_QUIZ_QUESTION);
  231. $table_qui_ans = Database :: get_course_table(TABLE_QUIZ_ANSWER);
  232. $table_qui = Database :: get_course_table(TABLE_QUIZ_TEST);
  233. $table_rel = Database :: get_course_table(TABLE_QUIZ_TEST_QUESTION);
  234. $ids = array_keys($this->course->resources[RESOURCE_QUIZ]);
  235. $delete_orphan_questions = in_array(-1, $ids);
  236. $ids = implode(',', $ids);
  237. // Deletion of the normal tests, questions in them are not deleted, they become orphan at this moment.
  238. $sql = "DELETE FROM ".$table_qui." WHERE id <> -1 AND id IN(".$ids.")";
  239. Database::query($sql,__FILE__,__LINE__);
  240. $sql = "DELETE FROM ".$table_rel." WHERE exercice_id <> -1 AND exercice_id IN(".$ids.")";
  241. Database::query($sql,__FILE__,__LINE__);
  242. // Identifying again and deletion of the orphan questions, if it was desired.
  243. if ($delete_orphan_questions)
  244. {
  245. $sql = 'SELECT questions.id FROM '.$table_qui_que.
  246. ' as questions LEFT JOIN '.$table_rel.' as quizz_questions ON questions.id=quizz_questions.question_id LEFT JOIN '.$table_qui.
  247. ' as exercices ON exercice_id=exercices.id WHERE quizz_questions.exercice_id IS NULL OR exercices.active = -1'; // active = -1 means "deleted" test.
  248. $db_result = Database::query($sql, __FILE__, __LINE__);
  249. if (Database::num_rows($db_result) > 0)
  250. {
  251. $orphan_ids = array();
  252. while ($obj = Database::fetch_object($db_result))
  253. {
  254. $orphan_ids[] = $obj->id;
  255. }
  256. $orphan_ids = implode(',', $orphan_ids);
  257. $sql = "DELETE FROM ".$table_rel." WHERE question_id IN(".$orphan_ids.")";
  258. Database::query($sql,__FILE__,__LINE__);
  259. $sql = "DELETE FROM ".$table_qui_ans." WHERE question_id IN(".$orphan_ids.")";
  260. Database::query($sql,__FILE__,__LINE__);
  261. $sql = "DELETE FROM ".$table_qui_que." WHERE id IN(".$orphan_ids.")";
  262. Database::query($sql,__FILE__,__LINE__);
  263. }
  264. }
  265. }
  266. // Purge "deleted" tests (active = -1).
  267. $sql = "DELETE FROM ".$table_qui." WHERE active = -1";
  268. Database::query($sql,__FILE__,__LINE__);
  269. }
  270. /**
  271. * Recycle surveys - removes everything
  272. */
  273. function recycle_surveys()
  274. {
  275. if ($this->course->has_resources(RESOURCE_SURVEY))
  276. {
  277. $table_survey = Database :: get_course_table(TABLE_SURVEY);
  278. $table_survey_q = Database :: get_course_table(TABLE_SURVEY_QUESTION);
  279. $table_survey_q_o = Database :: get_course_table(TABLE_SURVEY_QUESTION_OPTION);
  280. $table_survey_a = Database :: get_course_Table(TABLE_SURVEY_ANSWER);
  281. $table_survey_i = Database :: get_course_table(TABLE_SURVEY_INVITATION);
  282. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_SURVEY])));
  283. $sql = "DELETE FROM ".$table_survey_i." ";
  284. Database::query($sql,__FILE__,__LINE__);
  285. $sql = "DELETE FROM ".$table_survey_a." WHERE survey_id IN(".$ids.")";
  286. Database::query($sql,__FILE__,__LINE__);
  287. $sql = "DELETE FROM ".$table_survey_q_o." WHERE survey_id IN(".$ids.")";
  288. Database::query($sql,__FILE__,__LINE__);
  289. $sql = "DELETE FROM ".$table_survey_q." WHERE survey_id IN(".$ids.")";
  290. Database::query($sql,__FILE__,__LINE__);
  291. $sql = "DELETE FROM ".$table_survey." WHERE survey_id IN(".$ids.")";
  292. Database::query($sql,__FILE__,__LINE__);
  293. }
  294. }
  295. /**
  296. * Recycle learnpaths
  297. */
  298. function recycle_learnpaths()
  299. {
  300. if ($this->course->has_resources(RESOURCE_LEARNPATH))
  301. {
  302. $table_main = Database :: get_course_table(TABLE_LP_MAIN);
  303. $table_item = Database :: get_course_table(TABLE_LP_ITEM);
  304. $table_view = Database :: get_course_table(TABLE_LP_VIEW);
  305. $table_iv = Database :: get_course_table(TABLE_LP_ITEM_VIEW);
  306. $table_iv_int = Database :: get_course_table(TABLE_LP_IV_INTERACTION);
  307. $table_tool = Database::get_course_table(TABLE_TOOL_LIST);
  308. foreach($this->course->resources[RESOURCE_LEARNPATH] as $id => $learnpath)
  309. {
  310. //remove links from course homepage
  311. $sql = "DELETE FROM $table_tool WHERE link LIKE '%lp_controller.php%lp_id=$id%' AND image='scormbuilder.gif'";
  312. Database::query($sql,__FILE__,__LINE__);
  313. //remove elements from lp_* tables (from bottom-up) by removing interactions, then item_view, then views and items, then paths
  314. $sql_items = "SELECT id FROM $table_item WHERE lp_id=$id";
  315. $res_items = Database::query($sql_items,__FILE__,__LINE__);
  316. while ($row_item = Database::fetch_array($res_items))
  317. {
  318. //get item views
  319. $sql_iv = "SELECT id FROM $table_iv WHERE lp_item_id=".$row_item['id'];
  320. $res_iv = Database::query($sql_iv,__FILE__,__LINE__);
  321. while ($row_iv = Database::fetch_array($res_iv))
  322. {
  323. //delete interactions
  324. $sql_iv_int_del = "DELETE FROM $table_iv_int WHERE lp_iv_id = ".$row_iv['id'];
  325. $res_iv_int_del = Database::query($sql_iv_int_del,__FILE__,__LINE__);
  326. }
  327. //delete item views
  328. $sql_iv_del = "DELETE FROM $table_iv WHERE lp_item_id=".$row_item['id'];
  329. $res_iv_del = Database::query($sql_iv_del,__FILE__,__LINE__);
  330. }
  331. //delete items
  332. $sql_items_del = "DELETE FROM $table_item WHERE lp_id=$id";
  333. $res_items_del = Database::query($sql_items_del,__FILE__,__LINE__);
  334. //delete views
  335. $sql_views_del = "DELETE FROM $table_view WHERE lp_id=$id";
  336. $res_views_del = Database::query($sql_views_del,__FILE__,__LINE__);
  337. //delete lps
  338. $sql_del = "DELETE FROM $table_main WHERE id = $id";
  339. $res_del = Database::query($sql_del,__FILE__,__LINE__);
  340. }
  341. }
  342. }
  343. /**
  344. * Delete course description
  345. */
  346. function recycle_cours_description()
  347. {
  348. if ($this->course->has_resources(RESOURCE_COURSEDESCRIPTION))
  349. {
  350. $table = Database :: get_course_table(TABLE_COURSE_DESCRIPTION);
  351. $ids = implode(',', (array_keys($this->course->resources[RESOURCE_COURSEDESCRIPTION])));
  352. $sql = "DELETE FROM ".$table." WHERE id IN(".$ids.")";
  353. Database::query($sql,__FILE__,__LINE__);
  354. }
  355. }
  356. }