Yannick Warnier 11 gadi atpakaļ
vecāks
revīzija
1eb79437b2

+ 3 - 1
main/inc/ajax/model.ajax.php

@@ -50,8 +50,10 @@ if (!in_array(
         'get_user_course_report',
         'get_sessions_tracking'
     )
-)) {
+) && !$_REQUEST['from_course_session']) {
     api_protect_admin_script(true);
+} elseif ($_REQUEST['from_course_session'] == 1) {
+    api_protect_teacher_script(true);
 }
 
 // Search features

+ 14 - 0
main/inc/lib/main_api.lib.php

@@ -976,6 +976,20 @@ function api_protect_admin_script($allow_sessions_admins = false, $allow_drh = f
     return true;
 }
 
+/**
+ * Function used to protect a teacher script.
+ * The function blocks access when the user has no teacher rights.
+ *
+ * @author Yoselyn Castillo
+ */
+function api_protect_teacher_script($allow_sessions_admins = false) {
+    if (!api_is_allowed_to_edit()) {
+        api_not_allowed(true);
+        return false;
+    }
+    return true;
+}
+
 /**
  * Function used to prevent anonymous users from accessing a script.
  *

+ 12 - 1
main/inc/lib/sessionmanager.lib.php

@@ -351,7 +351,10 @@ class SessionManager
             $extraJoin = " INNER JOIN $tbl_session_rel_user sru
                             ON sru.id_session = s.id ";
 		}
-
+        
+    if (api_is_allowed_to_edit() && !api_is_platform_admin()) {
+        $where.=" AND s.id_coach = $user_id ";
+    }
 		$coach_name = " CONCAT(u.lastname , ' ', u.firstname) as coach_name ";
 
 		if (api_is_western_name_order()) {
@@ -3032,6 +3035,14 @@ class SessionManager
             }
         }
     }
+    
+    static function protect_teacher_session_edit($id) {
+        if (!api_is_coach($id) && !api_is_platform_admin()) {
+           api_not_allowed(true);
+        } else {
+            return true;
+        }
+    }
 
     /**
      * @param string $course_code

+ 3 - 1
main/install/configuration.dist.php

@@ -189,4 +189,6 @@ $_configuration['system_stable']     = NEW_VERSION_STABLE;
 // Display group's forum in general forum tool
 //$_configuration['display_groups_forum_in_general_tool'] = true;
 // Boost query on last connection time
-//$_configuration['save_user_last_login'] = true;
+//$_configuration['save_user_last_login'] = true;
+// Allow course tutors in sessions to add existing students to their session
+//$_configuration['allow_tutors_to_assign_students_to_session'] = 'false'; 

+ 665 - 0
main/user/add_users_to_session.php

@@ -0,0 +1,665 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+*	@package chamilo.admin
+*/
+
+// name of the language file that needs to be included
+$language_file = array('admin','registration');
+
+// resetting the course id
+$cidReset = true;
+
+// including some necessary files
+require_once '../inc/global.inc.php';
+require_once '../inc/lib/xajax/xajax.inc.php';
+$xajax = new xajax();
+
+$xajax -> registerFunction ('search_users');
+
+// setting the section (for the tabs)
+$this_section = SECTION_PLATFORM_ADMIN;
+
+$id_session = intval($_GET['id_session']);
+
+SessionManager::protect_teacher_session_edit($id_session);
+
+// setting breadcrumbs
+if (api_is_platform_admin()) {
+    $interbreadcrumb[] = array('url' => 'index.php','name' => get_lang('PlatformAdmin'));
+    $interbreadcrumb[] = array('url' => 'session_list.php','name' => get_lang('SessionList'));
+    $interbreadcrumb[] = array('url' => "resume_session.php?id_session=".$id_session,"name" => get_lang('SessionOverview'));
+}
+if($_configuration['allow_tutors_to_assign_students_to_session'] == 'true') {
+    // Database Table Definitions
+    $tbl_session						= Database::get_main_table(TABLE_MAIN_SESSION);
+    $tbl_course							= Database::get_main_table(TABLE_MAIN_COURSE);
+    $tbl_user							= Database::get_main_table(TABLE_MAIN_USER);
+    $tbl_session_rel_user				= Database::get_main_table(TABLE_MAIN_SESSION_USER);
+    
+    // setting the name of the tool
+    $tool_name = get_lang('SubscribeUsersToSession');
+    
+    $add_type = 'unique';
+    
+    if (isset($_REQUEST['add_type']) && $_REQUEST['add_type']!='') {
+    	$add_type = Security::remove_XSS($_REQUEST['add_type']);
+    }
+    
+    $page = isset($_GET['page']) ? Security::remove_XSS($_GET['page']) : null;
+    
+    //checking for extra field with filter on
+    
+    $extra_field_list= UserManager::get_extra_fields();
+    $new_field_list = array();
+    if (is_array($extra_field_list)) {
+    	foreach ($extra_field_list as $extra_field) {
+    		//if is enabled to filter and is a "<select>" field type
+    		if ($extra_field[8]==1 && $extra_field[2]==4 ) {
+    			$new_field_list[] = array('name'=> $extra_field[3], 'variable'=>$extra_field[1], 'data'=> $extra_field[9]);
+    		}
+    	}
+    }
+    
+    function search_users($needle, $type)
+    {    
+    	global $tbl_user,$tbl_session_rel_user,$id_session;
+    	$xajax_response = new XajaxResponse();
+    	$return = '';
+    
+    	if (!empty($needle) && !empty($type)) {
+    
+            //normal behaviour
+            if ($type == 'any_session' && $needle == 'false')  {
+                $type = 'multiple';
+                $needle = '';
+            }
+    
+    		// xajax send utf8 datas... datas in db can be non-utf8 datas
+    		$charset = api_get_system_encoding();
+    		$needle = Database::escape_string($needle);
+    		$needle = api_convert_encoding($needle, $charset, 'utf-8');
+    
+    		$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username';
+    		$cond_user_id = '';
+    
+            //Only for single & multiple
+            if (in_array($type, array('single','multiple'))) {
+        		if (!empty($id_session)) {
+        		    $id_session = intval($id_session);
+        			// check id_user from session_rel_user table
+        			$sql = 'SELECT id_user FROM '.$tbl_session_rel_user.' WHERE id_session ="'.$id_session.'" AND relation_type<>'.SESSION_RELATION_TYPE_RRHH.' ';
+        			$res = Database::query($sql);
+        			$user_ids = array();
+        			if (Database::num_rows($res) > 0) {
+        				while ($row = Database::fetch_row($res)) {
+        					$user_ids[] = (int)$row[0];
+        				}
+        			}
+        			if (count($user_ids) > 0) {
+        				$cond_user_id = ' AND user.user_id NOT IN('.implode(",",$user_ids).')';
+        			}
+        		}
+            }
+    
+            switch ($type) {
+                case 'single':
+                    // search users where username or firstname or lastname begins likes $needle
+                    $sql = 'SELECT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user
+                            WHERE (username LIKE "'.$needle.'%" OR firstname LIKE "'.$needle.'%"
+                                OR lastname LIKE "'.$needle.'%") AND user.status<>6 AND user.status<>'.DRH.''.
+                                $order_clause.
+                                ' LIMIT 11';
+                    break;
+                case 'multiple':
+                    $sql = 'SELECT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user
+                            WHERE '.(api_sort_by_first_name() ? 'firstname' : 'lastname').' LIKE "'.$needle.'%" AND user.status<>'.DRH.' AND user.status<>6 '.$cond_user_id.
+                            $order_clause;
+                    break;
+                case 'any_session':
+                    $sql = 'SELECT DISTINCT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user LEFT OUTER JOIN '.$tbl_session_rel_user.' s ON (s.id_user = user.user_id)
+                            WHERE   s.id_user IS null AND user.status<>'.DRH.' AND
+                                    user.status<>6 '.$cond_user_id.
+                            $order_clause;
+                    break;
+    		}
+    		if (api_is_multiple_url_enabled()) {
+    			$tbl_user_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+    			$access_url_id = api_get_current_access_url_id();
+    			if ($access_url_id != -1) {
+                    switch ($type) {
+                        case 'single':
+                            $sql = 'SELECT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user
+                            INNER JOIN '.$tbl_user_rel_access_url.' url_user ON (url_user.user_id=user.user_id)
+                            WHERE access_url_id = '.$access_url_id.'  AND (username LIKE "'.$needle.'%"
+                            OR firstname LIKE "'.$needle.'%"
+                            OR lastname LIKE "'.$needle.'%") AND user.status<>6 AND user.status<>'.DRH.' '.
+                            $order_clause.
+                            ' LIMIT 11';
+                            break;
+                        case 'multiple':
+                            $sql = 'SELECT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user
+                            INNER JOIN '.$tbl_user_rel_access_url.' url_user ON (url_user.user_id=user.user_id)
+                            WHERE access_url_id = '.$access_url_id.' AND
+                                    '.(api_sort_by_first_name() ? 'firstname' : 'lastname').' LIKE "'.$needle.'%" AND user.status<>'.DRH.' AND user.status<>6 '.$cond_user_id.
+                            $order_clause;
+                            break;
+                        case 'any_session' :
+                            $sql = 'SELECT DISTINCT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user LEFT OUTER JOIN '.$tbl_session_rel_user.' s ON (s.id_user = user.user_id)
+                            INNER JOIN '.$tbl_user_rel_access_url.' url_user ON (url_user.user_id=user.user_id)
+                            WHERE   access_url_id = '.$access_url_id.' AND
+                                    s.id_user IS null AND
+                                    user.status<>'.DRH.' AND
+                                    user.status<>6 '.$cond_user_id.
+                            $order_clause;
+                            break;
+    				}
+    			}
+    		}
+    
+    		$rs = Database::query($sql);
+            $i=0;
+    		if ($type == 'single') {
+    			while ($user = Database :: fetch_array($rs)) {
+    	            $i++;
+    	            if ($i<=10) {
+                		$person_name = api_get_person_name($user['firstname'], $user['lastname']);
+    					$return .= '<a href="javascript: void(0);" onclick="javascript: add_user_to_session(\''.$user['user_id'].'\',\''.$person_name.' ('.$user['username'].')'.'\')">'.$person_name.' ('.$user['username'].')</a><br />';
+    	            } else {
+    	            	$return .= '...<br />';
+    	            }
+    			}
+    
+    			$xajax_response -> addAssign('ajax_list_users_single','innerHTML',api_utf8_encode($return));
+    		} else {
+    			global $nosessionUsersList;
+    			$return .= '<select id="origin_users" name="nosessionUsersList[]" multiple="multiple" size="15" style="width:360px;">';
+    			while ($user = Database :: fetch_array($rs)) {
+    				$person_name = api_get_person_name($user['firstname'], $user['lastname']);
+    	            $return .= '<option value="'.$user['user_id'].'">'.$person_name.' ('.$user['username'].')</option>';
+    			}
+    			$return .= '</select>';
+    			$xajax_response -> addAssign('ajax_list_users_multiple','innerHTML',api_utf8_encode($return));
+    		}
+    	}
+    	return $xajax_response;
+    }
+    
+    $xajax -> processRequests();
+    
+    $htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/');
+    $htmlHeadXtra[] = '
+    <script type="text/javascript">
+    function add_user_to_session (code, content) {
+    	document.getElementById("user_to_add").value = "";
+    	document.getElementById("ajax_list_users_single").innerHTML = "";
+    
+    	destination = document.getElementById("destination_users");
+    
+    	for (i=0;i<destination.length;i++) {
+    		if(destination.options[i].text == content) {
+    				return false;
+    		}
+    	}
+    	destination.options[destination.length] = new Option(content,code);
+    	destination.selectedIndex = -1;
+    	sortOptions(destination.options);
+    }
+    
+    function remove_item(origin) {
+    	for(var i = 0 ; i<origin.options.length ; i++) {
+    		if(origin.options[i].selected) {
+    			origin.options[i]=null;
+    			i = i-1;
+    		}
+    	}
+    }
+    
+    function validate_filter() {
+    		document.formulaire.add_type.value = \''.$add_type.'\';
+    		document.formulaire.form_sent.value=0;
+    		document.formulaire.submit();
+    }
+    
+    function checked_in_no_session(checked) {
+        $("#first_letter_user")
+        .find("option")
+        .attr("selected", false);
+        xajax_search_users(checked, "any_session");
+    }
+    
+    function change_select(val) {
+        $("#user_with_any_session_id").attr("checked", false);
+        xajax_search_users(val,"multiple");
+    }
+    
+    </script>';
+    
+    
+    $form_sent = 0;
+    $errorMsg = $firstLetterUser = $firstLetterSession='';
+    $UserList = $SessionList = array();
+    $sessions = array();
+    $noPHP_SELF = true;
+    
+    if (isset($_POST['form_sent']) && $_POST['form_sent']) {
+        $form_sent             = $_POST['form_sent'];
+        $firstLetterUser       = $_POST['firstLetterUser'];
+        $firstLetterSession    = $_POST['firstLetterSession'];
+        $UserList              = $_POST['sessionUsersList'];
+    
+        if (!is_array($UserList)) {
+            $UserList=array();
+        }
+    
+        if ($form_sent == 1) {
+            //added a parameter to send emails when registering a user
+            SessionManager::suscribe_users_to_session($id_session, $UserList, null, true);
+            header('Location: resume_session.php?id_session='.$id_session);
+            exit;
+        }
+    }
+    
+    $session_info = SessionManager::fetch($id_session);
+    Display::display_header($tool_name);
+    
+    $nosessionUsersList = $sessionUsersList = array();
+    
+    $ajax_search = $add_type == 'unique' ? true : false;
+    
+    $order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname, username' : ' ORDER BY lastname, firstname, username';
+    if ($ajax_search) {
+        $sql = "SELECT user_id, lastname, firstname, username, id_session
+                FROM $tbl_user u
+                INNER JOIN $tbl_session_rel_user
+                    ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    AND $tbl_session_rel_user.id_session = ".intval($id_session)."
+                    WHERE u.status<>".DRH." AND u.status<>6 $order_clause";
+    
+        if (api_is_multiple_url_enabled()) {
+            $tbl_user_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+            $access_url_id = api_get_current_access_url_id();
+            if ($access_url_id != -1) {
+                $sql="SELECT u.user_id, lastname, firstname, username, id_session
+                FROM $tbl_user u
+                INNER JOIN $tbl_session_rel_user
+                    ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    AND $tbl_session_rel_user.id_session = ".intval($id_session)."
+                    INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id=u.user_id)
+                    WHERE access_url_id = $access_url_id AND u.status<>".DRH." AND u.status<>6
+                    $order_clause";
+            }
+        }
+        $result = Database::query($sql);
+        $users = Database::store_result($result);
+        foreach ($users as $user) {
+            $sessionUsersList[$user['user_id']] = $user ;
+        }
+        unset($users); //clean to free memory
+    } else {
+        //Filter by Extra Fields
+        $use_extra_fields = false;
+        if (is_array($extra_field_list)) {
+            if (is_array($new_field_list) && count($new_field_list)>0 ) {
+                $result_list=array();
+                foreach ($new_field_list as $new_field) {
+                    $varname = 'field_'.$new_field['variable'];
+                    if (UserManager::is_extra_field_available($new_field['variable'])) {
+                        if (isset($_POST[$varname]) && $_POST[$varname]!='0') {
+                            $use_extra_fields = true;
+                            $extra_field_result[]= UserManager::get_extra_user_data_by_value($new_field['variable'], $_POST[$varname]);
+                        }
+                    }
+                }
+            }
+        }
+    
+        if ($use_extra_fields) {
+            $final_result = array();
+           	if (count($extra_field_result)>1) {
+    	    for($i=0;$i<count($extra_field_result)-1;$i++) {
+                    if (is_array($extra_field_result[$i+1])) {
+                        $final_result  = array_intersect($extra_field_result[$i],$extra_field_result[$i+1]);
+                    }
+                }
+            } else {
+                $final_result = $extra_field_result[0];
+            }
+    
+            $where_filter ='';
+            if (api_is_multiple_url_enabled()) {
+                if (is_array($final_result) && count($final_result)>0) {
+                    $where_filter = " AND u.user_id IN  ('".implode("','",$final_result)."') ";
+                } else {
+                    //no results
+                    $where_filter = " AND u.user_id  = -1";
+                }
+            } else {
+                if (is_array($final_result) && count($final_result)>0) {
+                    $where_filter = " WHERE u.user_id IN  ('".implode("','",$final_result)."') ";
+                } else {
+                    //no results
+                    $where_filter = " WHERE u.user_id  = -1";
+                }
+            }
+        }
+    
+        if ($use_extra_fields) {
+            $sql = "SELECT  user_id, lastname, firstname, username, id_session
+                   FROM $tbl_user u
+                        LEFT JOIN $tbl_session_rel_user
+                        ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.id_session = '$id_session' AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                        $where_filter AND u.status<>".DRH." AND u.status<>6
+                        $order_clause";
+    
+        } else {
+            $sql = "SELECT  user_id, lastname, firstname, username, id_session
+                    FROM $tbl_user u
+                    LEFT JOIN $tbl_session_rel_user
+                    ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.id_session = '$id_session' AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    WHERE u.status<>".DRH." AND u.status<>6
+                    $order_clause";
+        }
+        if (api_is_multiple_url_enabled()) {
+            $tbl_user_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+            $access_url_id = api_get_current_access_url_id();
+            if ($access_url_id != -1) {
+                $sql = "SELECT  u.user_id, lastname, firstname, username, id_session
+                        FROM $tbl_user u
+                        LEFT JOIN $tbl_session_rel_user
+                            ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.id_session = '$id_session' AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                        INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id=u.user_id)
+                        WHERE access_url_id = $access_url_id  $where_filter AND u.status<>".DRH." AND u.status<>6
+                        $order_clause";
+            }
+        }
+    
+        $result   = Database::query($sql);
+        $users    = Database::store_result($result,'ASSOC');
+    
+        foreach ($users as $uid => $user) {
+            if ($user['id_session'] != $id_session) {
+                $nosessionUsersList[$user['user_id']] = array('fn'=>$user['firstname'],'ln'=>$user['lastname'],'un'=>$user['username']) ;
+                unset($users[$uid]);
+    	}
+        }
+        unset($users); //clean to free memory
+    
+        //filling the correct users in list
+        $sql="SELECT  user_id, lastname, firstname, username, id_session
+              FROM $tbl_user u
+              LEFT JOIN $tbl_session_rel_user
+              ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.id_session = '$id_session' AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+              WHERE u.status<>".DRH." AND u.status<>6 $order_clause";
+    
+        if (api_is_multiple_url_enabled()) {
+            $tbl_user_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+            $access_url_id = api_get_current_access_url_id();
+            if ($access_url_id != -1) {
+                $sql="SELECT  u.user_id, lastname, firstname, username, id_session
+                    FROM $tbl_user u
+                    LEFT JOIN $tbl_session_rel_user
+                        ON $tbl_session_rel_user.id_user = u.user_id AND $tbl_session_rel_user.id_session = '$id_session' AND $tbl_session_rel_user.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    INNER JOIN $tbl_user_rel_access_url url_user ON (url_user.user_id=u.user_id)
+                    WHERE access_url_id = $access_url_id AND u.status<>".DRH." AND u.status<>6
+                    $order_clause";
+            }
+        }
+        $result = Database::query($sql);
+        $users = Database::store_result($result,'ASSOC');
+        foreach ($users as $uid => $user) {
+            if ($user['id_session'] == $id_session) {
+                $sessionUsersList[$user['user_id']] = $user;
+                if (array_key_exists($user['user_id'],$nosessionUsersList)) {
+                    unset($nosessionUsersList[$user['user_id']]);
+                }
+            }
+            unset($users[$uid]);
+        }
+        unset($users); //clean to free memory
+    }
+    
+    if ($add_type == 'multiple') {
+    	$link_add_type_unique = '<a href="'.api_get_self().'?id_session='.$id_session.'&add='.Security::remove_XSS($_GET['add']).'&add_type=unique">'.Display::return_icon('single.gif').get_lang('SessionAddTypeUnique').'</a>';
+    	$link_add_type_multiple = Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple');
+    } else {
+    	$link_add_type_unique = Display::return_icon('single.gif').get_lang('SessionAddTypeUnique');
+    	$link_add_type_multiple = '<a href="'.api_get_self().'?id_session='.$id_session.'&amp;add='.Security::remove_XSS($_GET['add']).'&amp;add_type=multiple">'.Display::return_icon('multiple.gif').get_lang('SessionAddTypeMultiple').'</a>';
+    }
+    	$link_add_group = '<a href="usergroups.php">'.Display::return_icon('multiple.gif',get_lang('RegistrationByUsersGroups')).get_lang('RegistrationByUsersGroups').'</a>';
+    ?>
+    <div class="actions">
+    	<?php echo $link_add_type_unique ?>&nbsp;|&nbsp;<?php echo $link_add_type_multiple ?>&nbsp;|&nbsp;<?php echo $link_add_group; ?>
+    </div>
+    <form name="formulaire" method="post" action="<?php echo api_get_self(); ?>?page=<?php echo $page; ?>&id_session=<?php echo $id_session; ?><?php if(!empty($_GET['add'])) echo '&add=true' ; ?>" style="margin:0px;" <?php if($ajax_search){echo ' onsubmit="valide();"';}?>>
+    <?php echo '<legend>'.$tool_name.' ('.$session_info['name'].') </legend>'; ?>
+    <?php
+    if ($add_type == 'multiple') {
+    	if (is_array($extra_field_list)) {
+    		if (is_array($new_field_list) && count($new_field_list)>0 ) {
+    			echo '<h3>'.get_lang('FilterUsers').'</h3>';
+    			foreach ($new_field_list as $new_field) {
+    				echo $new_field['name'];
+    				$varname = 'field_'.$new_field['variable'];
+    				echo '&nbsp;<select name="'.$varname.'">';
+    				echo '<option value="0">--'.get_lang('Select').'--</option>';
+    				foreach	($new_field['data'] as $option) {
+    					$checked='';
+    					if (isset($_POST[$varname])) {
+    						if ($_POST[$varname] == $option[1]) {
+    							$checked = 'selected="true"';
+    						}
+    					}
+    					echo '<option value="'.$option[1].'" '.$checked.'>'.$option[1].'</option>';
+    				}
+    				echo '</select>';
+    				echo '&nbsp;&nbsp;';
+    			}
+    			echo '<input type="button" value="'.get_lang('Filter').'" onclick="validate_filter()" />';
+    			echo '<br /><br />';
+    		}
+    	}
+    }
+    ?>
+    
+    <input type="hidden" name="form_sent" value="1" />
+    <input type="hidden" name="add_type"  />
+    
+    <?php
+    if (!empty($errorMsg)) {
+    	Display::display_normal_message($errorMsg); //main API
+    }
+    ?>
+    <div class="row">
+        <div class="span5">
+            <div class="multiple_select_header">
+                <b><?php echo get_lang('UserListInPlatform') ?> :</b>
+    
+            <?php if ($add_type == 'multiple') { ?>
+                <?php echo get_lang('FirstLetterUser'); ?> :
+                    <select id="first_letter_user" name="firstLetterUser" onchange = "change_select(this.value);" >
+                    <option value = "%">--</option>
+                    <?php
+                        echo Display :: get_alphabet_options();
+                    ?>
+                    </select>
+            <?php } ?>
+            </div>
+                <div id="content_source">
+                <?php
+                if (!($add_type == 'multiple')) {
+                  ?>
+                  <input type="text" id="user_to_add" onkeyup="xajax_search_users(this.value,'single')" />
+                  <div id="ajax_list_users_single"></div>
+                  <?php
+                } else {
+                ?>
+                <div id="ajax_list_users_multiple">
+                <select id="origin_users" name="nosessionUsersList[]" multiple="multiple" size="15" class="span5">
+                  <?php
+                  foreach ($nosessionUsersList as $uid => $enreg) {
+                  ?>
+                      <option value="<?php echo $uid; ?>" <?php if(in_array($uid,$UserList)) echo 'selected="selected"'; ?>><?php echo api_get_person_name($enreg['fn'], $enreg['ln']).' ('.$enreg['un'].')'; ?></option>
+                  <?php
+                  }
+                  ?>
+                </select>
+                </div>
+                    <input type="checkbox" onchange="checked_in_no_session(this.checked);" name="user_with_any_session" id="user_with_any_session_id">
+                    <label for="user_with_any_session_id"><?php echo get_lang('UsersRegisteredInNoSession'); ?></label>
+                <?php
+                }
+                unset($nosessionUsersList);
+               ?>
+            </div>
+        </div>
+    
+        <div class="span2">
+            <div style="padding-top:54px;width:auto;text-align: center;">
+            <?php
+                if ($ajax_search) {
+                ?>
+                  <button class="arrowl" type="button" onclick="remove_item(document.getElementById('destination_users'))" ></button>
+                <?php
+            } else {
+                ?>
+                    <button class="arrowr" type="button" onclick="moveItem(document.getElementById('origin_users'), document.getElementById('destination_users'))" onclick="moveItem(document.getElementById('origin_users'), document.getElementById('destination_users'))"></button>
+                    <br /><br />
+                    <button class="arrowl" type="button" onclick="moveItem(document.getElementById('destination_users'), document.getElementById('origin_users'))" onclick="moveItem(document.getElementById('destination_users'), document.getElementById('origin_users'))"></button>
+    
+                  <?php
+                }
+            ?>
+            </div>
+            <br />
+            <br />
+    		<?php
+    		if (isset($_GET['add'])) {
+    			echo '<button class="save" type="button" value="" onclick="valide()" >'.get_lang('FinishSessionCreation').'</button>';
+            } else {
+                //@todo see that the call to "valide()" doesn't duplicate the onsubmit of the form (necessary to avoid delete on "enter" key pressed)
+    			echo '<button class="save" type="button" value="" onclick="valide()" >'.get_lang('SubscribeUsersToSession').'</button>';
+    
+            }
+    		?>
+        </div>
+    
+        <div class="span5">
+            <div class="multiple_select_header">
+                <b><?php echo get_lang('UserListInSession') ?> :</b>
+            </div>
+            <select id="destination_users" name="sessionUsersList[]" multiple="multiple" size="15" class="span5">
+            <?php
+            foreach($sessionUsersList as $enreg) {
+            ?>
+                <option value="<?php echo $enreg['user_id']; ?>"><?php echo api_get_person_name($enreg['firstname'], $enreg['lastname']).' ('.$enreg['username'].')'; ?></option>
+            <?php
+            }
+            unset($sessionUsersList);
+            ?>
+            </select>
+        </div>
+    </div>
+    </form>
+    <script>
+    <!--
+    function moveItem(origin , destination)
+    {
+    
+    	for (var i = 0 ; i<origin.options.length ; i++) {
+    		if (origin.options[i].selected) {
+    			destination.options[destination.length] = new Option(origin.options[i].text,origin.options[i].value);
+    			origin.options[i]=null;
+    			i = i-1;
+    		}
+    	}
+    	destination.selectedIndex = -1;
+    	sortOptions(destination.options);
+    
+    }
+    
+    function sortOptions(options)
+    {
+    
+    	newOptions = new Array();
+    	for (i = 0 ; i<options.length ; i++)
+    		newOptions[i] = options[i];
+    
+    	newOptions = newOptions.sort(mysort);
+    	options.length = 0;
+    	for (i = 0 ; i < newOptions.length ; i++)
+    		options[i] = newOptions[i];
+    
+    }
+    
+    function mysort(a, b)
+    {
+    	if (a.text.toLowerCase() > b.text.toLowerCase()) {
+    		return 1;
+    	}
+    	if (a.text.toLowerCase() < b.text.toLowerCase()) {
+    		return -1;
+    	}
+    	return 0;
+    }
+    
+    function valide()
+    {
+    	var options = document.getElementById('destination_users').options;
+    	for (i = 0 ; i<options.length ; i++)
+    		options[i].selected = true;
+    	document.forms.formulaire.submit();
+    }
+    
+    
+    function loadUsersInSelect(select)
+    {
+    
+    	var xhr_object = null;
+    
+    	if(window.XMLHttpRequest) // Firefox
+    		xhr_object = new XMLHttpRequest();
+    	else if(window.ActiveXObject) // Internet Explorer
+    		xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
+    	else  // XMLHttpRequest non supporté par le navigateur
+    	alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
+    
+    	//xhr_object.open("GET", "loadUsersInSelect.ajax.php?id_session=<?php echo $id_session ?>&letter="+select.options[select.selectedIndex].text, false);
+    	xhr_object.open("POST", "loadUsersInSelect.ajax.php");
+    
+    	xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
+    
+    
+    	nosessionUsers = makepost(document.getElementById('origin_users'));
+    	sessionUsers = makepost(document.getElementById('destination_users'));
+    	nosessionClasses = makepost(document.getElementById('origin_classes'));
+    	sessionClasses = makepost(document.getElementById('destination_classes'));
+    	xhr_object.send("nosessionusers="+nosessionUsers+"&sessionusers="+sessionUsers+"&nosessionclasses="+nosessionClasses+"&sessionclasses="+sessionClasses);
+    
+    	xhr_object.onreadystatechange = function() {
+    		if (xhr_object.readyState == 4) {
+    			document.getElementById('content_source').innerHTML = result = xhr_object.responseText;
+    			//alert(xhr_object.responseText);
+    		}
+    	}
+    }
+    
+    function makepost(select)
+    {
+    
+    	var options = select.options;
+    	var ret = "";
+    	for (i = 0 ; i<options.length ; i++)
+    		ret = ret + options[i].value +'::'+options[i].text+";;";
+    
+    	return ret;
+    
+    }
+    -->
+    </script>
+<?php
+} else {
+    api_not_allowed();
+}
+/*		FOOTER */
+Display::display_footer();

+ 355 - 0
main/user/resume_session.php

@@ -0,0 +1,355 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+*	@author Bart Mollet, Julio Montoya lot of fixes
+*	@package chamilo.admin
+*/
+/*		INIT SECTION */
+
+// name of the language file that needs to be included
+$language_file = 'admin';
+$cidReset = true;
+require_once '../inc/global.inc.php';
+
+// setting the section (for the tabs)
+$this_section = SECTION_PLATFORM_ADMIN;
+
+$id_session = (int)$_GET['id_session'];
+
+SessionManager::protect_teacher_session_edit($id_session);
+
+
+$tool_name = get_lang('SessionOverview');
+
+if($_configuration['allow_tutors_to_assign_students_to_session'] == 'true') {
+    // Database Table Definitions
+    $tbl_session						= Database::get_main_table(TABLE_MAIN_SESSION);
+    $tbl_session_rel_class				= Database::get_main_table(TABLE_MAIN_SESSION_CLASS);
+    $tbl_session_rel_course				= Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
+    $tbl_course							= Database::get_main_table(TABLE_MAIN_COURSE);
+    $tbl_user							= Database::get_main_table(TABLE_MAIN_USER);
+    $tbl_session_rel_user				= Database::get_main_table(TABLE_MAIN_SESSION_USER);
+    $tbl_session_rel_course_rel_user	= Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
+    $tbl_session_category				= Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
+    
+    $table_access_url_user              = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+    
+    $sql = 'SELECT name, nbr_courses, nbr_users, nbr_classes, DATE_FORMAT(date_start,"%d-%m-%Y") as date_start, DATE_FORMAT(date_end,"%d-%m-%Y") as date_end, lastname, firstname, username, session_admin_id, nb_days_access_before_beginning, nb_days_access_after_end, session_category_id, visibility
+    		FROM '.$tbl_session.' LEFT JOIN '.$tbl_user.' ON id_coach = user_id
+    		WHERE '.$tbl_session.'.id='.$id_session;
+    
+    $rs      = Database::query($sql);
+    $session = Database::store_result($rs);
+    $session = $session[0];
+    
+    $sql = 'SELECT name FROM  '.$tbl_session_category.' WHERE id = "'.intval($session['session_category_id']).'"';
+    $rs = Database::query($sql);
+    $session_category = '';
+    
+    if (Database::num_rows($rs)>0) {
+    	$rows_session_category = Database::store_result($rs);
+    	$rows_session_category = $rows_session_category[0];
+    	$session_category = $rows_session_category['name'];
+    }
+    
+    $action = isset($_GET['action']) ? $_GET['action'] : null;
+    
+    $url_id = api_get_current_access_url_id();
+    
+    switch ($action) {
+        case 'add_user_to_url':
+            $user_id = $_REQUEST['user_id'];
+            $result = UrlManager::add_user_to_url($user_id, $url_id);
+            $user_info = api_get_user_info($user_id);
+            if ($result) {
+                $message = Display::return_message(get_lang('UserAdded').' '.api_get_person_name($user_info['firstname'], $user_info['lastname']), 'confirm');
+            }
+            break;
+        case 'delete':
+            $idChecked = $_GET['idChecked'];
+            if(is_array($idChecked)) {
+                $my_temp = array();
+                foreach ($idChecked as $id){
+                    $my_temp[]= Database::escape_string($id);// forcing the escape_string
+                }
+                $idChecked = $my_temp;
+    
+                $idChecked="'".implode("','",$idChecked)."'";
+    
+                Database::query("DELETE FROM $tbl_session_rel_course WHERE id_session='$id_session' AND course_code IN($idChecked)");
+                $nbr_affected_rows=Database::affected_rows();
+    
+                Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND course_code IN($idChecked)");
+                Database::query("UPDATE $tbl_session SET nbr_courses=nbr_courses-$nbr_affected_rows WHERE id='$id_session'");
+            }
+    
+            if (!empty($_GET['class'])){
+                Database::query("DELETE FROM $tbl_session_rel_class WHERE session_id='$id_session' AND class_id=".Database::escape_string($_GET['class']));
+                $nbr_affected_rows=Database::affected_rows();
+                Database::query("UPDATE $tbl_session SET nbr_classes=nbr_classes-$nbr_affected_rows WHERE id='$id_session'");
+            }
+    
+            if (!empty($_GET['user'])) {
+                Database::query("DELETE FROM $tbl_session_rel_user WHERE relation_type<>".SESSION_RELATION_TYPE_RRHH." AND id_session='$id_session' AND id_user=".intval($_GET['user']));
+                $nbr_affected_rows=Database::affected_rows();
+    
+                Database::query("UPDATE $tbl_session SET nbr_users=nbr_users-$nbr_affected_rows WHERE id='$id_session'");
+    
+                Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND id_user=".intval($_GET['user']));
+                $nbr_affected_rows=Database::affected_rows();
+    
+                Database::query("UPDATE $tbl_session_rel_course SET nbr_users=nbr_users-$nbr_affected_rows WHERE id_session='$id_session'");
+            }
+            break;
+    }
+    Display::display_header($tool_name);
+    
+    if (!empty($_GET['warn'])) {
+        Display::display_warning_message(urldecode($_GET['warn']));
+    }
+    
+    if (!empty($message)) {
+        echo $message;
+    }
+    
+    echo Display::page_header(Display::return_icon('session.png', get_lang('Session')).' '.$session['name']);
+    
+    
+    echo Display::page_subheader(get_lang('GeneralProperties').$url);
+    
+    ?>
+    <!-- General properties -->
+    <table class="data_table">
+    <tr>
+    	<td><?php echo get_lang('GeneralCoach'); ?> :</td>
+    	<td><?php echo api_get_person_name($session['firstname'], $session['lastname']).' ('.$session['username'].')' ?></td>
+    </tr>
+    <?php if(!empty($session_category)) { ?>
+    <tr>
+    	<td><?php echo get_lang('SessionCategory') ?></td>
+    	<td><?php echo $session_category;  ?></td>
+    </tr>
+    <?php } ?>
+    <tr>
+    	<td><?php echo get_lang('Date'); ?> :</td>
+    	<td>
+    	<?php
+    		if ($session['date_start'] == '00-00-0000' && $session['date_end']== '00-00-0000' ) {
+    		    echo get_lang('NoTimeLimits');
+            }
+    		else {
+                if ($session['date_start'] != '00-00-0000') {
+                	//$session['date_start'] = Display::tag('i', get_lang('NoTimeLimits'));
+                    $session['date_start'] =  get_lang('From').' '.$session['date_start'];
+                } else {
+                	$session['date_start'] = '';
+                }
+                if ($session['date_end'] == '00-00-0000') {
+                    $session['date_end'] ='';
+                } else {
+                	$session['date_end'] = get_lang('Until').' '.$session['date_end'];
+                }
+    			echo $session['date_start'].' '.$session['date_end'];
+            }
+            ?>
+    	</td>
+    </tr>
+    <!-- show nb_days_before and nb_days_after only if they are different from 0 -->
+    <tr>
+    	<td>
+    		<?php echo api_ucfirst(get_lang('DaysBefore')) ?> :
+    	</td>
+    	<td>
+    		<?php echo intval($session['nb_days_access_before_beginning']) ?>
+    	</td>
+    </tr>
+    <tr>
+    	<td>
+    		<?php echo api_ucfirst(get_lang('DaysAfter')) ?> :
+    	</td>
+    	<td>
+    		<?php echo intval($session['nb_days_access_after_end']) ?>
+    	</td>
+    </tr>
+    <tr>
+    	<td>
+    		<?php echo api_ucfirst(get_lang('SessionVisibility')) ?> :
+    	</td>
+    	<td>
+    		<?php if ($session['visibility']==1) echo get_lang('ReadOnly'); elseif($session['visibility']==2) echo get_lang('Visible');elseif($session['visibility']==3) echo api_ucfirst(get_lang('Invisible'))  ?>
+    	</td>
+    </tr>
+    
+    <?php
+    
+    $multiple_url_is_on = api_get_multiple_access_url();
+    
+    if ($multiple_url_is_on) {
+        echo '<tr><td>';
+        echo 'URL';
+        echo '</td>';
+        echo '<td>';
+        $url_list = UrlManager::get_access_url_from_session($id_session);
+        foreach($url_list as $url_data) {
+            echo $url_data['url'].'<br />';
+        }
+        echo '</td></tr>';
+    }
+    ?>
+    </table>
+    <br />
+    
+    <?php
+    
+    echo Display::page_subheader(get_lang('CourseList').$url);
+    
+    ?>
+    
+    <!--List of courses -->
+    <table class="data_table">
+    <tr>
+      <th width="35%"><?php echo get_lang('CourseTitle'); ?></th>
+      <th width="30%"><?php echo get_lang('CourseCoach'); ?></th>
+      <th width="20%"><?php echo get_lang('UsersNumber'); ?></th>
+    </tr>
+    <?php
+    if ($session['nbr_courses'] == 0){
+    	echo '<tr>
+    			<td colspan="4">'.get_lang('NoCoursesForThisSession').'</td>
+    		</tr>';
+    } else {
+    	// select the courses
+    	$sql = "SELECT code,title,visual_code, nbr_users
+    			FROM $tbl_course,$tbl_session_rel_course
+    			WHERE course_code = code
+    			AND	id_session='$id_session'
+    			ORDER BY title";
+    	$result=Database::query($sql);
+    	$courses=Database::store_result($result);
+    	foreach ($courses as $course) {
+    		//select the number of users
+    
+    		$sql = " SELECT count(*) FROM $tbl_session_rel_user sru, $tbl_session_rel_course_rel_user srcru
+    				WHERE srcru.id_user = sru.id_user AND srcru.id_session = sru.id_session AND srcru.course_code = '".Database::escape_string($course['code'])."'
+    				AND sru.relation_type<>".SESSION_RELATION_TYPE_RRHH." AND srcru.id_session = '".intval($id_session)."'";
+    
+    		$rs = Database::query($sql);
+    		$course['nbr_users'] = Database::result($rs,0,0);
+    
+    		// Get coachs of the courses in session
+    
+    		$sql = "SELECT user.lastname,user.firstname,user.username FROM $tbl_session_rel_course_rel_user session_rcru, $tbl_user user
+    				WHERE session_rcru.id_user = user.user_id AND session_rcru.id_session = '".intval($id_session)."' AND session_rcru.course_code ='".Database::escape_string($course['code'])."' AND session_rcru.status=2";
+    		$rs = Database::query($sql);
+    
+    		$coachs = array();
+    		if (Database::num_rows($rs) > 0) {
+    			while($info_coach = Database::fetch_array($rs)) {
+    				$coachs[] = api_get_person_name($info_coach['firstname'], $info_coach['lastname']).' ('.$info_coach['username'].')';
+    			}
+    		} else {
+    			$coach = get_lang('None');
+    		}
+    
+    		if (count($coachs) > 0) {
+    			$coach = implode('<br />',$coachs);
+    		} else {
+    			$coach = get_lang('None');
+    		}
+    
+    		$orig_param = '&origin=resume_session';
+    		//hide_course_breadcrumb the parameter has been added to hide the name of the course, that appeared in the default $interbreadcrumb
+    		echo '
+    		<tr>
+    			<td>'.Display::url($course['title'].' ('.$course['visual_code'].')', api_get_path(WEB_COURSE_PATH).$course['code'].'/?id_session='.$id_session),'</td>
+    			<td>'.$coach.'</td>
+    			<td>'.$course['nbr_users'].'</td>
+    			
+    		</tr>';
+    	}
+    }
+    ?>
+    </table>
+    <br />
+    
+    <?php
+    
+    echo Display::page_subheader(get_lang('UserList').$url);
+    
+    ?>
+    
+    <!--List of users -->
+    
+    <table class="data_table">
+        <tr>
+            <th>
+                <?php echo get_lang('User'); ?>
+            </th>
+            <th>
+                <?php echo get_lang('Actions'); ?>
+            </th>
+        </tr>
+    <?php
+    
+    if ($session['nbr_users']==0) {
+    	echo '<tr>
+    			<td colspan="2">'.get_lang('NoUsersForThisSession').'</td>
+    		</tr>';
+    } else {
+    	$order_clause = api_sort_by_first_name() ? ' ORDER BY firstname, lastname' : ' ORDER BY lastname, firstname';
+    
+        if ($multiple_url_is_on) {
+            $sql = "SELECT u.user_id, lastname, firstname, username, access_url_id
+                    FROM $tbl_user u
+                    INNER JOIN $tbl_session_rel_user su
+                    ON u.user_id = su.id_user AND su.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    LEFT OUTER JOIN $table_access_url_user uu ON (uu.user_id = u.user_id)
+                    WHERE su.id_session = $id_session AND (access_url_id = $url_id OR access_url_id is null )
+                    $order_clause";
+        } else {
+            $sql = "SELECT u.user_id, lastname, firstname, username
+                    FROM $tbl_user u
+                    INNER JOIN $tbl_session_rel_user su
+                    ON u.user_id = su.id_user AND su.relation_type<>".SESSION_RELATION_TYPE_RRHH."
+                    AND su.id_session = ".$id_session.$order_clause;
+        }
+    
+    	$result = Database::query($sql);
+    	$users  = Database::store_result($result);
+    	$orig_param = '&origin=resume_session&id_session='.$id_session; // change breadcrumb in destination page
+    	foreach ($users as $user){
+            $user_link = '';
+            if (!empty($user['user_id'])) {
+                $user_link = '<a href="'.api_get_path(WEB_CODE_PATH).'admin/user_information.php?user_id='.intval($user['user_id']).'">'.api_htmlentities(api_get_person_name($user['firstname'], $user['lastname']),ENT_QUOTES,$charset).' ('.$user['username'].')</a>';
+            }
+    
+            $link_to_add_user_in_url = '';
+    
+            if ($multiple_url_is_on) {
+                if ($user['access_url_id'] != $url_id) {
+                    $user_link .= ' '.Display::return_icon('warning.png', get_lang('UserNotAddedInURL'), array(), ICON_SIZE_SMALL);
+                    $add = Display::return_icon('add.png', get_lang('AddUsersToURL'), array(), ICON_SIZE_SMALL);
+                    $link_to_add_user_in_url = '<a href="resume_session.php?action=add_user_to_url&id_session='.$id_session.'&user_id='.$user['user_id'].'">'.$add.'</a>';
+                }
+            }
+    		echo '<tr>
+                    <td width="90%">
+                        '.$user_link.'
+                    </td>
+                    <td>
+                        <a href="../mySpace/myStudents.php?student='.$user['user_id'].''.$orig_param.'">'.Display::return_icon('statistics.gif', get_lang('Reporting')).'</a>&nbsp;
+                        <a href="session_course_user.php?id_user='.$user['user_id'].'&id_session='.$id_session.'">'.Display::return_icon('course.gif', get_lang('BlockCoursesForThisUser')).'</a>&nbsp;
+                        <a href="'.api_get_self().'?id_session='.$id_session.'&action=delete&user='.$user['user_id'].'" onclick="javascript:if(!confirm(\''.get_lang('ConfirmYourChoice').'\')) return false;">'.Display::return_icon('delete.png', get_lang('Delete')).'</a>
+                        '.$link_to_add_user_in_url.'
+                    </td>
+                    </tr>';
+    	}
+    }
+    ?>
+    </table>
+<?php
+} else {
+    api_not_allowed();
+}
+// footer
+Display :: display_footer();

+ 158 - 0
main/user/session_list.php

@@ -0,0 +1,158 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+ * List sessions in an efficient and usable way
+ * @package chamilo.admin
+ */
+/**
+ * Code
+ */
+$language_file = 'admin';
+$cidReset = true;
+
+require_once '../inc/global.inc.php';
+$this_section = SECTION_PLATFORM_ADMIN;
+
+api_protect_teacher_script(true);
+
+//Add the JS needed to use the jqgrid
+$htmlHeadXtra[] = api_get_jqgrid_js();
+
+$action = $_REQUEST['action'];
+$idChecked = $_REQUEST['idChecked'];
+
+$tool_name = get_lang('SessionList');
+Display::display_header($tool_name);
+
+if($_configuration['allow_tutors_to_assign_students_to_session'] == 'true') {
+
+    $error_message = ''; // Avoid conflict with the global variable $error_msg (array type) in add_course.conf.php.
+    if (isset($_GET['action']) && $_GET['action'] == 'show_message') {
+        $error_message = Security::remove_XSS($_GET['message']);
+    }
+    
+    if (!empty($error_message)) {
+        Display::display_normal_message($error_message, false);
+    }
+    
+    //jqgrid will use this URL to do the selects
+    $url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&from_course_session=1';
+    if (isset($_REQUEST['keyword'])) {
+        //Begin with see the searchOper param
+        $url = api_get_path(WEB_AJAX_PATH).'model.ajax.php?a=get_sessions&from_course_session=1&_search=true&rows=20&page=1&sidx=&sord=asc&filters=&searchField=name&searchString='.Security::remove_XSS($_REQUEST['keyword']).'&searchOper=bw';
+    }
+    
+    //The order is important you need to check the the $column variable in the model.ajax.php file
+    $columns        = array(get_lang('Name'), get_lang('NumberOfCourses'), get_lang('NumberOfUsers'), get_lang('SessionCategoryName'),
+                            get_lang('StartDate'), get_lang('EndDate'), get_lang('Coach'),  get_lang('Status'), get_lang('Visibility'), get_lang('Actions'));
+    
+    //$activeurl = '?sidx=session_active';
+    //Column config
+    $column_model   = array(
+        array('name'=>'name',           'index'=>'name',          'width'=>'160',  'align'=>'left', 'search' => 'true', 'wrap_cell' => "true"),
+        array('name'=>'nbr_courses',    'index'=>'nbr_courses',   'width'=>'30',   'align'=>'left', 'search' => 'true'),
+        array('name'=>'nbr_users',      'index'=>'nbr_users',     'width'=>'30',   'align'=>'left', 'search' => 'true'),
+        array('name'=>'category_name',  'index'=>'category_name', 'width'=>'70',   'align'=>'left', 'search' => 'true'),
+        array('name'=>'date_start',     'index'=>'date_start',    'width'=>'40',   'align'=>'left', 'search' => 'true'),
+        array('name'=>'date_end',       'index'=>'date_end',      'width'=>'40',   'align'=>'left', 'search' => 'true'),
+        array('name'=>'coach_name',     'index'=>'coach_name',    'width'=>'80',   'align'=>'left', 'search' => 'false'),
+        array('name'=>'status',         'index'=>'session_active','width'=>'40',   'align'=>'left', 'search' => 'true', 'stype'=>'select',
+          //for the bottom bar
+          'searchoptions' => array(
+                            'defaultValue'  => '1',
+                            'value'         => '1:'.get_lang('Active').';0:'.get_lang('Inactive')),
+          //for the top bar
+          'editoptions' => array('value' => ':'.get_lang('All').';1:'.get_lang('Active').';0:'.get_lang('Inactive'))),
+        array('name'=>'visibility',     'index'=>'visibility',      'width'=>'40',   'align'=>'left', 'search' => 'false'),
+        array('name'=>'actions',        'index'=>'actions',         'width'=>'100',  'align'=>'left','formatter'=>'action_formatter','sortable'=>'false', 'search' => 'false')
+    );
+    //Autowidth
+    $extra_params['autowidth'] = 'true';
+    
+    //height auto
+    $extra_params['height'] = 'auto';
+    //$extra_params['excel'] = 'excel';
+    //$extra_params['rowList'] = array(10, 20 ,30);
+    
+    //With this function we can add actions to the jgrid (edit, delete, etc)
+    $action_links = 'function action_formatter(cellvalue, options, rowObject) {
+         return \'&nbsp;<a href="add_users_to_session.php?page=session_list.php&id_session=\'+options.rowId+\'">'.Display::return_icon('user_subscribe_session.png',get_lang('SubscribeUsersToSession'),'',ICON_SIZE_SMALL).'</a>'.
+         '\';
+    }';
+    ?>
+    <script>
+    
+        function setSearchSelect(columnName) {
+        $("#sessions").jqGrid('setColProp', columnName,
+        {
+           searchoptions:{
+                dataInit:function(el){
+                    $("option[value='2']",el).attr("selected", "selected");
+                    setTimeout(function(){
+                        $(el).trigger('change');
+                    },1000);
+                }
+            }
+        });
+    }
+    
+    
+    $(function() {
+        <?php
+            echo Display::grid_js('sessions', $url,$columns,$column_model,$extra_params, array(), $action_links,true);
+        ?>
+    
+        setSearchSelect("status");
+    
+        $("#sessions").jqGrid('navGrid','#sessions_pager', {edit:false,add:false,del:false},
+            {height:280,reloadAfterSubmit:false}, // edit options
+            {height:280,reloadAfterSubmit:false}, // add options
+            {reloadAfterSubmit:false}, // del options
+            {width:500} // search options
+        );
+        /*
+        // add custom button to export the data to excel
+        jQuery("#sessions").jqGrid('navButtonAdd','#sessions_pager',{
+               caption:"",
+               onClickButton : function () {
+                   jQuery("#sessions").excelExport();
+               }
+        });
+    
+        jQuery('#sessions').jqGrid('navButtonAdd','#sessions_pager',{id:'pager_csv',caption:'',title:'Export To CSV',onClickButton : function(e)
+        {
+            try {
+                jQuery("#sessions").jqGrid('excelExport',{tag:'csv', url:'grid.php'});
+            } catch (e) {
+                window.location= 'grid.php?oper=csv';
+            }
+        },buttonicon:'ui-icon-document'})
+        */
+    
+    
+        //Adding search options
+        var options = {
+            'stringResult': true,
+            'autosearch' : true,
+            'searchOnEnter':false
+        }
+        jQuery("#sessions").jqGrid('filterToolbar',options);
+        var sgrid = $("#sessions")[0];
+        sgrid.triggerToolbar();
+    });
+    </script>
+    <?php if (api_is_platform_admin()) {?>
+        <div class="actions">
+        <?php
+        echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/session_add.php">'.Display::return_icon('new_session.png',get_lang('AddSession'),'',ICON_SIZE_MEDIUM).'</a>';
+        echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/add_many_session_to_category.php">'.Display::return_icon('session_to_category.png',get_lang('AddSessionsInCategories'),'',ICON_SIZE_MEDIUM).'</a>';
+        echo '<a href="'.api_get_path(WEB_CODE_PATH).'admin/session_category_list.php">'.Display::return_icon('folder.png',get_lang('ListSessionCategory'),'',ICON_SIZE_MEDIUM).'</a>';
+        echo '</div>';
+    }
+} else {
+    api_not_allowed();
+}    
+echo Display::grid_html('sessions');
+Display::display_footer();
+
+

+ 6 - 1
main/user/user.php

@@ -383,7 +383,12 @@ if ( api_is_allowed_to_edit(null, true)) {
     if (api_get_setting('allow_user_course_subscription_by_course_admin') == 'true' or api_is_platform_admin()) {
         $actions .= ' <a class="btn" href="class.php?'.api_get_cidreq().'">'.get_lang('Classes').'</a>';
     }
-
+    
+    if (api_is_allowed_to_edit() && $_configuration['allow_tutors_to_assign_students_to_session'] == 'true') {
+        $actions .= ' <a class="btn" href="session_list.php?'.api_get_cidreq().'">'.get_lang('Sessions').'</a>';
+    }
+    //$actions .= ' <a class="btn" href="social_groups.php?'.api_get_cidreq().'">'.get_lang('SocialGroups').'</a>';
+		
 	// Build search-form
 	$form = new FormValidator('search_user', 'get', '', '', null, false);
 	$renderer = $form->defaultRenderer();