Browse Source

Adding multiple URL support for classes (user group) new DB table added "access_url_rel_usergroup" if table does not exists everthing works as usual. Option disabled for BC. see BT#6915

Julio Montoya 11 years ago
parent
commit
5cfe24fc4d

+ 128 - 0
main/admin/access_url_add_usergroup_to_url.php

@@ -0,0 +1,128 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+*	This script allows platform admins to add users to urls.
+*	It displays a list of users and a list of courses;
+*	you can select multiple users and courses and then click on
+*	@package chamilo.admin
+*	@author Julio Montoya <gugli100@gmail.com>
+*/
+
+// name of the language file that needs to be included
+$language_file = 'admin';
+$cidReset = true;
+require_once '../inc/global.inc.php';
+require_once api_get_path(LIBRARY_PATH).'urlmanager.lib.php';
+require_once api_get_path(LIBRARY_PATH).'usergroup.lib.php';
+$this_section = SECTION_PLATFORM_ADMIN;
+
+api_protect_global_admin_script();
+if (!api_get_multiple_access_url()) {
+    header('Location: index.php');
+    exit;
+}
+
+$userGroup = new UserGroup();
+
+$form_sent = 0;
+$firstLetterUserGroup = null;
+$courses = array();
+$url_list = array();
+
+$tbl_access_url_rel_course 	= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
+$tbl_access_url 			= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
+$tbl_user 					= Database :: get_main_table(TABLE_MAIN_USER);
+$tbl_course					= Database :: get_main_table(TABLE_MAIN_COURSE);
+
+$tool_name = get_lang('AddUserGroupToURL');
+$interbreadcrumb[] = array ('url' => 'index.php', 'name' => get_lang('PlatformAdmin'));
+$interbreadcrumb[] = array ('url' => 'access_urls.php', 'name' => get_lang('MultipleAccessURLs'));
+
+Display::display_header($tool_name);
+
+echo '<div class="actions">';
+echo Display::url(
+    Display::return_icon('edit.png', get_lang('EditUserGroupToURL'), ''),
+    api_get_path(WEB_CODE_PATH).'admin/access_url_edit_usergroup_to_url.php'
+);
+echo '</div>';
+
+api_display_tool_title($tool_name);
+
+if (isset($_POST['form_sent']) && $_POST['form_sent']) {
+    $form_sent = $_POST['form_sent'];
+    $userGroups = is_array($_POST['user_group_list']) ? $_POST['user_group_list'] : array() ;
+    $urlList = is_array($_POST['url_list']) ? $_POST['url_list'] : array() ;
+    $firstLetterUserGroup = $_POST['first_letter_user_group'];
+
+    if ($form_sent == 1) {
+        if (count($userGroups) == 0 || count($urlList) == 0) {
+            Display :: display_error_message(get_lang('AtLeastOneUserGroupAndOneURL'));
+        } else {
+            UrlManager::addUserGroupListToUrl($userGroups, $urlList);
+            Display::display_confirmation_message(get_lang('UserGroupBelongURL'));
+        }
+    }
+}
+
+$firstLetterUser = null;
+if ($userGroup->getTotalCount() > 1000) {
+    //if there are too much num_courses to gracefully handle with the HTML select list,
+    // assign a default filter on users names
+    $firstLetterUser = 'A';
+}
+
+$dbUserGroups = $userGroup->filterByFirstLetter($firstLetterUserGroup);
+
+$sql = "SELECT id, url FROM $tbl_access_url  WHERE active = 1 ORDER BY url";
+$result = Database::query($sql);
+$db_urls = Database::store_result($result);
+?>
+
+<form name="formulaire" method="post" action="<?php echo api_get_self(); ?>" style="margin:0px;">
+    <input type="hidden" name="form_sent" value="1"/>
+    <table border="0" cellpadding="5" cellspacing="0" width="100%">
+    <tr>
+        <td width="40%" align="center">
+            <b><?php echo get_lang('UserGroupList'); ?></b>
+            <br/><br/>
+             <?php echo get_lang('FirstLetter'); ?> :
+             <select name="first_letter_user_group" onchange="javascript:document.formulaire.form_sent.value='2'; document.formulaire.submit();">
+                <option value="">--</option>
+                  <?php
+                    echo Display::get_alphabet_options($firstLetterUserGroup);
+                    echo Display::get_numeric_options(0, 9, $firstLetterUserGroup);
+                  ?>
+            </select>
+        </td>
+        <td width="20%">&nbsp;</td>
+        <td width="40%" align="center">
+            <b><?php echo get_lang('URLList'); ?> :</b>
+        </td>
+   </tr>
+   <tr>
+        <td width="40%" align="center">
+        <select name="user_group_list[]" multiple="multiple" size="20" style="width:400px;">
+		<?php foreach ($dbUserGroups as $item) { ?>
+			<option value="<?php echo $item['id']; ?>" <?php if (in_array($item['id'], $courses)) echo 'selected="selected"'; ?>><?php echo $item['name']; ?>
+            </option>
+        <?php } ?>
+    </select>
+   </td>
+   <td width="20%" valign="middle" align="center">
+    <button type="submit" class="add"> <?php echo get_lang('AddUserGroupToThatURL'); ?> </button>
+   </td>
+   <td width="40%" align="center">
+    <select name="url_list[]" multiple="multiple" size="20" style="width:300px;">
+		<?php foreach ($db_urls as $url_obj) { ?>
+        <option value="<?php echo $url_obj['id']; ?>" <?php if (in_array($url_obj['id'], $url_list)) echo 'selected="selected"'; ?>><?php echo $url_obj['url']; ?>
+        </option>
+		<?php } ?>
+    </select>
+   </td>
+  </tr>
+ </table>
+</form>
+<?php
+
+Display :: display_footer();

+ 1 - 1
main/admin/access_url_add_users_to_url.php

@@ -58,7 +58,7 @@ if ($_POST['form_sent']) {
 	}
 
 	if ($form_sent == 1) {
-		if ( count($users) == 0 || count($url_list) == 0) {
+		if (count($users) == 0 || count($url_list) == 0) {
 			Display :: display_error_message(get_lang('AtLeastOneUserAndOneURL'));
 		} else {
 			UrlManager::add_users_to_urls($users,$url_list);

+ 351 - 0
main/admin/access_url_edit_usergroup_to_url.php

@@ -0,0 +1,351 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+*	@package chamilo.admin
+*	@author Julio Montoya <gugli100@gmail.com>
+*/
+
+// name of the language file that needs to be included
+$language_file = 'admin';
+
+// resetting the course id
+$cidReset = true;
+
+require_once '../inc/global.inc.php';
+require_once api_get_path(LIBRARY_PATH).'urlmanager.lib.php';
+require_once api_get_path(LIBRARY_PATH).'usergroup.lib.php';
+require_once api_get_path(LIBRARY_PATH).'xajax/xajax.inc.php';
+
+$xajax = new xajax();
+$xajax->registerFunction(array('searchUserGroupAjax', 'UserGroup', 'searchUserGroupAjax'));
+$userGroup = new UserGroup();
+
+// Setting the section (for the tabs)
+$this_section = SECTION_PLATFORM_ADMIN;
+
+// Access restrictions
+api_protect_global_admin_script();
+if (!api_get_multiple_access_url()) {
+    header('Location: index.php');
+    exit;
+}
+
+// Database Table Definitions
+$tbl_access_url_rel_course = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
+$tbl_course 			 = Database::get_main_table(TABLE_MAIN_COURSE);
+$tbl_access_url 		 = Database::get_main_table(TABLE_MAIN_ACCESS_URL);
+
+// setting breadcrumbs
+$tool_name = get_lang('EditUserGroupToURL');
+$interbreadcrumb[] = array ('url' => 'index.php', 'name' => get_lang('PlatformAdmin'));
+$interbreadcrumb[] = array ('url' => 'access_urls.php', 'name' => get_lang('MultipleAccessURLs'));
+
+$add_type = 'multiple';
+if (isset($_REQUEST['add_type']) && $_REQUEST['add_type'] != '') {
+    $add_type = Security::remove_XSS($_REQUEST['add_type']);
+}
+
+$access_url_id = 1;
+if (isset($_REQUEST['access_url_id']) && $_REQUEST['access_url_id'] != '') {
+    $access_url_id = Security::remove_XSS($_REQUEST['access_url_id']);
+}
+
+$xajax->processRequests();
+$htmlHeadXtra[] = $xajax->getJavascript('../inc/lib/xajax/');
+$htmlHeadXtra[] = '
+<script>
+function add_user_to_url(code, content) {
+
+	document.getElementById("course_to_add").value = "";
+	document.getElementById("ajax_list_courses").innerHTML = "";
+
+	destination = document.getElementById("destination_users");
+	destination.options[destination.length] = new Option(content,code);
+
+	destination.selectedIndex = -1;
+	sortOptions(destination.options);
+}
+
+function send() {
+
+	if (document.formulaire.access_url_id.value!=0) {
+		document.formulaire.form_sent.value=0;
+		document.formulaire.add_type.value=\''.$add_type.'\';
+		document.formulaire.submit();
+	}
+}
+
+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;
+		}
+	}
+}
+</script>';
+
+$form_sent=0;
+$errorMsg='';
+$UserList=$SessionList=array();
+$users=$sessions=array();
+
+if (isset($_POST['form_sent']) && $_POST['form_sent']) {
+    $form_sent = $_POST['form_sent'];
+    $course_list = $_POST['course_list'];
+
+    if (!is_array($course_list)) {
+        $course_list = array();
+    }
+
+    if ($form_sent == 1) {
+        if ($access_url_id == 0) {
+            header('Location: access_url_edit_users_to_url.php?action=show_message&message='.get_lang('SelectURL'));
+        } elseif (is_array($course_list)) {
+            UrlManager::update_urls_rel_usergroup($course_list, $access_url_id);
+            header('Location: access_urls.php?action=show_message&message='.get_lang('Updated'));
+        }
+        exit;
+    }
+}
+
+Display::display_header($tool_name);
+
+echo '<div class="actions">';
+echo Display::url(
+    Display::return_icon('view_more_stats.gif', get_lang('AddUserToURL'), ''),
+    api_get_path(WEB_CODE_PATH).'admin/access_url_add_usergroup_to_url.php'
+);
+echo '</div>';
+
+api_display_tool_title($tool_name);
+
+if ($_GET['action'] == 'show_message') {
+    Display :: display_normal_message(Security::remove_XSS(stripslashes($_GET['message'])));
+}
+
+$noUserGroupList = $userGroupList = array();
+$ajax_search = $add_type == 'unique' ? true : false;
+
+if ($ajax_search) {
+    $userGroups = UrlManager::get_url_rel_usergroup_data($access_url_id);
+    foreach ($userGroups as $item) {
+        $userGroupList[$item['id']] = $item;
+    }
+} else {
+	$userGroups = UrlManager::get_url_rel_usergroup_data();
+
+    foreach ($userGroups as $item) {
+        if ($item['access_url_id'] == $access_url_id) {
+            $userGroupList[$item['id']] = $item ;
+        }
+    }
+    $noUserGroupList = $userGroup->getUserGroupNotInList(array_keys($userGroupList));
+}
+
+if ($add_type == 'multiple') {
+	$link_add_type_unique = '<a href="'.api_get_self().'?add_type=unique&access_url_id='.$access_url_id.'">'.get_lang('SessionAddTypeUnique').'</a>';
+	$link_add_type_multiple = get_lang('SessionAddTypeMultiple');
+} else {
+	$link_add_type_unique = get_lang('SessionAddTypeUnique');
+	$link_add_type_multiple = '<a href="'.api_get_self().'?add_type=multiple&access_url_id='.$access_url_id.'">'.get_lang('SessionAddTypeMultiple').'</a>';
+}
+
+$url_list = UrlManager::get_url_data();
+?>
+<div style="text-align: left;">
+	<?php echo $link_add_type_unique ?>&nbsp;|&nbsp;<?php echo $link_add_type_multiple ?>
+</div>
+<br /><br />
+<form
+    name="formulaire"
+    method="post"
+    action="<?php echo api_get_self(); ?>"
+    style="margin:0px;" <?php if ($ajax_search){ echo ' onsubmit="valide();"'; } ?>
+>
+<?php echo get_lang('SelectUrl').' : '; ?>
+<select name="access_url_id" onchange="javascript:send();">
+<option value="0">-- <?php echo get_lang('SelectUrl')?> -- </option>
+	<?php
+    $url_selected = '';
+    foreach ($url_list as $url_obj) {
+        $checked = '';
+        if (!empty($access_url_id)) {
+            if ($url_obj[0] == $access_url_id) {
+                $checked = 'selected=true';
+                $url_selected=$url_obj[1];
+            }
+        }
+        if ($url_obj['active']==1) { ?>
+            <option <?php echo $checked;?> value="<?php echo $url_obj[0]; ?>"> <?php echo $url_obj[1]; ?>
+            </option>
+        <?php
+        }
+    }
+?>
+</select>
+<br /><br />
+<input type="hidden" name="form_sent" value="1" />
+<input type="hidden" name="add_type" value = "<?php echo $add_type ?>" />
+
+<?php
+if (!empty($errorMsg)) {
+    Display::display_normal_message($errorMsg); //main API
+}
+?>
+
+<table border="0" cellpadding="5" cellspacing="0" width="100%">
+<!-- Users -->
+<tr>
+  <td align="center"><b><?php echo get_lang('UserGroupListInPlatform') ?> :</b>
+  </td>
+  <td></td>
+  <td align="center"><b><?php echo get_lang('UserGroupListIn').' '.$url_selected; ?></b></td>
+</tr>
+
+<tr>
+  <td align="center">
+  <div id="content_source">
+    <?php if ($ajax_search) { ?>
+		<input type="text" id="course_to_add" onkeyup="xajax_searchUserGroupAjax(this.value,document.formulaire.access_url_id.options[document.formulaire.access_url_id.selectedIndex].value)" />
+		<div id="ajax_list_courses"></div>
+    <?php } else { ?>
+	  <select id="origin_users" name="no_course_list[]" multiple="multiple" size="15" style="width:380px;">
+		<?php
+		foreach ($noUserGroupList as $noItem) {
+		?>
+			<option value="<?php echo $noItem['id']; ?>">
+                <?php echo $noItem['name']; ?>
+            </option>
+		<?php
+		}
+		?>
+	  </select>
+	<?php
+  	  }
+  	 ?>
+  </div>
+  </td>
+  <td width="10%" valign="middle" 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'))" ></button>
+	<br /><br />
+	<button class="arrowl" type="button" onclick="moveItem(document.getElementById('destination_users'), document.getElementById('origin_users'))" ></button>
+	<?php
+  }
+  ?>
+	<br /><br /><br /><br /><br /><br />
+  </td>
+  <td align="center">
+  <select id="destination_users" name="course_list[]" multiple="multiple" size="15" style="width:380px;">
+<?php
+foreach($userGroupList as $item) {
+?>
+	<option value="<?php echo $item['id']; ?>">
+        <?php echo $item['name']; ?>
+    </option>
+<?php
+}
+?>
+  </select>
+  </td>
+</tr>
+<tr>
+	<td colspan="3" align="center">
+		<br />
+		<?php
+		if(isset($_GET['add']))
+			echo '<button class="save" onclick="valide()" >'.get_lang('AddUserGroupToURL').'</button>';
+		else
+			echo '<button class="save" onclick="valide()" >'.get_lang('EditUserGroupToURL').'</button>';
+		?>
+	</td>
+</tr>
+</table>
+</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;
+		}
+	}
+}
+
+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
+Display::display_footer();

+ 64 - 60
main/admin/access_urls.php

@@ -24,6 +24,7 @@ $tool_name = get_lang('MultipleAccessURLs');
 Display :: display_header($tool_name);
 
 require_once api_get_path(LIBRARY_PATH).'urlmanager.lib.php';
+require_once api_get_path(LIBRARY_PATH).'usergroup.lib.php';
 
 $my_user_url_list = api_get_access_url_from_user(api_get_user_id());
 $current_access_url_id = api_get_current_access_url_id();
@@ -31,49 +32,49 @@ $url_list = UrlManager::get_url_data();
 
 // Actions
 if (isset ($_GET['action'])) {
-	if ($_GET['action'] == 'show_message')
-		Display :: display_normal_message(Security::remove_XSS(stripslashes($_GET['message'])));
-
-	$check = Security::check_token('get');
-	if ($check) {
-		$url_id=Database::escape_string($_GET['url_id']);
-
-		switch ($_GET['action']) {
-			case 'delete_url' :
-				$result = UrlManager::delete($url_id);
-				if ($result) {
-					Display :: display_normal_message(get_lang('URLDeleted'));
-				} else {
-					Display :: display_error_message(get_lang('CannotDeleteURL'));
-				}
-				break;
-			case 'lock' :
-				UrlManager::set_url_status('lock',$url_id);
-				Display :: display_normal_message(get_lang('URLInactive'));
-				break;
-			case 'unlock';
-				UrlManager::set_url_status('unlock',$url_id);
-				Display :: display_normal_message(get_lang('URLActive'));
-				break;
-			case 'register';
-				// we are going to register the admin
-				if(api_is_platform_admin()) {
-					if($current_access_url_id!=-1) {
-						$url_str = '';
-						foreach($url_list as $my_url) {
-							if (!in_array($my_url['id'],$my_user_url_list)){
-								UrlManager::add_user_to_url(api_get_user_id(),$my_url['id']);
-									$url_str.=$my_url['url'].' <br />';
-							}
-						}
-						Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'<br />',false);
-					}
-				}
-				break;
-			}
-
-		}
-		Security::clear_token();
+    if ($_GET['action'] == 'show_message') {
+        Display :: display_normal_message(Security::remove_XSS(stripslashes($_GET['message'])));
+    }
+
+    $check = Security::check_token('get');
+    if ($check) {
+		$url_id = Database::escape_string($_GET['url_id']);
+
+        switch ($_GET['action']) {
+            case 'delete_url':
+                $result = UrlManager::delete($url_id);
+                if ($result) {
+                    Display :: display_normal_message(get_lang('URLDeleted'));
+                } else {
+                    Display :: display_error_message(get_lang('CannotDeleteURL'));
+                }
+                break;
+            case 'lock':
+                UrlManager::set_url_status('lock', $url_id);
+                Display::display_normal_message(get_lang('URLInactive'));
+                break;
+            case 'unlock':
+                UrlManager::set_url_status('unlock', $url_id);
+                Display::display_normal_message(get_lang('URLActive'));
+                break;
+            case 'register':
+                // we are going to register the admin
+                if (api_is_platform_admin()) {
+                    if ($current_access_url_id!=-1) {
+                        $url_str = '';
+                        foreach ($url_list as $my_url) {
+                            if (!in_array($my_url['id'], $my_user_url_list)) {
+                                UrlManager::add_user_to_url(api_get_user_id(), $my_url['id']);
+                                $url_str.=$my_url['url'].' <br />';
+                            }
+                        }
+                        Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'<br />',false);
+                    }
+                }
+                break;
+        }
+    }
+    Security::clear_token();
 }
 
 $parameters['sec_token'] = Security::get_token();
@@ -82,10 +83,10 @@ $parameters['sec_token'] = Security::get_token();
 
 $url_string='';
 $my_user_url_list = api_get_access_url_from_user(api_get_user_id());
-foreach($url_list as $my_url) {
-	if (!in_array($my_url['id'],$my_user_url_list)){
-		$url_string.=$my_url['url'].' <br />';
-	}
+foreach ($url_list as $my_url) {
+    if (!in_array($my_url['id'], $my_user_url_list)){
+        $url_string.=$my_url['url'].' <br />';
+    }
 }
 if(!empty($url_string)) {
 	Display :: display_warning_message(get_lang('AdminShouldBeRegisterInSite').'<br />'.$url_string,false);
@@ -93,12 +94,12 @@ if(!empty($url_string)) {
 
 // checking the current installation
 if ($current_access_url_id==-1) {
-	Display :: display_warning_message(get_lang('URLNotConfiguredPleaseChangedTo').': '.api_get_path(WEB_PATH));
+	Display::display_warning_message(get_lang('URLNotConfiguredPleaseChangedTo').': '.api_get_path(WEB_PATH));
 } elseif(api_is_platform_admin()) {
-	$quant= UrlManager::relation_url_user_exist(api_get_user_id(),$current_access_url_id);
-	if ($quant==0) {
-		Display :: display_warning_message('<a href="'.api_get_self().'?action=register&sec_token='.$parameters['sec_token'].'">'.get_lang('ClickToRegisterAdmin').'</a>',false);
-	}
+    $quant= UrlManager::relation_url_user_exist(api_get_user_id(),$current_access_url_id);
+    if ($quant==0) {
+        Display :: display_warning_message('<a href="'.api_get_self().'?action=register&sec_token='.$parameters['sec_token'].'">'.get_lang('ClickToRegisterAdmin').'</a>',false);
+    }
 }
 
 // action menu
@@ -106,17 +107,21 @@ echo '<div class="actions">';
 echo Display::url(Display::return_icon('new_link.png',  get_lang('AddUrl'), array(), ICON_SIZE_MEDIUM),          api_get_path(WEB_CODE_PATH).'admin/access_url_edit.php');
 echo Display::url(Display::return_icon('user.png',      get_lang('ManageUsers'), array(), ICON_SIZE_MEDIUM),     api_get_path(WEB_CODE_PATH).'admin/access_url_edit_users_to_url.php');
 echo Display::url(Display::return_icon('course.png',    get_lang('ManageCourses'), array(), ICON_SIZE_MEDIUM),   api_get_path(WEB_CODE_PATH).'admin/access_url_edit_courses_to_url.php');
-//echo Display::url(Display::return_icon('session.png',   get_lang('ManageSessions'), array(), ICON_SIZE_MEDIUM),          api_get_path(WEB_CODE_PATH).'admin/access_url_edit_sessions_to_url.php');
+//echo Display::url(Display::return_icon('session.png',   get_lang('ManageSessions'), array(), ICON_SIZE_MEDIUM), api_get_path(WEB_CODE_PATH).'admin/access_url_edit_sessions_to_url.php');
+$userGroup = new Usergroup();
+if ($userGroup->getUseMultipleUrl()) {
+    echo Display::url(Display::return_icon('class.png',   get_lang('ManageUserGroup'), array(), ICON_SIZE_MEDIUM), api_get_path(WEB_CODE_PATH).'admin/access_url_edit_usergroup_to_url.php');
+}
 echo '</div>';
 
 //$table = new SortableTable('urls', 'url_count_mask', 'get_url_data_mask',2);
 $sortable_data = UrlManager::get_url_data();
 $urls = array();
-foreach($sortable_data as $row)  {
+foreach ($sortable_data as $row)  {
     //title
-    $url = Display::url($row['url'], $row['url'], array('target'=>'_blank'));    
+    $url = Display::url($row['url'], $row['url'], array('target'=>'_blank'));
     $description = $row['description'];
-    
+
     //Status
     $active = $row['active'];
     if ($active=='1') {
@@ -132,13 +137,13 @@ foreach($sortable_data as $row)  {
         $status = Display::return_icon($image.'.gif', get_lang(ucfirst($action)));
     } else {
         $status = '<a href="access_urls.php?action='.$action.'&amp;url_id='.$row['id'].'&amp;sec_token='.$_SESSION['sec_token'].'">'.Display::return_icon($image.'.gif', get_lang(ucfirst($action))).'</a>';
-    }    
-    //Actions
+    }
+    // Actions
     $url_id = $row['id'];
     $actions = Display::url(Display::return_icon('edit.png', get_lang('Edit'), array(), ICON_SIZE_SMALL), "access_url_edit.php?url_id=$url_id");
     if ($url_id != '1') {
         $actions .= '<a href="access_urls.php?action=delete_url&amp;url_id='.$url_id.'&amp;sec_token='.$_SESSION['sec_token'].'" onclick="javascript:if(!confirm('."'".addslashes(api_htmlentities(get_lang("ConfirmYourChoice"),ENT_QUOTES,$charset))."'".')) return false;">'.Display::return_icon('delete.png', get_lang('Delete'), array(), ICON_SIZE_SMALL).'</a>';
-    }    
+    }
     $urls[] = array($url, $description, $status, $actions);
 }
 
@@ -152,5 +157,4 @@ $table->set_header(2, get_lang('Active'));
 $table->set_header(3, get_lang('Modify'), false);
 $table->display();
 
-/*		FOOTER	*/
 Display :: display_footer();

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

@@ -493,23 +493,7 @@ switch ($action) {
         break;
     case 'get_usergroups':
         $columns = array('name', 'users', 'courses','sessions','actions');
-        $result     = Database::select('*', $obj->table, array('order'=>"name $sord", 'LIMIT'=> "$start , $limit"));
-        $new_result = array();
-        if (!empty($result)) {
-            foreach ($result as $group) {
-                $group['sessions']   = count($obj->get_sessions_by_usergroup($group['id']));
-                $group['courses']    = count($obj->get_courses_by_usergroup($group['id']));
-                $group['users']      = count($obj->get_users_by_usergroup($group['id']));
-                $new_result[]        = $group;
-            }
-            $result = $new_result;
-        }
-        $columns = array('name', 'users', 'courses','sessions');
-        if(!in_array($sidx, $columns)) {
-            $sidx = 'name';
-        }
-        //Multidimensional sort
-        msort($result, $sidx);
+        $result = $obj->getUsergroupsPagination($sidx, $sord, $start, $limit);
         break;
     case 'get_extra_fields':
         $obj = new ExtraField($type);

+ 1 - 0
main/inc/lib/database.constants.inc.php

@@ -82,6 +82,7 @@ define('TABLE_MAIN_ACCESS_URL', 'access_url');
 define('TABLE_MAIN_ACCESS_URL_REL_USER',    'access_url_rel_user');
 define('TABLE_MAIN_ACCESS_URL_REL_COURSE',  'access_url_rel_course');
 define('TABLE_MAIN_ACCESS_URL_REL_SESSION', 'access_url_rel_session');
+define('TABLE_MAIN_ACCESS_URL_REL_USERGROUP', 'access_url_rel_usergroup');
 
 // Global calendar
 define('TABLE_MAIN_SYSTEM_CALENDAR', 'sys_calendar');

+ 205 - 63
main/inc/lib/urlmanager.lib.php

@@ -7,7 +7,7 @@
 *	@package chamilo.library
 */
 /**
- * @package chamilo.library
+ * Class UrlManager
  */
 class UrlManager
 {
@@ -19,7 +19,6 @@ class UrlManager
 	  * @param	string	The URL of the site
  	  * @param	string  The description of the site
  	  * @param	int		is active or not
-	  * @param  int     the user_id of the owner
 	  * @return boolean if success
 	  */
 	public static function add($url, $description, $active)
@@ -36,47 +35,45 @@ class UrlManager
 		return $result;
 	}
 
-	/**
-	* Updates an URL access
-	* @author Julio Montoya <gugli100@gmail.com>,
-	*
-	* @param	int 	The url id
-	* @param	string  The description of the site
-	* @param	int		is active or not
-	* @param	int     the user_id of the owner
-	* @return 	boolean if success
-	*/
+    /**
+    * Updates an URL access
+    * @author Julio Montoya <gugli100@gmail.com>,
+    *
+    * @param	int 	The url id
+    * @param	string  The description of the site
+    * @param	int		is active or not
+    * @return 	boolean if success
+    */
 	public static function udpate($url_id, $url, $description, $active)
 	{
-		$url_id = intval($url_id);
-		$table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
-		$tms = time();
-		$sql = "UPDATE $table_access_url
+        $url_id = intval($url_id);
+        $table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
+        $tms = time();
+        $sql = "UPDATE $table_access_url
                 SET url 	= '".Database::escape_string($url)."',
                 description = '".Database::escape_string($description)."',
                 active 		= '".Database::escape_string($active)."',
                 created_by 	= '".api_get_user_id()."',
                 tms 		= FROM_UNIXTIME(".$tms.")
                 WHERE id = '$url_id'";
-		$result = Database::query($sql);
-		return $result;
+        $result = Database::query($sql);
+        return $result;
 	}
 
-
-	/**
-	* Deletes an url
-	* @author Julio Montoya
-	* @param int url id
-	* @return boolean true if success
-	* */
+    /**
+    * Deletes an url
+    * @author Julio Montoya
+    * @param int url id
+    * @return boolean true if success
+    * */
 	public static function delete($id)
-	{
-		$id = intval($id);
-		$table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
-		$sql= "DELETE FROM $table_access_url WHERE id = ".$id;
-		$result = Database::query($sql);
-		return $result;
-	}
+    {
+        $id = intval($id);
+        $table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
+        $sql= "DELETE FROM $table_access_url WHERE id = ".$id;
+        $result = Database::query($sql);
+        return $result;
+    }
 
     /**
      * @param string $url
@@ -84,7 +81,7 @@ class UrlManager
      */
     public static function url_exist($url)
 	{
-		$table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
+        $table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
 		$sql = "SELECT id FROM $table_access_url WHERE url = '".Database::escape_string($url)."' ";
 		$res = Database::query($sql);
 		$num = Database::num_rows($res);
@@ -151,7 +148,8 @@ class UrlManager
 		return $row;
 	}
 
-	/** Gets the inner join of users and urls table
+	/**
+     * Gets the inner join of users and urls table
 	 * @author Julio Montoya
 	 * @param int  access url id
      * @param string $order_by
@@ -180,22 +178,22 @@ class UrlManager
 		return $users;
 	}
 
-
     /**
     * Gets the inner join of access_url and the course table
-     *
+    *
     * @author Julio Montoya
     * @param int  access url id
     * @return array   Database::store_result of the result
     **/
-	public static function get_url_rel_course_data($access_url_id='')
+	public static function get_url_rel_course_data($access_url_id = null)
 	{
 		$where ='';
 		$table_url_rel_course	= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
 		$tbl_course 			= Database :: get_main_table(TABLE_MAIN_COURSE);
 
-		if (!empty($access_url_id))
-			$where ="WHERE $table_url_rel_course.access_url_id = ".Database::escape_string($access_url_id);
+		if (!empty($access_url_id)) {
+			$where ="WHERE $table_url_rel_course.access_url_id = ".intval($access_url_id);
+        }
 
 		$sql = "SELECT course_code, title, access_url_id
 				FROM $tbl_course u
@@ -216,14 +214,14 @@ class UrlManager
 	 * @return array   Database::store_result of the result
      *
 	 **/
-	public static function get_url_rel_session_data($access_url_id='')
+	public static function get_url_rel_session_data($access_url_id = null)
 	{
 		$where ='';
 		$table_url_rel_session	= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
 		$tbl_session 			= Database :: get_main_table(TABLE_MAIN_SESSION);
 
 		if (!empty($access_url_id))
-			$where ="WHERE $table_url_rel_session.access_url_id = ".Database::escape_string($access_url_id);
+			$where ="WHERE $table_url_rel_session.access_url_id = ".intval($access_url_id);
 
 		$sql="SELECT id, name, access_url_id
 				FROM $tbl_session u
@@ -237,6 +235,35 @@ class UrlManager
 		return $sessions;
 	}
 
+    /**
+     * Gets the inner join of access_url and the usergroup table
+     *
+     * @author Julio Montoya
+     * @param int  access url id
+     * @return array   Database::store_result of the result
+     **/
+    public static function get_url_rel_usergroup_data($access_url_id = null)
+    {
+        $where = '';
+        $table_url_rel_usergroup = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+        $table_user_group = Database::get_main_table(TABLE_USERGROUP);
+
+        if (!empty($access_url_id)) {
+            $where ="WHERE $table_url_rel_usergroup.access_url_id = ".intval($access_url_id);
+        }
+
+        $sql = "SELECT id, name, access_url_id
+				FROM $table_user_group u
+				INNER JOIN $table_url_rel_usergroup
+				ON $table_url_rel_usergroup.usergroup_id = u.id
+				$where
+				ORDER BY name";
+
+        $result = Database::query($sql);
+        $courses = Database::store_result($result);
+        return $courses;
+    }
+
 	/**
 	 * Sets the status of an URL 1 or 0
 	 * @author Julio Montoya
@@ -288,14 +315,33 @@ class UrlManager
 	{
 		$table_url_rel_course= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
 		$sql= "SELECT course_code FROM $table_url_rel_course
-		       WHERE access_url_id = ".Database::escape_string($url_id)." AND course_code = '".Database::escape_string($course_id)."'";
+		       WHERE access_url_id = ".Database::escape_string($url_id)." AND
+		             course_code = '".Database::escape_string($course_id)."'";
 		$result = Database::query($sql);
 		$num = Database::num_rows($result);
 		return $num;
 	}
 
+    /**
+     * Checks the relationship between an URL and a UserGr
+     * oup (return the num_rows)
+     * @author Julio Montoya
+     * @param int $userGroupId
+     * @param int $urlId
+     * @return boolean true if success
+     * */
+    public static function relation_url_usergroup_exist($userGroupId, $urlId)
+    {
+        $table = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+        $sql= "SELECT usergroup_id FROM $table
+		       WHERE access_url_id = ".Database::escape_string($urlId)." AND
+		             usergroup_id = ".Database::escape_string($userGroupId);
+        $result = Database::query($sql);
+        $num = Database::num_rows($result);
+        return $num;
+    }
 
-	/**
+    /**
 	* Checks the relationship between an URL and a Session (return the num_rows)
 	* @author Julio Montoya
 	* @param int user id
@@ -304,7 +350,7 @@ class UrlManager
 	* */
 	public static function relation_url_session_exist($session_id, $url_id)
     {
-		$table_url_rel_session= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
+		$table_url_rel_session= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
 		$session_id = intval($session_id);
 		$url_id		= intval($url_id);
 		$sql= "SELECT session_id FROM $table_url_rel_session WHERE access_url_id = ".Database::escape_string($url_id)." AND session_id = ".Database::escape_string($session_id);
@@ -313,7 +359,6 @@ class UrlManager
 		return $num;
 	}
 
-
 	/**
 	 * Add a group of users into a group of URLs
 	 * @author Julio Montoya
@@ -323,8 +368,8 @@ class UrlManager
 	 * */
 	public static function add_users_to_urls($user_list, $url_list)
     {
-		$table_url_rel_user= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
-		$result_array=array();
+		$table_url_rel_user = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+		$result_array = array();
 
 		if (is_array($user_list) && is_array($url_list)){
 			foreach ($url_list as $url_id) {
@@ -334,10 +379,11 @@ class UrlManager
 						$sql = "INSERT INTO $table_url_rel_user
 		               			SET user_id = ".Database::escape_string($user_id).", access_url_id = ".Database::escape_string($url_id);
 						$result = Database::query($sql);
-						if($result)
-							$result_array[$url_id][$user_id]=1;
-						else
+						if ($result) {
+                            $result_array[$url_id][$user_id]=1;
+                        } else {
 							$result_array[$url_id][$user_id]=0;
+                        }
 					}
 				}
 			}
@@ -377,11 +423,58 @@ class UrlManager
 		return 	$result_array;
 	}
 
+    /**
+     * Add a group of user group into a group of URLs
+     * @author Julio Montoya
+     * @param  array of course ids
+     * @param  array of url_ids
+     * @return array
+     **/
+    public static function addUserGroupListToUrl($userGroupList, $urlList)
+    {
+        $resultArray = array();
+        if (is_array($userGroupList) && is_array($urlList)) {
+            foreach ($urlList as $urlId) {
+                foreach ($userGroupList as $userGroupId) {
+                    $count = UrlManager::relation_url_usergroup_exist($userGroupId, $urlId);
+                    if ($count == 0) {
+                        $result = self::addUserGroupToUrl($userGroupId, $urlId);
+                        if ($result) {
+                            $resultArray[$urlId][$userGroupId] = 1;
+                        } else {
+                            $resultArray[$urlId][$userGroupId] = 0;
+                        }
+                    }
+                }
+            }
+        }
+
+        return 	$resultArray;
+    }
+
+    /**
+     * @param int $userGroupId
+     * @param int $urlId
+     * @return int
+     */
+    public static function addUserGroupToUrl($userGroupId, $urlId)
+    {
+        $urlRelUserGroupTable = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+        $sql = "INSERT INTO $urlRelUserGroupTable
+                SET
+                usergroup_id = '".intval($userGroupId)."',
+                access_url_id = ".intval($urlId);
+        Database::query($sql);
+        return Database::insert_id();
+    }
+
+
 	/**
 	 * Add a group of sessions into a group of URLs
 	 * @author Julio Montoya
 	 * @param  array of session ids
 	 * @param  array of url_ids
+     * @return array
 	 * */
 	public static function add_sessions_to_urls($session_list,$url_list)
 	{
@@ -417,7 +510,7 @@ class UrlManager
 	 * */
 	public static function add_user_to_url($user_id, $url_id = 1)
     {
-		$table_url_rel_user= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
+		$table_url_rel_user = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER);
 		if (empty($url_id)) $url_id = 1;
 		$count = UrlManager::relation_url_user_exist($user_id,$url_id);
         $result = true;
@@ -435,8 +528,10 @@ class UrlManager
      */
     public static function add_course_to_url($course_code, $url_id=1)
 	{
-		$table_url_rel_course= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
-		if (empty($url_id)) $url_id=1;
+		$table_url_rel_course= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
+		if (empty($url_id)) {
+            $url_id = 1;
+        }
 		$count = UrlManager::relation_url_course_exist($course_code,$url_id);
 		if (empty($count)) {
 			$sql = "INSERT INTO $table_url_rel_course
@@ -470,7 +565,6 @@ class UrlManager
 		return $result;
 	}
 
-
 	/**
 	* Deletes an url and user relationship
 	* @author Julio Montoya
@@ -505,7 +599,25 @@ class UrlManager
 		return $result;
 	}
 
-	/**
+    /**
+     * Deletes an url and $userGroup relationship
+     * @author Julio Montoya
+     * @param  int $userGroupId
+     * @param  int $urlId
+     * @return boolean true if success
+     * */
+    public static function delete_url_rel_usergroup($userGroupId, $urlId)
+    {
+        $table = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+        $sql= "DELETE FROM $table
+               WHERE usergroup_id = '".intval($userGroupId)."' AND
+                     access_url_id=".intval($urlId)."  ";
+        $result = Database::query($sql);
+        return $result;
+    }
+
+
+    /**
 	* Deletes an url and session relationship
 	* @author Julio Montoya
 	* @param  char  course code
@@ -521,7 +633,6 @@ class UrlManager
 		return $result;
 	}
 
-
 	/**
 	 * Updates the access_url_rel_user table  with a given user list
 	 * @author Julio Montoya
@@ -568,7 +679,6 @@ class UrlManager
         return array('users_added' => $users_added, 'users_deleted' => $users_deleted);
 	}
 
-
 	/**
 	 * Updates the access_url_rel_course table  with a given user list
 	 * @author Julio Montoya
@@ -577,7 +687,6 @@ class UrlManager
 	 * */
 	public static function update_urls_rel_course($course_list,$access_url_id)
     {
-		$table_course			= Database :: get_main_table(TABLE_MAIN_COURSE);
 		$table_url_rel_course	= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_COURSE);
 
 		$sql = "SELECT course_code FROM $table_url_rel_course WHERE access_url_id=".intval($access_url_id);
@@ -607,6 +716,39 @@ class UrlManager
 		}
 	}
 
+    /**
+     * Updates the access_url_rel_course table  with a given user list
+     * @author Julio Montoya
+     * @param array user list
+     * @param int access_url_id
+     * */
+    public static function update_urls_rel_usergroup($userGroupList, $urlId)
+    {
+        $table = Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+
+        $sql = "SELECT usergroup_id FROM $table WHERE access_url_id = ".intval($urlId);
+        $result = Database::query($sql);
+        $existingItems = array();
+
+        while ($row = Database::fetch_array($result)){
+            $existingItems[] = $row['usergroup_id'];
+        }
+
+        // Adding
+        foreach ($userGroupList as $userGroupId) {
+            if (!in_array($userGroupId, $existingItems)) {
+                UrlManager::addUserGroupToUrl($userGroupId, $urlId);
+            }
+        }
+
+        // Deleting old items
+        foreach ($existingItems as $userGroupId) {
+            if (!in_array($userGroupId, $userGroupList)) {
+                UrlManager::delete_url_rel_usergroup($userGroupId, $urlId);
+            }
+        }
+    }
+
 	/**
 	 * Updates the access_url_rel_session table with a given user list
 	 * @author Julio Montoya
@@ -615,19 +757,18 @@ class UrlManager
 	 * */
 	public static function update_urls_rel_session($session_list,$access_url_id)
     {
-		$table_session	= Database :: get_main_table(TABLE_MAIN_SESSION);
-		$table_url_rel_session	= Database :: get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
+		$table_url_rel_session	= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
 
 		$sql = "SELECT session_id FROM $table_url_rel_session WHERE access_url_id=".Database::escape_string($access_url_id);
 		$result = Database::query($sql);
 		$existing_sessions = array();
 
-		while($row = Database::fetch_array($result)){
+		while ($row = Database::fetch_array($result)){
 			$existing_sessions[] = $row['session_id'];
 		}
 
 		// Adding users
-		foreach($session_list as $session) {
+		foreach ($session_list as $session) {
 			if(!in_array($session, $existing_sessions)) {
 				if (!empty($session) && !empty($access_url_id)) {
 					UrlManager::add_session_to_url($session, $access_url_id);
@@ -681,7 +822,8 @@ class UrlManager
      * @param string $url
      * @return bool|mixed|null
      */
-    public static function get_url_id($url) {
+    public static function get_url_id($url)
+    {
 		$table_access_url= Database :: get_main_table(TABLE_MAIN_ACCESS_URL);
 		$sql = "SELECT id FROM $table_access_url WHERE url = '".Database::escape_string($url)."'";
 		$result = Database::query($sql);

+ 376 - 40
main/inc/lib/usergroup.lib.php

@@ -17,6 +17,7 @@ require_once 'model.lib.php';
 class UserGroup extends Model
 {
     public $columns = array('id', 'name', 'description');
+    public $useMultipleUrl = false;
 
     /**
      * Set ups DB tables
@@ -27,18 +28,54 @@ class UserGroup extends Model
         $this->usergroup_rel_user_table = Database::get_main_table(TABLE_USERGROUP_REL_USER);
         $this->usergroup_rel_course_table = Database::get_main_table(TABLE_USERGROUP_REL_COURSE);
         $this->usergroup_rel_session_table = Database::get_main_table(TABLE_USERGROUP_REL_SESSION);
+        $this->access_url_rel_usergroup = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP);
+
         $this->table_course = Database::get_main_table(TABLE_MAIN_COURSE);
+        global $_configuration;
+        if (isset($_configuration['enable_multiple_support_for_classes'])) {
+            $this->useMultipleUrl = $_configuration['enable_multiple_support_for_classes'];
+        }
     }
 
     /**
-     * @return mixed
+     * @return bool
      */
-    public function get_count()
+    public function getUseMultipleUrl()
+    {
+        return $this->useMultipleUrl;
+    }
+
+    /**
+     * @return int
+     */
+    public function getTotalCount()
     {
         $row = Database::select('count(*) as count', $this->table, array(), 'first');
         return $row['count'];
     }
 
+    /**
+     * @return int
+     */
+    public function get_count()
+    {
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $sql = "SELECT count(u.id) as count FROM ".$this->table." u
+                    INNER JOIN ".$this->access_url_rel_usergroup." a ON (u.id = a.usergroup_id)
+                    WHERE access_url_id = $urlId
+            ";
+            $result = Database::query($sql);
+            if (Database::num_rows($result)) {
+                $row  = Database::fetch_array($result);
+                return $row['count'];
+            }
+            return 0;
+        } else {
+            return $this->getTotalCount();
+        }
+    }
+
     /**
      * @param int $course_id
      *
@@ -46,8 +83,29 @@ class UserGroup extends Model
      */
     public function get_usergroup_by_course_with_data_count($course_id)
     {
-        $row = Database::select('count(*) as count', $this->usergroup_rel_course_table, array('where' => array('course_id = ?' => $course_id)), 'first');
-        return $row['count'];
+        if ($this->useMultipleUrl) {
+            $course_id = intval($course_id);
+            $urlId = api_get_current_access_url_id();
+            $sql = "SELECT count(c.usergroup_id) as count FROM {$this->usergroup_rel_course_table} c
+                    INNER JOIN {$this->access_url_rel_usergroup} a ON (c.usergroup_id = a.usergroup_id)
+                    WHERE access_url_id = $urlId AND course_id = $course_id
+            ";
+            $result = Database::query($sql);
+            if (Database::num_rows($result)) {
+                $row  = Database::fetch_array($result);
+                return $row['count'];
+            }
+            return 0;
+
+        } else {
+            $row = Database::select(
+                'count(*) as count',
+                $this->usergroup_rel_course_table,
+                array('where' => array('course_id = ?' => $course_id)),
+                'first'
+            );
+            return $row['count'];
+        }
     }
 
     /**
@@ -64,27 +122,23 @@ class UserGroup extends Model
     /**
      * Displays the title + grid
      */
-    function display()
+    public function display()
     {
         // action links
         echo '<div class="actions">';
         echo '<a href="../admin/index.php">'.Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('PlatformAdmin'), '', '32').'</a>';
-
         echo '<a href="'.api_get_self().'?action=add">'.Display::return_icon('new_class.png', get_lang('AddClasses'), '', '32').'</a>';
-
         echo Display::url(Display::return_icon('import_csv.png', get_lang('Import'), array(), ICON_SIZE_MEDIUM), 'usergroup_import.php');
         echo Display::url(Display::return_icon('export_csv.png', get_lang('Export'), array(), ICON_SIZE_MEDIUM), 'usergroup_export.php');
-
         echo '</div>';
         echo Display::grid_html('usergroups');
     }
 
     /**
-     *
+     * Get HTML grid
      */
-    function display_teacher_view()
+    public function display_teacher_view()
     {
-        // action links
         echo Display::grid_html('usergroups');
     }
 
@@ -95,7 +149,21 @@ class UserGroup extends Model
      */
     public function get_courses_by_usergroup($id)
     {
-        $results = Database::select('course_id', $this->usergroup_rel_course_table, array('where' => array('usergroup_id = ?' => $id)));
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $from = $this->usergroup_rel_course_table." c
+                    INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = c.usergroup_id) ";
+            $where = array('where' => array('a.usergroup_id = ? AND access_url_id = ? ' => array($id, $urlId)));
+        } else {
+            $from = $this->usergroup_rel_course_table;
+            $where = array('where' => array('usergroup_id = ?' => $id));
+        }
+
+        $results = Database::select(
+            'course_id',
+            $from,
+            $where
+        );
         $array = array();
         if (!empty($results)) {
             foreach ($results as $row) {
@@ -111,14 +179,28 @@ class UserGroup extends Model
      */
     public function get_usergroup_in_course($options = array())
     {
-        $sql = "SELECT u.* FROM {$this->usergroup_rel_course_table} usergroup
-                INNER JOIN  {$this->table} u
-                ON (u.id = usergroup.usergroup_id)
-                INNER JOIN {$this->table_course} c
-                ON (usergroup.course_id = c.id)
-               ";
+        if ($this->useMultipleUrl) {
+            $sql = "SELECT u.* FROM {$this->usergroup_rel_course_table} usergroup
+                    INNER JOIN  {$this->table} u
+                    ON (u.id = usergroup.usergroup_id)
+                    INNER JOIN {$this->table_course} c
+                    ON (usergroup.course_id = c.id)
+                    INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id)
+                   ";
+        } else {
+            $sql = "SELECT u.* FROM {$this->usergroup_rel_course_table} usergroup
+                    INNER JOIN  {$this->table} u
+                    ON (u.id = usergroup.usergroup_id)
+                    INNER JOIN {$this->table_course} c
+                    ON (usergroup.course_id = c.id)
+                   ";
+        }
         $conditions = Database::parse_conditions($options);
         $sql .= $conditions;
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $sql .= " AND access_url_id = $urlId ";
+        }
         $result = Database::query($sql);
         $array = Database::store_result($result, 'ASSOC');
         return $array;
@@ -138,13 +220,33 @@ class UserGroup extends Model
         if (empty($course_id)) {
             return false;
         }
-        $sql = "SELECT DISTINCT u.id, name
-                FROM {$this->table} u
-                LEFT OUTER JOIN {$this->usergroup_rel_course_table} urc
-                ON (u.id = urc.usergroup_id AND course_id = $course_id)
-        ";
+        if ($this->useMultipleUrl) {
+
+            $urlId = api_get_current_access_url_id();
+
+            $sql = "SELECT DISTINCT u.id, name
+                    FROM {$this->table} u
+                    INNER JOIN {$this->access_url_rel_usergroup} a
+                    ON (a.usergroup_id = u.id)
+                    LEFT OUTER JOIN {$this->usergroup_rel_course_table} urc
+                    ON (u.id = urc.usergroup_id AND course_id = $course_id)
+            ";
+
+        } else {
+
+            $sql = "SELECT DISTINCT u.id, name
+                    FROM {$this->table} u
+                    LEFT OUTER JOIN {$this->usergroup_rel_course_table} urc
+                    ON (u.id = urc.usergroup_id AND course_id = $course_id)
+            ";
+        }
         $conditions = Database::parse_conditions($options);
         $sql .= $conditions;
+
+        if ($this->useMultipleUrl) {
+            $sql .= " AND access_url_id = $urlId";
+        }
+
         $result = Database::query($sql);
         $array = Database::store_result($result, 'ASSOC');
         return $array;
@@ -156,8 +258,17 @@ class UserGroup extends Model
      */
     public function get_usergroup_by_course($course_id)
     {
-        $options = array('where' => array('course_id = ?' => $course_id));
-        $results = Database::select('usergroup_id', $this->usergroup_rel_course_table, $options);
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $options = array('where' => array('c.course_id = ? AND access_url_id = ?' => array($course_id, $urlId)));
+            $from = $this->usergroup_rel_course_table." as c INNER JOIN ".$this->access_url_rel_usergroup." a
+                    ON c.usergroup_id = a.usergroup_id";
+        } else {
+            $options = array('where' => array('c.course_id = ?' => $course_id));
+            $from = $this->usergroup_rel_course_table." c";
+        }
+
+        $results = Database::select('c.usergroup_id', $from, $options);
         $array = array();
         if (!empty($results)) {
             foreach ($results as $row) {
@@ -174,7 +285,11 @@ class UserGroup extends Model
      */
     public function usergroup_was_added_in_course($usergroup_id, $course_id)
     {
-        $results = Database::select('usergroup_id', $this->usergroup_rel_course_table, array('where' => array('course_id = ? AND usergroup_id = ?' => array($course_id, $usergroup_id))));
+        $results = Database::select(
+            'usergroup_id',
+            $this->usergroup_rel_course_table,
+            array('where' => array('course_id = ? AND usergroup_id = ?' => array($course_id, $usergroup_id)))
+        );
         if (empty($results)) {
             return false;
         }
@@ -188,7 +303,12 @@ class UserGroup extends Model
      */
     public function get_sessions_by_usergroup($id)
     {
-        $results = Database::select('session_id', $this->usergroup_rel_session_table, array('where' => array('usergroup_id = ?' => $id)));
+        $results = Database::select(
+            'session_id',
+            $this->usergroup_rel_session_table,
+            array('where' => array('usergroup_id = ?' => $id))
+        );
+
         $array = array();
         if (!empty($results)) {
             foreach ($results as $row) {
@@ -223,10 +343,25 @@ class UserGroup extends Model
     /**
      * Gets the usergroup id list by user id
      * @param   int user id
+     * @return array
      */
-    public function get_usergroup_by_user($id)
+    public function get_usergroup_by_user($userId)
     {
-        $results = Database::select('usergroup_id', $this->usergroup_rel_user_table, array('where' => array('user_id = ?' => $id)));
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $from = $this->usergroup_rel_user_table." u
+                    INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id AND u.usergroup_id)";
+            $where =  array('where' => array('user_id = ? AND access_url_id = ? ' => array($userId, $urlId)));
+        } else {
+            $from = $this->usergroup_rel_user_table." u ";
+            $where =  array('where' => array('user_id = ?' => $userId));
+        }
+
+        $results = Database::select(
+            'u.usergroup_id',
+            $from,
+            $where
+        );
         $array = array();
         if (!empty($results)) {
             foreach ($results as $row) {
@@ -241,7 +376,7 @@ class UserGroup extends Model
      * @param   int     usergroup id
      * @param   array   list of session ids
      */
-    function subscribe_sessions_to_usergroup($usergroup_id, $list)
+    public function subscribe_sessions_to_usergroup($usergroup_id, $list)
     {
         $current_list = self::get_sessions_by_usergroup($usergroup_id);
         $user_list = self::get_users_by_usergroup($usergroup_id);
@@ -270,11 +405,14 @@ class UserGroup extends Model
                         SessionManager::unsubscribe_user_from_session($session_id, $user_id);
                     }
                 }
-                Database::delete($this->usergroup_rel_session_table, array('usergroup_id = ? AND session_id = ?' => array($usergroup_id, $session_id)));
+                Database::delete(
+                    $this->usergroup_rel_session_table,
+                    array('usergroup_id = ? AND session_id = ?' => array($usergroup_id, $session_id))
+                );
             }
         }
 
-        // Adding new relationships
+        // Adding new relationships.
         if (!empty($new_items)) {
             foreach ($new_items as $session_id) {
                 $params = array('session_id' => $session_id, 'usergroup_id' => $usergroup_id);
@@ -291,8 +429,9 @@ class UserGroup extends Model
      * Subscribes courses to a group (also adding the members of the group in the course)
      * @param   int     usergroup id
      * @param   array   list of course ids (integers)
+     * @param bool $delete_groups
      */
-    function subscribe_courses_to_usergroup($usergroup_id, $list, $delete_groups = true)
+    public function subscribe_courses_to_usergroup($usergroup_id, $list, $delete_groups = true)
     {
         $current_list = self::get_courses_by_usergroup($usergroup_id);
         $user_list = self::get_users_by_usergroup($usergroup_id);
@@ -318,7 +457,7 @@ class UserGroup extends Model
             self::unsubscribe_courses_from_usergroup($usergroup_id, $delete_items);
         }
 
-        //Addding new relationships
+        // Adding new relationships
         if (!empty($new_items)) {
             foreach ($new_items as $course_id) {
                 $course_info = api_get_course_info_by_id($course_id);
@@ -337,9 +476,9 @@ class UserGroup extends Model
      * @param int $usergroup_id
      * @param bool $delete_items
      */
-    function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items)
+    public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items)
     {
-        //Deleting items
+        // Deleting items.
         if (!empty($delete_items)) {
             $user_list = self::get_users_by_usergroup($usergroup_id);
             foreach ($delete_items as $course_id) {
@@ -356,10 +495,11 @@ class UserGroup extends Model
 
     /**
      * Subscribe users to a group
-     * @param   int     usergroup id
-     * @param   array   list of user ids
+     * @param int     usergroup id
+     * @param array   list of user ids
+     * @param bool $delete_users_not_present_in_list
      */
-    function subscribe_users_to_usergroup($usergroup_id, $list, $delete_users_not_present_in_list = true)
+    public function subscribe_users_to_usergroup($usergroup_id, $list, $delete_users_not_present_in_list = true)
     {
         $current_list = self::get_users_by_usergroup($usergroup_id);
         $course_list = self::get_courses_by_usergroup($usergroup_id);
@@ -436,8 +576,204 @@ class UserGroup extends Model
      */
     public function usergroup_exists($name)
     {
-        $sql = "SELECT * FROM $this->table WHERE name='".Database::escape_string($name)."'";
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $sql = "SELECT * FROM $this->table u
+                    INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id)
+                    WHERE name = '".Database::escape_string($name)."' AND access_url_id = $urlId";
+        } else {
+            $sql = "SELECT * FROM $this->table WHERE name = '".Database::escape_string($name)."'";
+        }
         $res = Database::query($sql);
         return Database::num_rows($res) != 0;
     }
+
+    /**
+     * @param int $sidx
+     * @param int $sord
+     * @param int $start
+     * @param int $limit
+     * @return array
+     */
+    public function getUsergroupsPagination($sidx, $sord, $start, $limit)
+    {
+        $sord = intval($sord);
+        $start = intval($start);
+        $limit = intval($limit);
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $from = $this->table." u INNER JOIN {$this->access_url_rel_usergroup} a ON (u.id = a.usergroup_id)";
+            $where = array(' access_url_id = ?' => $urlId);
+        } else {
+            $from = $this->table." u ";
+            $where = array();
+        }
+
+        $result = Database::select(
+            'u.*',
+            $from,
+            array('where' => $where, 'order'=> "name $sord", 'LIMIT'=> "$start , $limit")
+        );
+
+        $new_result = array();
+        if (!empty($result)) {
+            foreach ($result as $group) {
+                $group['sessions']   = count($this->get_sessions_by_usergroup($group['id']));
+                $group['courses']    = count($this->get_courses_by_usergroup($group['id']));
+                $group['users']      = count($this->get_users_by_usergroup($group['id']));
+                $new_result[]        = $group;
+            }
+            $result = $new_result;
+        }
+        $columns = array('name', 'users', 'courses','sessions');
+
+        if (!in_array($sidx, $columns)) {
+            $sidx = 'name';
+        }
+
+        // Multidimensional sort
+        msort($result, $sidx);
+        return $result;
+    }
+
+    /**
+     * @param array $options
+     * @return array
+     */
+    public function get_all_for_export($options = null)
+    {
+        if ($this->useMultipleUrl) {
+            $urlId = api_get_current_access_url_id();
+            $from = $this->table." u INNER JOIN {$this->access_url_rel_usergroup} a ON (u.id = a.usergroup_id)";
+            $options = array('where' => array('access_url_id = ? ' => $urlId));
+            return Database::select('name, description', $from, $options);
+        } else {
+            return Database::select('name, description', $this->table, $options);
+        }
+    }
+
+    /**
+     * @param string $firstLetter
+     * @return array
+     */
+    public function filterByFirstLetter($firstLetter)
+    {
+        $firstLetter = Database::escape_string($firstLetter);
+        $sql = "SELECT id, name FROM $this->table
+		        WHERE name LIKE '".$firstLetter."%' OR name LIKE '".api_strtolower($firstLetter)."%'
+		        ORDER BY name DESC ";
+
+        $result = Database::query($sql);
+        return Database::store_result($result);
+    }
+
+    /**
+     * Select user group not in list
+     * @param array $list
+     * @return array
+     */
+    public function getUserGroupNotInList($list)
+    {
+        if (empty($list)) {
+            return array();
+        }
+
+        $list = array_map('intval', $list);
+        $listToString = implode("','", $list);
+
+        $sql = "SELECT * FROM {$this->table} WHERE id NOT IN ('$listToString')";
+        $result = Database::query($sql);
+        return Database::store_result($result, 'ASSOC');
+    }
+
+    /**
+     * @param $params
+     * @param bool $show_query
+     * @return bool|void
+     */
+    public function save($params, $show_query = false)
+    {
+        $id = parent::save($params, $show_query);
+        if ($this->useMultipleUrl) {
+            $this->subscribeToUrl($id, api_get_current_access_url_id());
+        }
+        return $id;
+    }
+
+    /**
+     * @param $id
+     * @return bool|void
+     */
+    public function delete($id)
+    {
+        $result = parent::delete($id);
+        if ($this->useMultipleUrl) {
+            if ($result) {
+                $this->unsubscribeToUrl($id, api_get_current_access_url_id());
+            }
+        }
+    }
+
+    /**
+     * @param int $id
+     * @param int $urlId
+     */
+    public function subscribeToUrl($id, $urlId)
+    {
+        Database::insert(
+            $this->access_url_rel_usergroup,
+            array(
+                'access_url_id' => $urlId,
+                'usergroup_id' =>$id
+            )
+        );
+    }
+
+    /**
+     * @param $id
+     * @param $urlId
+     */
+    public function unsubscribeToUrl($id, $urlId)
+    {
+        Database::delete(
+            $this->access_url_rel_usergroup,
+            array(
+                'access_url_id = ? AND usergroup_id = ? ' => array($urlId, $id)
+            )
+        );
+    }
+
+    public static function searchUserGroupAjax($needle)
+    {
+        $response = new XajaxResponse();
+        $return = '';
+
+        if (!empty($needle)) {
+            // xajax send utf8 datas... datas in db can be non-utf8 datas
+            $charset = api_get_system_encoding();
+            $needle = api_convert_encoding($needle, $charset, 'utf-8');
+            $needle = Database::escape_string($needle);
+            // search courses where username or firstname or lastname begins likes $needle
+            $sql = 'SELECT id, name FROM '.Database::get_main_table(TABLE_USERGROUP).' u
+                    WHERE name LIKE "'.$needle.'%"
+                    ORDER BY name
+                    LIMIT 11';
+            $result = Database::query($sql);
+            $i = 0;
+            while ($data = Database::fetch_array($result)) {
+                $i++;
+                if ($i <= 10) {
+                    $return .= '<a
+                    href="javascript: void(0);"
+                    onclick="javascript: add_user_to_url(\''.addslashes($data['id']).'\',\''.addslashes($data['name']).' \')">'.$data['name'].' </a><br />';
+                } else {
+                    $return .= '...<br />';
+                }
+            }
+        }
+        $response->addAssign('ajax_list_courses','innerHTML', api_utf8_encode($return));
+        return $response;
+
+    }
 }
+/* CREATE TABLE IF NOT EXISTS access_url_rel_usergroup (access_url_id int unsigned NOT NULL, usergroup_id int unsigned NOT NULL, PRIMARY KEY (access_url_id, usergroup_id));*/