classmanager.lib.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. <?php
  2. /*
  3. ==============================================================================
  4. Dokeos - elearning and course management software
  5. Copyright (c) 2004 Dokeos S.A.
  6. Copyright (c) 2003 Ghent University (UGent)
  7. Copyright (c) 2001 Universite catholique de Louvain (UCL)
  8. Copyright (c) Bart Mollet, Hogeschool Gent
  9. For a full list of contributors, see "credits.txt".
  10. The full license can be read in "license.txt".
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15. See the GNU General Public License for more details.
  16. Contact address: Dokeos, 44 rue des palais, B-1030 Brussels, Belgium
  17. Mail: info@dokeos.com
  18. ==============================================================================
  19. */
  20. /**
  21. ==============================================================================
  22. * This is the class library for Dokeos.
  23. * @package dokeos.library
  24. ==============================================================================
  25. */
  26. require_once (api_get_path(LIBRARY_PATH).'course.lib.php');
  27. /**
  28. * This library contains some functions for class-management.
  29. * @author Bart Mollet
  30. * @package dokeos.library
  31. */
  32. class ClassManager
  33. {
  34. /**
  35. * Get class information
  36. * @note This function can't be named get_class() because that's a standard
  37. * php-function.
  38. */
  39. function get_class_info($class_id)
  40. {
  41. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  42. $sql = "SELECT * FROM $table_class WHERE id='".$class_id."'";
  43. $res = Database::query($sql, __FILE__, __LINE__);
  44. return Database::fetch_array($res, 'ASSOC');
  45. }
  46. /**
  47. * Change the name of a class
  48. * @param string $name The new name
  49. * @param int $class_id The class id
  50. */
  51. function set_name($name, $class_id)
  52. {
  53. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  54. $sql = "UPDATE $table_class SET name='".Database::escape_string($name)."' WHERE id='".$class_id."'";
  55. $res = Database::query($sql, __FILE__, __LINE__);
  56. }
  57. /**
  58. * Create a class
  59. * @param string $name
  60. */
  61. function create_class($name)
  62. {
  63. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  64. $sql = "INSERT INTO $table_class SET name='".Database::escape_string($name)."'";
  65. Database::query($sql, __FILE__, __LINE__);
  66. return mysql_affected_rows() == 1;
  67. }
  68. /**
  69. * Check if a classname is allready in use
  70. * @param string $name
  71. */
  72. function class_name_exists($name)
  73. {
  74. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  75. $sql = "SELECT * FROM $table_class WHERE name='".Database::escape_string($name)."'";
  76. $res = Database::query($sql, __FILE__, __LINE__);
  77. return mysql_num_rows($res) != 0;
  78. }
  79. /**
  80. * Delete a class
  81. * @param int $class_id
  82. * @todo Add option to unsubscribe class-members from the courses where the
  83. * class was subscibed to
  84. */
  85. function delete_class($class_id)
  86. {
  87. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  88. $table_class_course = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  89. $table_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  90. $sql = "DELETE FROM $table_class_user WHERE class_id = '".$class_id."'";
  91. Database::query($sql, __FILE__, __LINE__);
  92. $sql = "DELETE FROM $table_class_course WHERE class_id = '".$class_id."'";
  93. Database::query($sql, __FILE__, __LINE__);
  94. $sql = "DELETE FROM $table_class WHERE id = '".$class_id."'";
  95. Database::query($sql, __FILE__, __LINE__);
  96. }
  97. /**
  98. * Get all users from a class
  99. * @param int $class_id
  100. * @return array
  101. */
  102. function get_users($class_id)
  103. {
  104. $table_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  105. $table_user = Database :: get_main_table(TABLE_MAIN_USER);
  106. $sql = "SELECT * FROM $table_class_user cu, $table_user u WHERE cu.class_id = '".$class_id."' AND cu.user_id = u.user_id";
  107. $res = Database::query($sql, __FILE__, __LINE__);
  108. $users = array ();
  109. while ($user = Database::fetch_array($res, 'ASSOC'))
  110. {
  111. $users[] = $user;
  112. }
  113. return $users;
  114. }
  115. /**
  116. * Add a user to a class. If the class is subscribed to a course, the new
  117. * user will also be subscribed to that course.
  118. * @param int $user_id The user id
  119. * @param int $class_id The class id
  120. */
  121. function add_user($user_id, $class_id)
  122. {
  123. $table_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  124. $sql = "INSERT IGNORE INTO $table_class_user SET user_id = '".$user_id."', class_id='".$class_id."'";
  125. Database::query($sql, __FILE__, __LINE__);
  126. $courses = ClassManager :: get_courses($class_id);
  127. foreach ($courses as $index => $course)
  128. {
  129. CourseManager :: subscribe_user($user_id, $course['course_code']);
  130. }
  131. }
  132. /**
  133. * Unsubscribe a user from a class. If the class is also subscribed in a
  134. * course, the user will be unsubscribed from that course
  135. * @param int $user_id The user id
  136. * @param int $class_id The class id
  137. */
  138. function unsubscribe_user($user_id, $class_id)
  139. {
  140. $table_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  141. $table_course_class = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  142. $courses = ClassManager :: get_courses($class_id);
  143. if (count($courses) != 0)
  144. {
  145. $course_codes = array ();
  146. foreach ($courses as $index => $course)
  147. {
  148. $course_codes[] = $course['course_code'];
  149. $sql = "SELECT DISTINCT user_id FROM $table_class_user t1, $table_course_class t2 WHERE t1.class_id=t2.class_id AND course_code = '".$course['course_code']."' AND user_id = $user_id AND t2.class_id<>'$class_id'";
  150. $res = Database::query($sql, __FILE__, __LINE__);
  151. if (mysql_num_rows($res) == 0 && CourseManager :: get_user_in_course_status($user_id, $course['course_code']) == STUDENT)
  152. {
  153. CourseManager :: unsubscribe_user($user_id, $course['course_code']);
  154. }
  155. }
  156. }
  157. $sql = "DELETE FROM $table_class_user WHERE user_id='".$user_id."' AND class_id = '".$class_id."'";
  158. Database::query($sql, __FILE__, __LINE__);
  159. }
  160. /**
  161. * Get all courses in which a class is subscribed
  162. * @param int $class_id
  163. * @return array
  164. */
  165. function get_courses($class_id)
  166. {
  167. $table_class_course = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  168. $table_course = Database :: get_main_table(TABLE_MAIN_COURSE);
  169. $sql = "SELECT * FROM $table_class_course cc, $table_course c WHERE cc.class_id = '".$class_id."' AND cc.course_code = c.code";
  170. $res = Database::query($sql, __FILE__, __LINE__);
  171. $courses = array ();
  172. while ($course = Database::fetch_array($res, 'ASSOC'))
  173. {
  174. $courses[] = $course;
  175. }
  176. return $courses;
  177. }
  178. /**
  179. * Subscribe all members of a class to a course
  180. * @param int $class_id The class id
  181. * @param string $course_code The course code
  182. */
  183. function subscribe_to_course($class_id, $course_code)
  184. {
  185. $tbl_course_class = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  186. $tbl_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  187. $tbl_course_user = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
  188. $sql = "INSERT IGNORE INTO $tbl_course_class SET course_code = '".Database::escape_string($course_code)."', class_id = '".Database::escape_string($class_id)."'";
  189. Database::query($sql, __FILE__, __LINE__);
  190. $sql = "SELECT user_id FROM $tbl_class_user WHERE class_id = '".Database::escape_string($class_id)."'";
  191. $res = Database::query($sql, __FILE__, __LINE__);
  192. while ($user = Database::fetch_object($res))
  193. {
  194. CourseManager :: subscribe_user($user->user_id, $course_code);
  195. }
  196. }
  197. /**
  198. * Unsubscribe a class from a course.
  199. * Only students are unsubscribed. If a user is member of 2 classes which
  200. * are both subscribed to the course, the user stays in the course.
  201. * @param int $class_id The class id
  202. * @param string $course_code The course code
  203. */
  204. function unsubscribe_from_course($class_id, $course_code)
  205. {
  206. $tbl_course_class = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  207. $tbl_class_user = Database :: get_main_table(TABLE_MAIN_CLASS_USER);
  208. $sql = "SELECT cu.user_id,COUNT(cc.class_id) FROM $tbl_course_class cc, $tbl_class_user cu WHERE cc.class_id = cu.class_id AND cc.course_code = '".Database::escape_string($course_code)."' GROUP BY cu.user_id HAVING COUNT(cc.class_id) = 1";
  209. $single_class_users = Database::query($sql, __FILE__, __LINE__);
  210. while ($single_class_user = Database::fetch_object($single_class_users))
  211. {
  212. $sql = "SELECT * FROM $tbl_class_user WHERE class_id = '".Database::escape_string($class_id)."' AND user_id = '".Database::escape_string($single_class_user->user_id)."'";
  213. $res = Database::query($sql, __FILE__, __LINE__);
  214. if (mysql_num_rows($res) > 0)
  215. {
  216. if (CourseManager :: get_user_in_course_status($single_class_user->user_id, $course_code) == STUDENT)
  217. {
  218. CourseManager :: unsubscribe_user($single_class_user->user_id, $course_code);
  219. }
  220. }
  221. }
  222. $sql = "DELETE FROM $tbl_course_class WHERE course_code = '".Database::escape_string($course_code)."' AND class_id = '".Database::escape_string($class_id)."'";
  223. Database::query($sql, __FILE__, __LINE__);
  224. }
  225. /**
  226. * Get the class-id
  227. * @param string $name The class name
  228. * @return int the ID of the class
  229. */
  230. function get_class_id($name)
  231. {
  232. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  233. $sql = "SELECT * FROM $table_class WHERE name='".$name."'";
  234. $res = Database::query($sql, __FILE__, __LINE__);
  235. $obj = Database::fetch_object($res);
  236. return $obj->id;
  237. }
  238. /**
  239. * Get all classes subscribed in a course
  240. * @param string $course_code
  241. * @return array An array with all classes (keys: 'id','code','name')
  242. */
  243. function get_classes_in_course($course_code)
  244. {
  245. $table_class = Database :: get_main_table(TABLE_MAIN_CLASS);
  246. $table_course_class = Database :: get_main_table(TABLE_MAIN_COURSE_CLASS);
  247. $sql = "SELECT cl.* FROM $table_class cl, $table_course_class cc WHERE cc.course_code = '".Database::escape_string($course_code)."' AND cc.class_id = cl.id";
  248. $res = Database::query($sql, __FILE__, __LINE__);
  249. $classes = array ();
  250. while ($class = Database::fetch_array($res, 'ASSOC'))
  251. {
  252. $classes[] = $class;
  253. }
  254. return $classes;
  255. }
  256. }
  257. ?>