浏览代码

Applying patch sent by Marko Kastelic see #1949

Julio Montoya 14 年之前
父节点
当前提交
78ef28457e
共有 3 个文件被更改,包括 95 次插入13 次删除
  1. 3 3
      main/group/group.php
  2. 18 8
      main/group/group_edit.php
  3. 74 2
      main/inc/lib/groupmanager.lib.php

+ 3 - 3
main/group/group.php

@@ -296,10 +296,10 @@ foreach ($group_cats as $index => $category) {
 			$row[] = $tutor_info;
 			// Edit-links
 			if (api_is_allowed_to_edit(false, true)  && !(api_is_course_coach() && intval($this_group['session_id']) != intval($_SESSION['id_session']))) {
-				$edit_actions = '<a href="group_edit.php?'.api_get_cidreq().'&gidReq='.$this_group['id'].'"  title="'.get_lang('Edit').'">'.Display::return_icon('settings.png', get_lang('EditGroup'),'','22').'</a>&nbsp;';
-				$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(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'">'.Display::return_icon('delete.png', get_lang('Delete'),'','22').'</a>&nbsp;';				
+				$edit_actions = '<a href="group_edit.php?'.api_get_cidreq().'&gidReq='.$this_group['id'].'"  title="'.get_lang('Edit').'">'.Display::return_icon('settings.png', get_lang('EditGroup'),'','22').'</a>&nbsp;';								
 				$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(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('EmptyGroup').'">'.Display::return_icon('clean.png',get_lang('EmptyGroup'),'','22').'</a>&nbsp;';				
-				$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(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('FillGroup').'">'.Display::return_icon('fill.png',get_lang('FillGroup'),'','22').'</a>';
+				$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(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('FillGroup').'">'.Display::return_icon('fill.png',get_lang('FillGroup'),'','22').'</a>&nbsp;';
+				$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(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES))."'".')) return false;" title="'.get_lang('Delete').'">'.Display::return_icon('delete.png', get_lang('Delete'),'','22').'</a>&nbsp;';
 				$row[] = $edit_actions;
 			}
 			if (!empty($this_group['nbMember'])) {

+ 18 - 8
main/group/group_edit.php

@@ -190,6 +190,7 @@ $form->addElement('radio', 'chat_state', null, get_lang('Private'), TOOL_PRIVATE
 //$form->addElement('style_submit_button', 'submit', get_lang('Search'), 'class="search"');
 
 // Getting all the users
+/*
 if (isset($_SESSION['id_session'])) {
 	$complete_user_list = CourseManager :: get_user_list_from_course_code($_course['id'], true, $_SESSION['id_session']);
 	$complete_user_list2 = CourseManager :: get_coach_list_from_course_code($_course['id'], $_SESSION['id_session']);
@@ -215,13 +216,12 @@ foreach ($complete_user_list as $user_id => $o_course_user) {
 				$temp[] = implode(', ', $groups_name); //Group
 				$temp[] = $o_course_user['official_code'];
 	}
-}
-
+}*/
+$complete_user_list = GroupManager :: fill_groups_list($current_group['id']);
 usort($complete_user_list, 'sort_users');
-
 $possible_users = array();
 foreach ($complete_user_list as $index => $user) {
-	$possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']).' ('.$user['username'].')';
+    $possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']).' ('.$user['username'].')';
 }
 
 // Group tutors
@@ -233,7 +233,7 @@ foreach ($group_tutor_list as $index => $user) {
 	$selected_tutors[] = $user['user_id'];
 }
 
-$group_tutors_element = $form->addElement('advmultiselect', 'group_tutors', get_lang('GroupTutors'), $possible_users, 'style="width: 225px;"');
+$group_tutors_element = $form->addElement('advmultiselect', 'group_tutors', get_lang('GroupTutors'), $possible_users, 'style="width: 280px;"');
 $group_tutors_element->setElementTemplate('
 {javascript}
 <table{class}>
@@ -254,10 +254,20 @@ $group_tutors_element->setButtonAttributes('remove', array('class' => 'arrowl'))
 $group_member_list = GroupManager :: get_subscribed_users($current_group['id']);
 $selected_users = array ();
 foreach ($group_member_list as $index => $user) {
-	//$possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']);
-	$selected_users[] = $user['user_id'];
+    //$possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']);
+    
+    $selected_users[] = $user['user_id'];
 }
-$group_members_element = $form->addElement('advmultiselect', 'group_members', get_lang('GroupMembers'), $possible_users, 'style="width: 225px;"');
+
+
+// possible : number_groups_left > 0 and is group member
+$possible_users = array();
+foreach ($complete_user_list as $index => $user) {
+     if( $user['number_groups_left'] >0 || in_array($user['user_id'],$selected_users) ) 
+    $possible_users[$user['user_id']] = api_get_person_name($user['firstname'], $user['lastname']).' ('.$user['username'].')';
+}
+
+$group_members_element = $form->addElement('advmultiselect', 'group_members', get_lang('GroupMembers'), $possible_users, 'style="width: 280px;"');
 
 $group_members_element->setElementTemplate('
 {javascript}

+ 74 - 2
main/inc/lib/groupmanager.lib.php

@@ -1520,5 +1520,77 @@ class GroupManager {
 	    }
 	    return $groups;
 	}
-}
-?>
+	
+    /**
+     *   fill_groups_list
+     *
+     * see : fill_groups
+     *       Fill the groups with students.
+     *
+     * note : 
+     *        optimize fill_groups_list <--> fill_groups
+     * 
+     */
+    public static function fill_groups_list ($group_ids) {
+        $group_ids = is_array($group_ids) ? $group_ids : array ($group_ids);
+        $group_ids = array_map('intval',$group_ids);
+
+        if (api_is_course_coach()) {
+            for($i=0 ; $i<count($group_ids) ; $i++) {
+                if(!api_is_element_in_the_session(TOOL_GROUP,$group_ids[$i])) {
+                    array_splice($group_ids,$i,1);
+                    $i--;
+                }
+            }
+            if (count($group_ids)==0){
+                return false;}
+        }
+
+        global $_course;
+        $category = self :: get_category_from_group($group_ids[0]);
+        $groups_per_user = $category['groups_per_user'];
+        $course_user_table = Database :: get_main_table(TABLE_MAIN_COURSE_USER);
+        $group_table = Database :: get_course_table(TABLE_GROUP);
+        $group_user_table = Database :: get_course_table(TABLE_GROUP_USER);
+        $session_id = api_get_session_id();
+        $complete_user_list = CourseManager :: get_real_and_linked_user_list($_course['sysCode'], true, $session_id);
+        $number_groups_per_user = ($groups_per_user == GROUP_PER_MEMBER_NO_LIMIT ? INFINITE : $groups_per_user);
+        /*
+         * Retrieve all the groups where enrollment is still allowed
+         * (reverse) ordered by the number of place available
+         */
+        $sql = "SELECT g.id gid, g.max_student-count(ug.user_id) nbPlaces, g.max_student
+                FROM ".$group_table." g
+                LEFT JOIN  ".$group_user_table." ug
+                ON    g.id = ug.group_id
+                WHERE g.id IN (".implode(',', $group_ids).")
+                GROUP BY (g.id)
+                HAVING (nbPlaces > 0 OR g.max_student = ".MEMBER_PER_GROUP_NO_LIMIT.")
+                ORDER BY nbPlaces DESC";
+        $sql_result = Database::query($sql);
+        $group_available_place = array ();
+        while ($group = Database::fetch_array($sql_result, 'ASSOC'))
+        {
+            $group_available_place[$group['gid']] = $group['nbPlaces'];
+        }
+        /*
+         * Retrieve course users (reverse) ordered by the number
+         * of group they are already enrolled
+         */
+        for ($i = 0; $i < count($complete_user_list); $i ++)
+        {
+
+            //find # of groups the user is enrolled in
+            $number_of_groups = self :: user_in_number_of_groups($complete_user_list[$i]["user_id"],$category['id']);
+            //add # of groups to user list
+            $complete_user_list[$i]['number_groups_left'] = $number_groups_per_user - $number_of_groups;
+        }
+        //first sort by user_id to filter out duplicates
+        $complete_user_list = TableSort :: sort_table($complete_user_list, 'user_id');
+        $complete_user_list = self :: filter_duplicates($complete_user_list, 'user_id');
+        $complete_user_list = self :: filter_only_students($complete_user_list);
+        //now sort by # of group left
+        $complete_user_list = TableSort :: sort_table($complete_user_list, 'number_groups_left', SORT_DESC);           
+        return $complete_user_list;
+    }		
+}