group_edit.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. if (api_sort_by_first_name()) {
  74. $cmp = api_strcmp($user_a['firstname'], $user_b['firstname']);
  75. if ($cmp !== 0) {
  76. return $cmp;
  77. } else {
  78. $cmp = api_strcmp($user_a['lastname'], $user_b['lastname']);
  79. if ($cmp !== 0) {
  80. return $cmp;
  81. } else {
  82. return api_strcmp($user_a['username'], $user_b['username']);
  83. }
  84. }
  85. } else {
  86. $cmp = api_strcmp($user_a['lastname'], $user_b['lastname']);
  87. if ($cmp !== 0) {
  88. return $cmp;
  89. } else {
  90. $cmp = api_strcmp($user_a['firstname'], $user_b['firstname']);
  91. if ($cmp !== 0) {
  92. return $cmp;
  93. } else {
  94. return api_strcmp($user_a['username'], $user_b['username']);
  95. }
  96. }
  97. }
  98. }
  99. /**
  100. * Function to check the given max number of members per group
  101. */
  102. function check_max_number_of_members($value) {
  103. $max_member_no_limit = $value['max_member_no_limit'];
  104. if ($max_member_no_limit == MEMBER_PER_GROUP_NO_LIMIT) {
  105. return true;
  106. }
  107. $max_member = $value['max_member'];
  108. return is_numeric($max_member);
  109. }
  110. /**
  111. * Function to check if the number of selected group members is valid
  112. */
  113. function check_group_members($value) {
  114. if ($value['max_member_no_limit'] == MEMBER_PER_GROUP_NO_LIMIT) {
  115. return true;
  116. }
  117. if (isset($value['max_member']) && isset($value['group_members']) && $value['max_member'] < count($value['group_members'])) {
  118. return array ('group_members' => get_lang('GroupTooMuchMembers'));
  119. }
  120. return true;
  121. }
  122. /*
  123. ==============================================================================
  124. MAIN CODE
  125. ==============================================================================
  126. */
  127. // Build form
  128. $form = new FormValidator('group_edit');
  129. $form->addElement('header', '', $nameTools);
  130. $form->addElement('hidden', 'action');
  131. $form->addElement('hidden', 'referer');
  132. // Group name
  133. $form->add_textfield('name', get_lang('GroupName'));
  134. // Description
  135. $form->addElement('textarea', 'description', get_lang('Description'), array ('cols' => 50, 'rows' => 6));
  136. // Tutors: this has been replaced with the new tutors code
  137. //$tutors = GroupManager :: get_all_tutors();
  138. //$possible_tutors[0] = get_lang('GroupNoTutor');
  139. //foreach ($tutors as $index => $tutor)
  140. //{
  141. // $possible_tutors[$tutor['user_id']] = api_get_person_name($tutor['lastname'], $tutor['firstname']);
  142. //}
  143. //$group = array ();
  144. //$group[] = & $form->createElement('select', 'tutor_id', null, $possible_tutors);
  145. //$group[] = & $form->createElement('static', null, null, '&nbsp;&nbsp;<a href="../user/user.php">'.get_lang('AddTutors').'</a>');
  146. //$form->addGroup($group, 'tutor_group', get_lang('GroupTutor'), '', false);
  147. // Members per group
  148. $form->addElement('radio', 'max_member_no_limit', get_lang('GroupLimit'), get_lang('NoLimit'), MEMBER_PER_GROUP_NO_LIMIT);
  149. $group = array ();
  150. $group[] = & $form->createElement('radio', 'max_member_no_limit', null, get_lang('Max'), 1);
  151. $group[] = & $form->createElement('text', 'max_member', null, array ('size' => 2));
  152. $group[] = & $form->createElement('static', null, null, get_lang('GroupPlacesThis'));
  153. $form->addGroup($group, 'max_member_group', null, '', false);
  154. $form->addRule('max_member_group', get_lang('InvalidMaxNumberOfMembers'), 'callback', 'check_max_number_of_members');
  155. // Self registration
  156. $form->addElement('checkbox', 'self_registration_allowed', get_lang('GroupSelfRegistration'), get_lang('GroupAllowStudentRegistration'), 1);
  157. $form->addElement('checkbox', 'self_unregistration_allowed', null, get_lang('GroupAllowStudentUnregistration'), 1);
  158. // Documents settings
  159. $form->addElement('radio', 'doc_state', get_lang('GroupDocument'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  160. $form->addElement('radio', 'doc_state', null, get_lang('Public'), TOOL_PUBLIC);
  161. $form->addElement('radio', 'doc_state', null, get_lang('Private'), TOOL_PRIVATE);
  162. // Work settings
  163. $form->addElement('radio', 'work_state', get_lang('GroupWork'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  164. $form->addElement('radio', 'work_state', null, get_lang('Public'), TOOL_PUBLIC);
  165. $form->addElement('radio', 'work_state', null, get_lang('Private'), TOOL_PRIVATE);
  166. // Calendar settings
  167. $form->addElement('radio', 'calendar_state', get_lang('GroupCalendar'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  168. $form->addElement('radio', 'calendar_state', null, get_lang('Public'), TOOL_PUBLIC);
  169. $form->addElement('radio', 'calendar_state', null, get_lang('Private'), TOOL_PRIVATE);
  170. // Announcements settings
  171. $form->addElement('radio', 'announcements_state', get_lang('GroupAnnouncements'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  172. $form->addElement('radio', 'announcements_state', null, get_lang('Public'), TOOL_PUBLIC);
  173. $form->addElement('radio', 'announcements_state', null, get_lang('Private'), TOOL_PRIVATE);
  174. //Forum settings
  175. $form->addElement('radio', 'forum_state', get_lang('GroupForum'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  176. $form->addElement('radio', 'forum_state', null, get_lang('Public'), TOOL_PUBLIC);
  177. $form->addElement('radio', 'forum_state', null, get_lang('Private'), TOOL_PRIVATE);
  178. // Wiki settings
  179. $form->addElement('radio', 'wiki_state', get_lang('GroupWiki'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  180. $form->addElement('radio', 'wiki_state', null, get_lang('Public'), TOOL_PUBLIC);
  181. $form->addElement('radio', 'wiki_state', null, get_lang('Private'), TOOL_PRIVATE);
  182. // Chat settings
  183. $form->addElement('radio', 'chat_state', get_lang('Chat'), get_lang('NotAvailable'), TOOL_NOT_AVAILABLE);
  184. $form->addElement('radio', 'chat_state', null, get_lang('Public'), TOOL_PUBLIC);
  185. $form->addElement('radio', 'chat_state', null, get_lang('Private'), TOOL_PRIVATE);
  186. // getting all the users
  187. if (isset($_SESSION['id_session'])) {
  188. $complete_user_list = CourseManager :: get_user_list_from_course_code($_course['id'],true,$_SESSION['id_session']);
  189. $complete_user_list2 = CourseManager :: get_coach_list_from_course_code($_course['id'],$_SESSION['id_session']);
  190. $complete_user_list = array_merge($complete_user_list,$complete_user_list2);
  191. } else {
  192. $complete_user_list = CourseManager :: get_user_list_from_course_code($_course['id']);
  193. }
  194. usort($complete_user_list, 'sort_users');
  195. $possible_users = array ();
  196. foreach ($complete_user_list as $index => $user) {
  197. $possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']).' ('.$user['username'].')';
  198. }
  199. //print_r($complete_user_list2);
  200. // Group tutors
  201. $group_tutor_list = GroupManager :: get_subscribed_tutors($current_group['id']);
  202. $selected_users = array ();
  203. $selected_tutors = array();
  204. foreach ($group_tutor_list as $index => $user) {
  205. //$possible_users[$user['user_id']] = api_get_person_name($user['firstname'], .$user['lastname']);
  206. $selected_tutors[] = $user['user_id'];
  207. }
  208. $group_tutors_element = $form->addElement('advmultiselect', 'group_tutors', get_lang('GroupTutors'), $possible_users, 'style="width: 225px;"');
  209. $group_tutors_element->setElementTemplate('
  210. {javascript}
  211. <table{class}>
  212. <!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
  213. <!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
  214. <tr>
  215. <td valign="top">{unselected}</td>
  216. <td align="center">{add}<br /><br />{remove}</td>
  217. <td valign="top">{selected}</td>
  218. </tr>
  219. </table>
  220. ');
  221. $group_tutors_element->setButtonAttributes('add',array('class'=>'arrowr'));
  222. $group_tutors_element->setButtonAttributes('remove',array('class'=>'arrowl'));
  223. // Group members
  224. $group_member_list = GroupManager :: get_subscribed_users($current_group['id']);
  225. $selected_users = array ();
  226. foreach ($group_member_list as $index => $user) {
  227. //$possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']);
  228. $selected_users[] = $user['user_id'];
  229. }
  230. $group_members_element = $form->addElement('advmultiselect', 'group_members', get_lang('GroupMembers'), $possible_users, 'style="width: 225px;"');
  231. $group_members_element->setElementTemplate('
  232. {javascript}
  233. <table{class}>
  234. <!-- BEGIN label_2 --><tr><th>{label_2}</th><!-- END label_2 -->
  235. <!-- BEGIN label_3 --><th>&nbsp;</th><th>{label_3}</th></tr><!-- END label_3 -->
  236. <tr>
  237. <td valign="top">{unselected}</td>
  238. <td align="center">{add}<br /><br />{remove}</td>
  239. <td valign="top">{selected}</td>
  240. </tr>
  241. </table>
  242. ');
  243. $group_members_element->setButtonAttributes('add',array('class'=>'arrowr'));
  244. $group_members_element->setButtonAttributes('remove',array('class'=>'arrowl'));
  245. $form->addFormRule('check_group_members');
  246. // submit button
  247. $form->addElement('style_submit_button', 'submit', get_lang('PropModify'), 'class="save"');
  248. if ($form->validate()) {
  249. $values = $form->exportValues();
  250. if ($values['max_member_no_limit'] == MEMBER_PER_GROUP_NO_LIMIT) {
  251. $max_member = MEMBER_PER_GROUP_NO_LIMIT;
  252. } else {
  253. $max_member = $values['max_member'];
  254. }
  255. $self_registration_allowed = isset ($values['self_registration_allowed']) ? 1 : 0;
  256. $self_unregistration_allowed = isset ($values['self_unregistration_allowed']) ? 1 : 0;
  257. 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'], $values['chat_state'], $self_registration_allowed, $self_unregistration_allowed);
  258. // storing the tutors (we first remove all the tutors and then add only those who were selected)
  259. GroupManager :: unsubscribe_all_tutors($current_group['id']);
  260. if (isset ($_POST['group_tutors']) && count($_POST['group_tutors']) > 0) {
  261. GroupManager :: subscribe_tutors($values['group_tutors'], $current_group['id']);
  262. }
  263. // storing the users (we first remove all users and then add only those who were selected)
  264. GroupManager :: unsubscribe_all_users($current_group['id']);
  265. if (isset ($_POST['group_members']) && count($_POST['group_members']) > 0) {
  266. GroupManager :: subscribe_users($values['group_members'], $current_group['id']);
  267. }
  268. // returning to the group area (note: this is inconsistent with the rest of dokeos)
  269. $cat = GroupManager :: get_category_from_group($current_group['id']);
  270. header('Location: '.$values['referer'].'?action=show_msg&msg='.get_lang('GroupSettingsModified').'&category='.$cat['id']);
  271. }
  272. $defaults = $current_group;
  273. $defaults['group_members'] = $selected_users;
  274. $defaults['group_tutors'] = $selected_tutors;
  275. isset($_GET['action'])?$action=$_GET['action']:$action='';
  276. $defaults['action'] = $action;
  277. if ($defaults['maximum_number_of_students'] == MEMBER_PER_GROUP_NO_LIMIT) {
  278. $defaults['max_member_no_limit'] = MEMBER_PER_GROUP_NO_LIMIT;
  279. } else {
  280. $defaults['max_member_no_limit'] = 1;
  281. $defaults['max_member'] = $defaults['maximum_number_of_students'];
  282. }
  283. $referer = parse_url($_SERVER['HTTP_REFERER']);
  284. $referer = basename($referer['path']);
  285. if ($referer != 'group_space.php' && $referer != 'group.php') {
  286. $referer = 'group.php';
  287. }
  288. if (isset($_POST['group_members'])) {
  289. if (count($_POST['group_members'])<=$defaults['max_member']) {
  290. //
  291. } else {
  292. header('Location:group_edit.php?show_message='.get_lang('GroupTooMuchMembers'));
  293. }
  294. }
  295. Display :: display_header($nameTools, "Group");
  296. ?>
  297. <div class="actions">
  298. <a href="group_space.php"><?php echo Display::return_icon('back.png',get_lang('ReturnTo').' '.get_lang('GroupSpace')).get_lang('ReturnTo').' '.get_lang('GroupSpace') ?></a>
  299. </div>
  300. <?php
  301. if (isset($_GET['show_message'])) {
  302. echo Display::display_error_message($_GET['show_message']);
  303. }
  304. $defaults['referer'] = $referer;
  305. $form->setDefaults($defaults);
  306. $form->display();
  307. /*
  308. ==============================================================================
  309. FOOTER
  310. ==============================================================================
  311. */
  312. Display :: display_footer();
  313. ?>