group_edit.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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) various contributors
  9. Copyright (c) Bart Mollet, Hogeschool Gent
  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: Dokeos, 181 rue Royale, B-1000 Brussels, Belgium, info@dokeos.com
  18. ==============================================================================
  19. */
  20. /**
  21. ==============================================================================
  22. * This script displays an area where teachers can edit the group properties and member list.
  23. * Groups are also often called "teams" in the Dokeos code.
  24. *
  25. * @author various contributors
  26. * @author Roan Embrechts (VUB), partial code cleanup, initial virtual course support
  27. @package dokeos.group
  28. * @todo course admin functionality to create groups based on who is in which course (or class).
  29. ==============================================================================
  30. */
  31. /*
  32. ==============================================================================
  33. INIT SECTION
  34. ==============================================================================
  35. */
  36. // name of the language file that needs to be included
  37. $language_file = "group";
  38. include ('../inc/global.inc.php');
  39. $this_section = SECTION_COURSES;
  40. /*
  41. -----------------------------------------------------------
  42. Libraries & settings
  43. -----------------------------------------------------------
  44. */
  45. require_once (api_get_path(LIBRARY_PATH).'course.lib.php');
  46. require_once (api_get_path(LIBRARY_PATH).'groupmanager.lib.php');
  47. require_once (api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php');
  48. /*
  49. -----------------------------------------------------------
  50. Constants & variables
  51. -----------------------------------------------------------
  52. */
  53. $current_group = GroupManager :: get_group_properties($_SESSION['_gid']);
  54. /*
  55. -----------------------------------------------------------
  56. Header
  57. -----------------------------------------------------------
  58. */
  59. $nameTools = get_lang('EditGroup');
  60. $interbreadcrumb[] = array ("url" => "group.php", "name" => get_lang('Groups'));
  61. if (!api_is_allowed_to_edit(false,true)) {
  62. api_not_allowed(true);
  63. }
  64. /*
  65. ==============================================================================
  66. FUNCTIONS
  67. ==============================================================================
  68. */
  69. /**
  70. * function to sort users after getting the list in the db. Necessary because there are 2 or 3 queries. Called by usort()
  71. */
  72. function sort_users($user_a, $user_b) {
  73. $cmp = api_strcasecmp($user_a['lastname'], $user_b['lastname']);
  74. if ($cmp !== 0) {
  75. return $cmp;
  76. } else {
  77. $cmp = api_strcasecmp($user_a['firstname'], $user_b['firstname']);
  78. if ($cmp !== 0) {
  79. return $cmp;
  80. } else {
  81. return api_strcasecmp($user_a['username'], $user_b['username']);
  82. }
  83. }
  84. }
  85. /**
  86. * Function to check the given max number of members per group
  87. */
  88. function check_max_number_of_members($value) {
  89. $max_member_no_limit = $value['max_member_no_limit'];
  90. if ($max_member_no_limit == MEMBER_PER_GROUP_NO_LIMIT) {
  91. return true;
  92. }
  93. $max_member = $value['max_member'];
  94. return is_numeric($max_member);
  95. }
  96. /**
  97. * Function to check if the number of selected group members is valid
  98. */
  99. function check_group_members($value) {
  100. if ($value['max_member_no_limit'] == MEMBER_PER_GROUP_NO_LIMIT) {
  101. return true;
  102. }
  103. if (isset($value['max_member']) && isset($value['group_members']) && $value['max_member'] < count($value['group_members'])) {
  104. return array ('group_members' => get_lang('GroupTooMuchMembers'));
  105. }
  106. return true;
  107. }
  108. /*
  109. ==============================================================================
  110. MAIN CODE
  111. ==============================================================================
  112. */
  113. // Build form
  114. $form = new FormValidator('group_edit');
  115. $form->addElement('header', '', $nameTools);
  116. $form->addElement('hidden', 'action');
  117. $form->addElement('hidden', 'referer');
  118. // Group name
  119. $form->add_textfield('name', get_lang('GroupName'));
  120. // Description
  121. $form->addElement('textarea', 'description', get_lang('GroupDescription'), array ('cols' => 50, 'rows' => 6));
  122. // Tutors: this has been replaced with the new tutors code
  123. //$tutors = GroupManager :: get_all_tutors();
  124. //$possible_tutors[0] = get_lang('GroupNoTutor');
  125. //foreach ($tutors as $index => $tutor)
  126. //{
  127. // $possible_tutors[$tutor['user_id']] = $tutor['lastname'].' '.$tutor['firstname'];
  128. //}
  129. //$group = array ();
  130. //$group[] = & $form->createElement('select', 'tutor_id', null, $possible_tutors);
  131. //$group[] = & $form->createElement('static', null, null, '&nbsp;&nbsp;<a href="../user/user.php">'.get_lang('AddTutors').'</a>');
  132. //$form->addGroup($group, 'tutor_group', get_lang('GroupTutor'), '', false);
  133. // Members per group
  134. $form->addElement('radio', 'max_member_no_limit', get_lang('GroupLimit'), get_lang('NoLimit'), MEMBER_PER_GROUP_NO_LIMIT);
  135. $group = array ();
  136. $group[] = & $form->createElement('radio', 'max_member_no_limit', null, get_lang('Max'), 1);
  137. $group[] = & $form->createElement('text', 'max_member', null, array ('size' => 2));
  138. $group[] = & $form->createElement('static', null, null, get_lang('GroupPlacesThis'));
  139. $form->addGroup($group, 'max_member_group', null, '', false);
  140. $form->addRule('max_member_group', get_lang('InvalidMaxNumberOfMembers'), 'callback', 'check_max_number_of_members');
  141. // Self registration
  142. $form->addElement('checkbox', 'self_registration_allowed', get_lang('GroupSelfRegistration'), get_lang('GroupAllowStudentRegistration'), 1);
  143. $form->addElement('checkbox', 'self_unregistration_allowed', null, get_lang('GroupAllowStudentUnregistration'), 1);
  144. // Documents settings
  145. $form->addElement('radio', 'doc_state', get_lang('GroupDocument'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  146. $form->addElement('radio', 'doc_state', null, get_lang('Public'), TOOL_PUBLIC);
  147. $form->addElement('radio', 'doc_state', null, get_lang('Private'), TOOL_PRIVATE);
  148. // Work settings
  149. $form->addElement('radio', 'work_state', get_lang('GroupWork'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  150. $form->addElement('radio', 'work_state', null, get_lang('Public'), TOOL_PUBLIC);
  151. $form->addElement('radio', 'work_state', null, get_lang('Private'), TOOL_PRIVATE);
  152. // Calendar settings
  153. $form->addElement('radio', 'calendar_state', get_lang('GroupCalendar'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  154. $form->addElement('radio', 'calendar_state', null, get_lang('Public'), TOOL_PUBLIC);
  155. $form->addElement('radio', 'calendar_state', null, get_lang('Private'), TOOL_PRIVATE);
  156. // Announcements settings
  157. $form->addElement('radio', 'announcements_state', get_lang('GroupAnnouncements'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  158. $form->addElement('radio', 'announcements_state', null, get_lang('Public'), TOOL_PUBLIC);
  159. $form->addElement('radio', 'announcements_state', null, get_lang('Private'), TOOL_PRIVATE);
  160. //Forum settings
  161. $form->addElement('radio', 'forum_state', get_lang('GroupForum'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  162. $form->addElement('radio', 'forum_state', null, get_lang('Public'), TOOL_PUBLIC);
  163. $form->addElement('radio', 'forum_state', null, get_lang('Private'), TOOL_PRIVATE);
  164. // Wiki settings
  165. $form->addElement('radio', 'wiki_state', get_lang('GroupWiki'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  166. $form->addElement('radio', 'wiki_state', null, get_lang('Public'), TOOL_PUBLIC);
  167. $form->addElement('radio', 'wiki_state', null, get_lang('Private'), TOOL_PRIVATE);
  168. // getting all the users
  169. if (isset($_SESSION['id_session'])) {
  170. $complete_user_list = CourseManager :: get_user_list_from_course_code($_course['id'],true,$_SESSION['id_session']);
  171. $complete_user_list2 = CourseManager :: get_coach_list_from_course_code($_course['id'],$_SESSION['id_session']);
  172. $complete_user_list = array_merge($complete_user_list,$complete_user_list2);
  173. } else {
  174. $complete_user_list = CourseManager :: get_user_list_from_course_code($_course['id']);
  175. }
  176. usort($complete_user_list, 'sort_users');
  177. $possible_users = array ();
  178. foreach ($complete_user_list as $index => $user) {
  179. $possible_users[$user['user_id']] = $user['lastname'].' '.$user['firstname'].' ('.$user['username'].')';
  180. }
  181. //print_r($complete_user_list2);
  182. // Group tutors
  183. $group_tutor_list = GroupManager :: get_subscribed_tutors($current_group['id']);
  184. $selected_users = array ();
  185. $selected_tutors = array();
  186. foreach ($group_tutor_list as $index => $user) {
  187. //$possible_users[$user['user_id']] = $user['lastname'].' '.$user['firstname'];
  188. $selected_tutors[] = $user['user_id'];
  189. }
  190. $group_tutors_element = $form->addElement('advmultiselect', 'group_tutors', get_lang('GroupTutors'), $possible_users, 'style="width: 225px;"');
  191. $group_tutors_element->setElementTemplate('
  192. {javascript}
  193. <table{class}>
  194. <!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
  195. <!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
  196. <tr>
  197. <td valign="top">{unselected}</td>
  198. <td align="center">{add}<br /><br />{remove}</td>
  199. <td valign="top">{selected}</td>
  200. </tr>
  201. </table>
  202. ');
  203. // Group members
  204. $group_member_list = GroupManager :: get_subscribed_users($current_group['id']);
  205. $selected_users = array ();
  206. foreach ($group_member_list as $index => $user) {
  207. //$possible_users[$user['user_id']] = $user['lastname'].' '.$user['firstname'];
  208. $selected_users[] = $user['user_id'];
  209. }
  210. $group_members_element = $form->addElement('advmultiselect', 'group_members', get_lang('GroupMembers'), $possible_users, 'style="width: 225px;"');
  211. $group_members_element->setElementTemplate('
  212. {javascript}
  213. <table{class}>
  214. <!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
  215. <!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
  216. <tr>
  217. <td valign="top">{unselected}</td>
  218. <td align="center">{add}<br /><br />{remove}</td>
  219. <td valign="top">{selected}</td>
  220. </tr>
  221. </table>
  222. ');
  223. $form->addFormRule('check_group_members');
  224. // submit button
  225. $form->addElement('style_submit_button', 'submit', get_lang('PropModify'), 'class="save"');
  226. if ($form->validate()) {
  227. $values = $form->exportValues();
  228. if ($values['max_member_no_limit'] == MEMBER_PER_GROUP_NO_LIMIT) {
  229. $max_member = MEMBER_PER_GROUP_NO_LIMIT;
  230. } else {
  231. $max_member = $values['max_member'];
  232. }
  233. $self_registration_allowed = isset ($values['self_registration_allowed']) ? 1 : 0;
  234. $self_unregistration_allowed = isset ($values['self_unregistration_allowed']) ? 1 : 0;
  235. GroupManager :: set_group_properties($current_group['id'], strip_tags($values['name']), strip_tags($values['description']), $max_member, $values['doc_state'], $values['work_state'], $values['calendar_state'], $values['announcements_state'], $values['forum_state'],$values['wiki_state'], $self_registration_allowed, $self_unregistration_allowed);
  236. // storing the tutors (we first remove all the tutors and then add only those who were selected)
  237. GroupManager :: unsubscribe_all_tutors($current_group['id']);
  238. if (isset ($_POST['group_tutors']) && count($_POST['group_tutors']) > 0) {
  239. GroupManager :: subscribe_tutors($values['group_tutors'], $current_group['id']);
  240. }
  241. // storing the users (we first remove all users and then add only those who were selected)
  242. GroupManager :: unsubscribe_all_users($current_group['id']);
  243. if (isset ($_POST['group_members']) && count($_POST['group_members']) > 0) {
  244. GroupManager :: subscribe_users($values['group_members'], $current_group['id']);
  245. }
  246. // returning to the group area (note: this is inconsistent with the rest of dokeos)
  247. $cat = GroupManager :: get_category_from_group($current_group['id']);
  248. header('Location: '.$values['referer'].'?action=show_msg&msg='.get_lang('GroupSettingsModified').'&category='.$cat['id']);
  249. }
  250. $defaults = $current_group;
  251. $defaults['group_members'] = $selected_users;
  252. $defaults['group_tutors'] = $selected_tutors;
  253. isset($_GET['action'])?$action=$_GET['action']:$action='';
  254. $defaults['action'] = $action;
  255. if ($defaults['maximum_number_of_students'] == MEMBER_PER_GROUP_NO_LIMIT) {
  256. $defaults['max_member_no_limit'] = MEMBER_PER_GROUP_NO_LIMIT;
  257. } else {
  258. $defaults['max_member_no_limit'] = 1;
  259. $defaults['max_member'] = $defaults['maximum_number_of_students'];
  260. }
  261. $referer = parse_url($_SERVER['HTTP_REFERER']);
  262. $referer = basename($referer['path']);
  263. if ($referer != 'group_space.php' && $referer != 'group.php') {
  264. $referer = 'group.php';
  265. }
  266. if (isset($_POST['group_members'])) {
  267. if (count($_POST['group_members'])<=$defaults['max_member']) {
  268. //
  269. } else {
  270. header('Location:group_edit.php?show_message='.get_lang('GroupTooMuchMembers'));
  271. }
  272. }
  273. Display :: display_header($nameTools, "Group");
  274. ?>
  275. <div class="actions">
  276. <a href="group_space.php"><?php echo Display::return_icon('back.png').get_lang('Back').' '.get_lang('To').' '.get_lang('GroupSpace') ?></a>
  277. </div>
  278. <br/>
  279. <br/>
  280. <?php
  281. if (isset($_GET['show_message'])) {
  282. echo Display::display_error_message(get_lang($_GET['show_message']));
  283. }
  284. $defaults['referer'] = $referer;
  285. $form->setDefaults($defaults);
  286. $form->display();
  287. /*
  288. ==============================================================================
  289. FOOTER
  290. ==============================================================================
  291. */
  292. Display :: display_footer();
  293. ?>