group.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  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) Roan Embrechts (Vrije Universiteit Brussel)
  9. Copyright (c) Bart Mollet
  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. * Main page for the group module.
  23. * This script displays the general group settings,
  24. * and a list of groups with buttons to view, edit...
  25. *
  26. * @author Thomas Depraetere, Hugues Peeters, Christophe Gesche: initial versions
  27. * @author Bert Vanderkimpen, improved self-unsubscribe for cvs
  28. * @author Patrick Cool, show group comment under the group name
  29. * @author Roan Embrechts, initial self-unsubscribe code, code cleaning, virtual course support
  30. * @author Bart Mollet, code cleaning, use of Display-library, list of courseAdmin-tools, use of GroupManager
  31. * @package dokeos.group
  32. ==============================================================================
  33. */
  34. /*
  35. ==============================================================================
  36. INIT SECTION
  37. ==============================================================================
  38. */
  39. // name of the language file that needs to be included
  40. $language_file = "group";
  41. include ('../inc/global.inc.php');
  42. $this_section=SECTION_COURSES;
  43. $nameTools = get_lang("GroupManagement");
  44. /*
  45. -----------------------------------------------------------
  46. Libraries
  47. -----------------------------------------------------------
  48. */
  49. include_once (api_get_path(LIBRARY_PATH).'course.lib.php');
  50. include_once (api_get_path(LIBRARY_PATH).'groupmanager.lib.php');
  51. include_once (api_get_path(LIBRARY_PATH).'events.lib.inc.php');
  52. //Create default category if it doesn't exist when group categories aren't allowed
  53. if( api_get_setting('allow_group_categories') == 'false')
  54. {
  55. $cat_table = Database::get_course_table(TABLE_GROUP_CATEGORY);
  56. $sql = "SELECT * FROM $cat_table WHERE id = '".DEFAULT_GROUP_CATEGORY."'";
  57. $res = api_sql_query($sql,__FILE__,__LINE__);
  58. $num = mysql_num_rows($res);
  59. if($num == 0)
  60. {
  61. api_sql_query("INSERT INTO ".$cat_table." ( id , title , description , forum_state , max_student , self_reg_allowed , self_unreg_allowed , groups_per_user , display_order ) VALUES ('2', '".lang2db($DefaultGroupCategory)."', '', '1', '8', '0', '0', '0', '0');");
  62. }
  63. }
  64. /*
  65. -----------------------------------------------------------
  66. Header
  67. -----------------------------------------------------------
  68. */
  69. if (!isset ($_GET['origin']) || $_GET['origin'] != 'learnpath')
  70. { //so we are not in learnpath tool
  71. Display::display_header($nameTools,"Group");
  72. event_access_tool(TOOL_GROUP);
  73. //api_display_tool_title($nameTools);
  74. if (! $is_allowed_in_course) api_not_allowed();
  75. }
  76. else
  77. {
  78. ?> <link rel="stylesheet" type="text/css" href="<?php echo api_get_path(WEB_CODE_PATH); ?>css/default.css" /> <?php
  79. }
  80. /*
  81. -----------------------------------------------------------
  82. Introduction section
  83. (editable by course admins)
  84. -----------------------------------------------------------
  85. */
  86. Display::display_introduction_section(TOOL_GROUP);
  87. /*
  88. * Self-registration and unregistration
  89. */
  90. if (isset ($_GET['action']))
  91. {
  92. switch ($_GET['action'])
  93. {
  94. case 'self_reg' :
  95. if (GroupManager :: is_self_registration_allowed($_SESSION['_uid'], $_GET['group_id']))
  96. {
  97. GroupManager :: subscribe_users($_SESSION['_uid'], $_GET['group_id']);
  98. Display :: display_normal_message(get_lang('GroupNowMember'));
  99. }
  100. break;
  101. case 'self_unreg' :
  102. if (GroupManager :: is_self_unregistration_allowed($_SESSION['_uid'], $_GET['group_id']))
  103. {
  104. GroupManager :: unsubscribe_users($_SESSION['_uid'], $_GET['group_id']);
  105. Display :: display_normal_message(get_lang('StudentDeletesHimself'));
  106. }
  107. break;
  108. case 'show_msg' :
  109. Display :: display_normal_message($_GET['msg']);
  110. break;
  111. }
  112. }
  113. /*
  114. * Group-admin functions
  115. */
  116. if (api_is_allowed_to_edit())
  117. {
  118. // Post-actions
  119. if (isset ($_POST['action']))
  120. {
  121. switch ($_POST['action'])
  122. {
  123. case 'delete_selected' :
  124. if( is_array($_POST['group']))
  125. {
  126. GroupManager :: delete_groups($_POST['group']);
  127. Display :: display_normal_message(get_lang("SelectedGroupsDeleted"));
  128. }
  129. break;
  130. case 'empty_selected' :
  131. if( is_array($_POST['group']))
  132. {
  133. GroupManager :: unsubscribe_all_users($_POST['group']);
  134. Display :: display_normal_message(get_lang("SelectedGroupsEmptied"));
  135. }
  136. break;
  137. case 'fill_selected' :
  138. if( is_array($_POST['group']))
  139. {
  140. GroupManager :: fill_groups($_POST['group']);
  141. Display :: display_normal_message(get_lang("SelectedGroupsFilled"));
  142. }
  143. break;
  144. }
  145. }
  146. // Get-actions
  147. if (isset ($_GET['action']))
  148. {
  149. switch ($_GET['action'])
  150. {
  151. case 'swap_cat_order' :
  152. GroupManager :: swap_category_order($_GET['id1'], $_GET['id2']);
  153. Display :: display_normal_message(get_lang("CategoryOrderChanged"));
  154. break;
  155. case 'delete_one' :
  156. GroupManager :: delete_groups($_GET['id']);
  157. Display :: display_normal_message(get_lang("GroupDel"));
  158. break;
  159. case 'empty_one' :
  160. GroupManager :: unsubscribe_all_users($_GET['id']);
  161. Display :: display_normal_message(get_lang("GroupEmptied"));
  162. break;
  163. case 'fill_one' :
  164. GroupManager :: fill_groups($_GET['id']);
  165. Display :: display_normal_message(get_lang("GroupFilledGroups"));
  166. break;
  167. case 'delete_category' :
  168. GroupManager :: delete_category($_GET['id']);
  169. Display :: display_normal_message(get_lang('CategoryDeleted'));
  170. break;
  171. }
  172. }
  173. // Show admin-panel
  174. echo '<a href="group_creation.php"><img src="../img/group_add_big.gif" align="absbottom">&nbsp;'.get_lang("NewGroupCreate").'</a>&nbsp;';
  175. if (get_setting('allow_group_categories') == 'true')
  176. {
  177. echo '<a href="group_category.php?action=add_category">'.get_lang("AddCategory").'</a>&nbsp;';
  178. }
  179. else
  180. {
  181. echo '<a href="group_category.php?id=2"><img src="../img/edit_group.gif" align="absbottom">&nbsp;'.get_lang('PropModify').'</a>&nbsp;';
  182. }
  183. if( Database::count_rows(Database::get_course_table(TABLE_GROUP)) > 0)
  184. {
  185. echo '<a href="group_overview.php"><img src="../img/group_view.gif" align="absbottom">&nbsp;'.get_lang('GroupOverview').'</a>&nbsp;';
  186. }
  187. }
  188. $group_cats = GroupManager :: get_categories();
  189. if (get_setting('allow_group_categories') == 'true' && count($group_cats) > 1)
  190. {
  191. echo '<p><a href="?show_all=1">'.get_lang('ShowAll').'</a></p>';
  192. }
  193. /*
  194. * List all categories
  195. */
  196. foreach ($group_cats as $index => $category)
  197. {
  198. $group_list = array ();
  199. $in_category = false;
  200. if (get_setting('allow_group_categories') == 'true')
  201. {
  202. if (isset ($_GET['show_all']) || (isset ($_GET['category']) && $_GET['category'] == $category['id']))
  203. {
  204. echo '<img src="../img/opendir.gif" alt=""/>';
  205. echo ' <a href="group.php?origin='.$_GET['origin'].'">'.$category['title'].'</a>';
  206. $in_category = true;
  207. }
  208. else
  209. {
  210. echo '<img src="../img/file.gif" alt=""/>';
  211. echo ' <a href="group.php?origin='.$_GET['origin'].'&amp;category='.$category['id'].'">'.$category['title'].'</a>';
  212. }
  213. $group_list = GroupManager :: get_group_list($category['id']);
  214. echo ' ('.count($group_list).' '.get_lang("ExistingGroups").')';
  215. if (api_is_allowed_to_edit())
  216. {
  217. echo '<a href="group_category.php?id='.$category['id'].'" title="'.get_lang('Edit').'"><img src="../img/edit.gif" alt="'.get_lang('Edit').'"/></a> ';
  218. echo '<a href="group.php?action=delete_category&amp;id='.$category['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;" title="'.get_lang('Delete').'"><img src="../img/delete.gif" alt="'.get_lang('Delete').'"/></a> ';
  219. if ($index != 0)
  220. {
  221. echo ' <a href="group.php?action=swap_cat_order&amp;id1='.$category['id'].'&amp;id2='.$group_cats[$index -1]['id'].'"><img src="../img/up.gif" alt=""/></a>';
  222. }
  223. if ($index != count($group_cats) - 1)
  224. {
  225. echo ' <a href="group.php?action=swap_cat_order&amp;id1='.$category['id'].'&amp;id2='.$group_cats[$index +1]['id'].'"><img src="../img/down.gif" alt=""/></a>';
  226. }
  227. }
  228. echo '<p style="margin: 0px;margin-left: 50px;">'.$category['description'].'</p>';
  229. }
  230. else
  231. {
  232. $group_list = GroupManager :: get_group_list();
  233. $in_category = true;
  234. }
  235. echo '<div style="margin: 0px;margin-left: 50px;">';
  236. if (count($group_list) > 0 && $in_category)
  237. {
  238. $totalRegistered = 0;
  239. // Determine wether current user is tutor for this course
  240. $user_is_tutor = GroupManager :: is_tutor($_user['user_id']);
  241. $group_data = array ();
  242. foreach ($group_list as $index => $this_group)
  243. {
  244. // all the tutors of this group
  245. $tutorsids_of_group=GroupManager::get_subscribed_tutors($this_group['id'],true);
  246. // create a new table-row
  247. $row = array ();
  248. // checkbox
  249. if (api_is_allowed_to_edit() && count($group_list) > 1)
  250. {
  251. $row[] = $this_group['id'];
  252. }
  253. // group name
  254. if (api_is_allowed_to_edit() || in_array($_user['user_id'],$tutorsids_of_group) || $this_group['is_member'] || GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_FORUM) || GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_DOCUMENTS))
  255. {
  256. $group_name = '<a href="group_space.php?'.api_get_cidreq().'&amp;origin='.$origin.'&amp;gidReq='.$this_group['id'].'">'.$this_group['name'].'</a>';
  257. if ($_SESSION['_uid'] && $_SESSION['_uid'] == $this_group['id_tutor'])
  258. {
  259. $group_name .= ' ('.get_lang('OneMyGroups').')';
  260. }
  261. elseif ($this_group['is_member'])
  262. {
  263. $group_name .= ' ('.get_lang("MyGroup").')';
  264. }
  265. $row[] = $group_name.'<br/>'.trim($this_group['description']);
  266. }
  267. else
  268. {
  269. $row[] = $this_group['name'].'<br/>'.trim($this_group['description']);
  270. }
  271. // self-registration / unregistration
  272. if (!api_is_allowed_to_edit())
  273. {
  274. if (GroupManager :: is_self_registration_allowed($_user['user_id'], $this_group['id']))
  275. {
  276. $row[] = '<a href="group.php?category='.$category['id'].'&amp;action=self_reg&amp;group_id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;">'.get_lang("GroupSelfRegInf").'</a>';
  277. }
  278. elseif (GroupManager :: is_self_unregistration_allowed($_user['user_id'], $this_group['id']))
  279. {
  280. $row[] = '<a href="group.php?category='.$category['id'].'&amp;action=self_unreg&amp;group_id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;">'.get_lang("GroupSelfUnRegInf").'</a>';
  281. }
  282. else
  283. {
  284. $row[] = '-';
  285. }
  286. }
  287. // number of members in group
  288. $row[] = $this_group['number_of_members'];
  289. // max number of members in group
  290. $row[] = ($this_group['maximum_number_of_members'] == MEMBER_PER_GROUP_NO_LIMIT ? '-' : $this_group['maximum_number_of_members']);
  291. // tutor name
  292. $tutor_info = '';
  293. if($this_group['id_tutor'] != 0)
  294. {
  295. $tutor = api_get_user_info($this_group['id_tutor']);
  296. $tutor_info = Display::encrypted_mailto_link($tutor['mail'],$tutor['firstName'].' '.$tutor['lastName']);
  297. }
  298. $row[] = $tutor_info;
  299. // edit-links
  300. if (api_is_allowed_to_edit())
  301. {
  302. $edit_actions = '<a href="group_edit.php?gidReq='.$this_group['id'].'" title="'.get_lang('Edit').'"><img src="../img/edit.gif" alt="'.get_lang("Edit").'"/></a>&nbsp;';
  303. $edit_actions .= '<a href="'.$_SERVER['PHP_SELF'].'?category='.$category['id'].'&amp;action=delete_one&amp;id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;" title="'.get_lang('Delete').'"><img src="../img/delete.gif" alt="'.get_lang("Delete").'"/></a>&nbsp;';
  304. $edit_actions .= '<a href="'.$_SERVER['PHP_SELF'].'?category='.$category['id'].'&amp;action=empty_one&amp;id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;" title="'.get_lang('EmptyGroup').'"><img src="../img/group_delete.gif" alt="'.get_lang("EmptyGroup").'"/></a>&nbsp;';
  305. $edit_actions .= '<a href="'.$_SERVER['PHP_SELF'].'?category='.$category['id'].'&amp;action=fill_one&amp;id='.$this_group['id'].'" onclick="javascript:if(!confirm('."'".addslashes(htmlentities(get_lang("ConfirmYourChoice")))."'".')) return false;" title="'.get_lang('FillGroup').'"><img src="../img/add_user.gif" alt="'.get_lang("FillGroup").'"/></a>';
  306. $row[] = $edit_actions;
  307. }
  308. $totalRegistered = $totalRegistered + $this_group[nbMember];
  309. $group_data[] = $row;
  310. } // while loop
  311. if (isset ($_GET['show_all']))
  312. {
  313. $paging_options = array ('per_page' => count($group_data));
  314. }
  315. else
  316. {
  317. $paging_options = array ();
  318. }
  319. $table = new SortableTableFromArray($group_data);
  320. $table->set_additional_parameters(array('category'=>$_GET['category']));
  321. $column = 0;
  322. if (api_is_allowed_to_edit() and count($group_list) > 1)
  323. {
  324. $table->set_header($column++,'', false);
  325. }
  326. $table->set_header($column++,get_lang("ExistingGroups"));
  327. if (!api_is_allowed_to_edit()) // If self-registration allowed
  328. {
  329. $table->set_header($column++,get_lang("GroupSelfRegistration"));
  330. }
  331. $table->set_header($column++,get_lang("Registered"));
  332. $table->set_header($column++,get_lang("Max"));
  333. $table->set_header($column++,get_lang('GroupTutor'));
  334. if (api_is_allowed_to_edit()) // only for course administrator
  335. {
  336. $table->set_header($column++,get_lang("Modify"), false);
  337. $form_actions = array();
  338. $form_actions['delete_selected'] = get_lang('Delete');
  339. $form_actions['fill_selected'] = get_lang('FillGroup');
  340. $form_actions['empty_selected'] = get_lang('EmptyGroup');
  341. if (count($group_list) > 1)
  342. {
  343. $table->set_form_actions($form_actions,'group');
  344. }
  345. }
  346. $table->display();
  347. }
  348. elseif ($in_category)
  349. {
  350. echo get_lang('NoGroupsAvailable');
  351. }
  352. echo '</div>';
  353. }
  354. /*
  355. ==============================================================================
  356. FOOTER
  357. ==============================================================================
  358. */
  359. if (!isset ($_GET['origin']) || $_GET['origin'] != 'learnpath')
  360. {
  361. Display::display_footer();
  362. }
  363. ?>