diff --git a/main/admin/access_url_add_usergroup_to_url.php b/main/admin/access_url_add_usergroup_to_url.php new file mode 100644 index 0000000000..fb70ddfc7c --- /dev/null +++ b/main/admin/access_url_add_usergroup_to_url.php @@ -0,0 +1,128 @@ + +*/ + +// 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 '
'; +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 '
'; + +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); +?> + +
+ + + + + + + + + + + + +
+ +

+ : + +
  + : +
+ + + + + +
+
+ +*/ + +// 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[] = ' +'; + +$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 '
'; +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 '
'; + +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 = ''.get_lang('SessionAddTypeUnique').''; + $link_add_type_multiple = get_lang('SessionAddTypeMultiple'); +} else { + $link_add_type_unique = get_lang('SessionAddTypeUnique'); + $link_add_type_multiple = ''.get_lang('SessionAddTypeMultiple').''; +} + +$url_list = UrlManager::get_url_data(); +?> +
+  |  +
+

+
+> + + +

+ + + + + + + + + + + + + + + + + + + + + +
: +
+
+ + +
+ + + +
+
+ + + + +

+ + +





+
+ +
+
+ '.get_lang('AddUserGroupToURL').''; + else + echo ''; + ?> +
+
+ +'; - } - } - Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'
',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'].'
'; + } + } + Display :: display_normal_message(get_lang('AdminUserRegisteredToThisURL').': '.$url_str.'
',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'].'
'; - } +foreach ($url_list as $my_url) { + if (!in_array($my_url['id'], $my_user_url_list)){ + $url_string.=$my_url['url'].'
'; + } } if(!empty($url_string)) { Display :: display_warning_message(get_lang('AdminShouldBeRegisterInSite').'
'.$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(''.get_lang('ClickToRegisterAdmin').'',false); - } + $quant= UrlManager::relation_url_user_exist(api_get_user_id(),$current_access_url_id); + if ($quant==0) { + Display :: display_warning_message(''.get_lang('ClickToRegisterAdmin').'',false); + } } // action menu @@ -106,17 +107,21 @@ echo '
'; 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 '
'; //$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 = ''.Display::return_icon($image.'.gif', get_lang(ucfirst($action))).''; - } - //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 .= ''.Display::return_icon('delete.png', get_lang('Delete'), array(), ICON_SIZE_SMALL).''; - } + } $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(); \ No newline at end of file diff --git a/main/inc/ajax/model.ajax.php b/main/inc/ajax/model.ajax.php index c6c7a354ae..1d4bd9cc21 100644 --- a/main/inc/ajax/model.ajax.php +++ b/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); diff --git a/main/inc/lib/database.constants.inc.php b/main/inc/lib/database.constants.inc.php index 3e9bd781b6..18daac53ae 100644 --- a/main/inc/lib/database.constants.inc.php +++ b/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'); diff --git a/main/inc/lib/urlmanager.lib.php b/main/inc/lib/urlmanager.lib.php index e84eae0266..c505af356e 100644 --- a/main/inc/lib/urlmanager.lib.php +++ b/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 , - * - * @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 , + * + * @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); diff --git a/main/inc/lib/usergroup.lib.php b/main/inc/lib/usergroup.lib.php index e8cfefa58b..ee924a40bf 100644 --- a/main/inc/lib/usergroup.lib.php +++ b/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 '
'; echo ''.Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('PlatformAdmin'), '', '32').''; - echo ''.Display::return_icon('new_class.png', get_lang('AddClasses'), '', '32').''; - 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 '
'; 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 .= ''.$data['name'].'
'; + } else { + $return .= '...
'; + } + } + } + $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));*/