group.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  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. require_once (api_get_path(LIBRARY_PATH).'course.lib.php');
  50. require_once (api_get_path(LIBRARY_PATH).'groupmanager.lib.php');
  51. require_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. event_access_tool(TOOL_GROUP);
  72. if (! $is_allowed_in_course) api_not_allowed(true);
  73. }
  74. Display::display_header(get_lang("Groups"));
  75. /*
  76. -----------------------------------------------------------
  77. Introduction section
  78. (editable by course admins)
  79. -----------------------------------------------------------
  80. */
  81. Display::display_introduction_section(TOOL_GROUP);
  82. /*
  83. * Self-registration and unregistration
  84. */
  85. if (isset ($_GET['action']))
  86. {
  87. switch ($_GET['action'])
  88. {
  89. case 'self_reg' :
  90. if (GroupManager :: is_self_registration_allowed($_SESSION['_user']['user_id'], $_GET['group_id']))
  91. {
  92. GroupManager :: subscribe_users($_SESSION['_user']['user_id'], $_GET['group_id']);
  93. Display :: display_normal_message(get_lang('GroupNowMember'));
  94. }
  95. break;
  96. case 'self_unreg' :
  97. if (GroupManager :: is_self_unregistration_allowed($_SESSION['_user']['user_id'], $_GET['group_id']))
  98. {
  99. GroupManager :: unsubscribe_users($_SESSION['_user']['user_id'], $_GET['group_id']);
  100. Display :: display_normal_message(get_lang('StudentDeletesHimself'));
  101. }
  102. break;
  103. case 'show_msg' :
  104. Display :: display_normal_message($_GET['msg']);
  105. break;
  106. }
  107. }
  108. /*
  109. * Group-admin functions
  110. */
  111. if (api_is_allowed_to_edit())
  112. {
  113. // Post-actions
  114. if (isset ($_POST['action']))
  115. {
  116. switch ($_POST['action'])
  117. {
  118. case 'delete_selected' :
  119. if( is_array($_POST['group']))
  120. {
  121. GroupManager :: delete_groups($_POST['group']);
  122. Display :: display_normal_message(get_lang("SelectedGroupsDeleted"));
  123. }
  124. break;
  125. case 'empty_selected' :
  126. if( is_array($_POST['group']))
  127. {
  128. GroupManager :: unsubscribe_all_users($_POST['group']);
  129. Display :: display_normal_message(get_lang("SelectedGroupsEmptied"));
  130. }
  131. break;
  132. case 'fill_selected' :
  133. if( is_array($_POST['group']))
  134. {
  135. GroupManager :: fill_groups($_POST['group']);
  136. Display :: display_normal_message(get_lang("SelectedGroupsFilled"));
  137. }
  138. break;
  139. }
  140. }
  141. // Get-actions
  142. if (isset ($_GET['action']))
  143. {
  144. switch ($_GET['action'])
  145. {
  146. case 'swap_cat_order' :
  147. GroupManager :: swap_category_order($_GET['id1'], $_GET['id2']);
  148. Display :: display_normal_message(get_lang("CategoryOrderChanged"));
  149. break;
  150. case 'delete_one' :
  151. GroupManager :: delete_groups($_GET['id']);
  152. Display :: display_normal_message(get_lang("GroupDel"));
  153. break;
  154. case 'empty_one' :
  155. GroupManager :: unsubscribe_all_users($_GET['id']);
  156. Display :: display_normal_message(get_lang("GroupEmptied"));
  157. break;
  158. case 'fill_one' :
  159. GroupManager :: fill_groups($_GET['id']);
  160. Display :: display_normal_message(get_lang("GroupFilledGroups"));
  161. break;
  162. case 'delete_category' :
  163. GroupManager :: delete_category($_GET['id']);
  164. Display :: display_normal_message(get_lang('CategoryDeleted'));
  165. break;
  166. }
  167. }
  168. // Show admin-panel
  169. echo "<div id=\"actions\">\n";
  170. echo "<ul id=\"groupItems\">";
  171. if (get_setting('allow_group_categories') == 'true')
  172. {
  173. echo '<li><a href="group_category.php?'.api_get_cidreq().'&action=add_category">'.get_lang("AddCategory").'</a>&nbsp;</li>';
  174. }
  175. else
  176. {
  177. //echo '<a href="group_category.php?'.api_get_cidreq().'&id=2">'.Display::return_icon('edit_group.gif').'&nbsp;'.get_lang('PropModify').'</a>&nbsp;';
  178. echo '<a href="group_category.php?'.api_get_cidreq().'&id=2">'.get_lang('PropModify').'</a>&nbsp;';
  179. }
  180. //echo '<a href="group_creation.php?'.api_get_cidreq().'">'.Display::return_icon('group_add_big.gif').'&nbsp;'.get_lang("NewGroupCreate").'</a>&nbsp;';
  181. echo '<li><a href="group_creation.php?'.api_get_cidreq().'">'.get_lang("NewGroupCreate").'</a>&nbsp;</li>';
  182. if( Database::count_rows(Database::get_course_table(TABLE_GROUP)) > 0)
  183. {
  184. //echo '<a href="group_overview.php?'.api_get_cidreq().'">'.Display::return_icon('group_view.gif').'&nbsp;'.get_lang('GroupOverview').'</a>&nbsp;';
  185. echo '<li><a href="group_overview.php?'.api_get_cidreq().'">'.get_lang('GroupOverview').'</a>&nbsp;</li>';
  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="?'.api_get_cidreq().'&show_all=1">'.get_lang('ShowAll').'</a></p>';
  192. echo '<li><a href="?'.api_get_cidreq().'&show_all=1">'.get_lang('ShowAll').'</a></li>';
  193. }
  194. echo "</ul>";
  195. /*
  196. * List all categories
  197. */
  198. foreach ($group_cats as $index => $category)
  199. {
  200. $group_list = array ();
  201. $in_category = false;
  202. if (get_setting('allow_group_categories') == 'true')
  203. {
  204. if (isset ($_GET['show_all']) || (isset ($_GET['category']) && $_GET['category'] == $category['id']))
  205. {
  206. echo '<img src="../img/opendir.gif" alt=""/>';
  207. echo ' <a href="group.php?'.api_get_cidreq().'&origin='.$_GET['origin'].'">'.$category['title'].'</a>';
  208. $in_category = true;
  209. }
  210. else
  211. {
  212. echo '<img src="../img/file.gif" alt=""/>';
  213. echo ' <a href="group.php?'.api_get_cidreq().'&origin='.$_GET['origin'].'&amp;category='.$category['id'].'">'.$category['title'].'</a>';
  214. }
  215. $group_list = GroupManager :: get_group_list($category['id']);
  216. echo ' ('.count($group_list).' '.get_lang("ExistingGroups").')';
  217. if (api_is_allowed_to_edit())
  218. {
  219. echo '<a href="group_category.php?'.api_get_cidreq().'&id='.$category['id'].'" title="'.get_lang('Edit').'"><img src="../img/edit.gif" alt="'.get_lang('Edit').'"/></a> ';
  220. echo '<a href="group.php?'.api_get_cidreq().'&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> ';
  221. if ($index != 0)
  222. {
  223. echo ' <a href="group.php?'.api_get_cidreq().'&action=swap_cat_order&amp;id1='.$category['id'].'&amp;id2='.$group_cats[$index -1]['id'].'"><img src="../img/up.gif" alt=""/></a>';
  224. }
  225. if ($index != count($group_cats) - 1)
  226. {
  227. echo ' <a href="group.php?'.api_get_cidreq().'&action=swap_cat_order&amp;id1='.$category['id'].'&amp;id2='.$group_cats[$index +1]['id'].'"><img src="../img/down.gif" alt=""/></a>';
  228. }
  229. }
  230. echo '<p style="margin: 0px;margin-left: 50px;">'.$category['description'].'</p><p/>';
  231. }
  232. else
  233. {
  234. $group_list = GroupManager :: get_group_list();
  235. $in_category = true;
  236. }
  237. echo '<div style="margin: 0px;margin-left: 50px;">';
  238. //if (count($group_list) > 0 && $in_category)
  239. if ($in_category)
  240. {
  241. $totalRegistered = 0;
  242. // Determine wether current user is tutor for this course
  243. $user_is_tutor = GroupManager :: is_tutor($_user['user_id']);
  244. $group_data = array ();
  245. foreach ($group_list as $index => $this_group)
  246. {
  247. // all the tutors of this group
  248. $tutorsids_of_group=GroupManager::get_subscribed_tutors($this_group['id'],true);
  249. // create a new table-row
  250. $row = array ();
  251. // checkbox
  252. if (api_is_allowed_to_edit() && count($group_list) > 1)
  253. {
  254. $row[] = $this_group['id'];
  255. }
  256. // group name
  257. if (api_is_allowed_to_edit() ||
  258. in_array($_user['user_id'],$tutorsids_of_group) ||
  259. $this_group['is_member'] ||
  260. GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_DOCUMENTS) ||
  261. GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_CALENDAR) ||
  262. GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_ANNOUNCEMENT) ||
  263. GroupManager::user_has_access($_user['user_id'],$this_group['id'],GROUP_TOOL_WORK))
  264. {
  265. $group_name = '<a href="group_space.php?'.api_get_cidreq().'&amp;origin='.$origin.'&amp;gidReq='.$this_group['id'].'">'.stripslashes($this_group['name']).'</a>';
  266. if ($_SESSION['_user']['user_id'] && $_SESSION['_user']['user_id'] == $this_group['id_tutor'])
  267. {
  268. $group_name .= ' ('.get_lang('OneMyGroups').')';
  269. }
  270. elseif ($this_group['is_member'])
  271. {
  272. $group_name .= ' ('.get_lang("MyGroup").')';
  273. }
  274. $row[] = $group_name.'<br/>'.stripslashes(trim($this_group['description']));
  275. }
  276. else
  277. {
  278. $row[] = $this_group['name'].'<br/>'.stripslashes(trim($this_group['description']));
  279. }
  280. // self-registration / unregistration
  281. if (!api_is_allowed_to_edit())
  282. {
  283. if (GroupManager :: is_self_registration_allowed($_user['user_id'], $this_group['id']))
  284. {
  285. $row[] = '<a href="group.php?'.api_get_cidreq().'&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>';
  286. }
  287. elseif (GroupManager :: is_self_unregistration_allowed($_user['user_id'], $this_group['id']))
  288. {
  289. $row[] = '<a href="group.php?'.api_get_cidreq().'&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>';
  290. }
  291. else
  292. {
  293. $row[] = '-';
  294. }
  295. }
  296. // number of members in group
  297. $row[] = $this_group['number_of_members'];
  298. // max number of members in group
  299. $row[] = ($this_group['maximum_number_of_members'] == MEMBER_PER_GROUP_NO_LIMIT ? '-' : $this_group['maximum_number_of_members']);
  300. // tutor name
  301. $tutor_info = '';
  302. if(count($tutorsids_of_group)>0)
  303. {
  304. foreach($tutorsids_of_group as $tutor_id){
  305. $tutor = api_get_user_info($tutor_id);
  306. $tutor_info .= Display::encrypted_mailto_link($tutor['mail'],$tutor['firstName'].' '.$tutor['lastName']).', ';
  307. }
  308. }
  309. $tutor_info = substr($tutor_info,0,strlen($tutor_info)-2);
  310. $row[] = $tutor_info;
  311. // edit-links
  312. if (api_is_allowed_to_edit())
  313. {
  314. $edit_actions = '<a href="group_edit.php?'.api_get_cidreq().'&gidReq='.$this_group['id'].'" title="'.get_lang('Edit').'"><img src="../img/edit.gif" alt="'.get_lang("Edit").'"/></a>&nbsp;';
  315. $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&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;';
  316. $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&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;';
  317. $edit_actions .= '<a href="'.api_get_self().'?'.api_get_cidreq().'&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>';
  318. $row[] = $edit_actions;
  319. }
  320. $totalRegistered = $totalRegistered + $this_group[nbMember];
  321. $group_data[] = $row;
  322. } // while loop
  323. if (isset ($_GET['show_all']))
  324. {
  325. $paging_options = array ('per_page' => count($group_data));
  326. }
  327. else
  328. {
  329. $paging_options = array ();
  330. }
  331. $table = new SortableTableFromArray($group_data);
  332. $table->set_additional_parameters(array('category'=>$_GET['category']));
  333. $column = 0;
  334. if (api_is_allowed_to_edit() and count($group_list) > 1)
  335. {
  336. $table->set_header($column++,'', false);
  337. }
  338. $table->set_header($column++,get_lang("ExistingGroups"));
  339. if (!api_is_allowed_to_edit()) // If self-registration allowed
  340. {
  341. $table->set_header($column++,get_lang("GroupSelfRegistration"));
  342. }
  343. $table->set_header($column++,get_lang("Registered"));
  344. $table->set_header($column++,get_lang("Max"));
  345. $table->set_header($column++,get_lang('GroupTutor'));
  346. if (api_is_allowed_to_edit()) // only for course administrator
  347. {
  348. $table->set_header($column++,get_lang("Modify"), false);
  349. $form_actions = array();
  350. $form_actions['delete_selected'] = get_lang('Delete');
  351. $form_actions['fill_selected'] = get_lang('FillGroup');
  352. $form_actions['empty_selected'] = get_lang('EmptyGroup');
  353. if (count($group_list) > 1)
  354. {
  355. $table->set_form_actions($form_actions,'group');
  356. }
  357. }
  358. $table->display();
  359. }
  360. /*
  361. elseif ($in_category)
  362. {
  363. echo get_lang('NoGroupsAvailable');
  364. }
  365. */
  366. echo '</div>';
  367. }
  368. /*
  369. ==============================================================================
  370. FOOTER
  371. ==============================================================================
  372. */
  373. if (!isset ($_GET['origin']) || $_GET['origin'] != 'learnpath')
  374. {
  375. Display::display_footer();
  376. }
  377. ?>