From 7dca452277398d23c3767d55fa1cb063ee60ed68 Mon Sep 17 00:00:00 2001 From: carlos alvarado Date: Thu, 19 Nov 2020 11:25:40 -0500 Subject: [PATCH] Session: List the classes registered in a session in the section groups -> classes + fix enrollment - refs BT#17984 --- main/inc/ajax/model.ajax.php | 27 +++- main/inc/lib/usergroup.lib.php | 277 ++++++++++++++++++++++++++++----- main/user/class.php | 26 +++- 3 files changed, 288 insertions(+), 42 deletions(-) diff --git a/main/inc/ajax/model.ajax.php b/main/inc/ajax/model.ajax.php index fac2f0b278..b4e82948b1 100755 --- a/main/inc/ajax/model.ajax.php +++ b/main/inc/ajax/model.ajax.php @@ -880,6 +880,7 @@ switch ($action) { $course_id = api_get_course_int_id(); $options = []; $options['course_id'] = $course_id; + $options['session_id'] = $_SESSION['id_session']; switch ($type) { case 'not_registered': @@ -887,13 +888,18 @@ switch ($action) { if (!empty($keyword)) { $options['where']['AND name like %?% '] = $keyword; } - $count = $obj->getUserGroupNotInCourse($options, $groupFilter, true); + $count = $obj->getUserGroupNotInCourse( + $options, + $groupFilter, + true + ); break; case 'registered': $options['where'] = [' usergroup.course_id = ? ' => $course_id]; $count = $obj->getUserGroupInCourse( $options, $groupFilter, + true, true ); break; @@ -2353,12 +2359,19 @@ switch ($action) { $columns = ['name', 'users', 'status', 'group_type', 'actions']; $options['order'] = "name $sord"; $options['limit'] = "$start , $limit"; + $options['session_id'] = $_SESSION['id_session']; switch ($type) { case 'not_registered': - $result = $obj->getUserGroupNotInCourse($options, $groupFilter); + + $result = $obj->getUserGroupNotInCourse($options, $groupFilter); break; case 'registered': - $result = $obj->getUserGroupInCourse($options, $groupFilter); + $result = $obj->getUserGroupInCourse( + $options, + $groupFilter, + false, + true + ); break; } @@ -2378,8 +2391,12 @@ switch ($action) { ); } - if ($obj->usergroup_was_added_in_course($group['id'], $course_id)) { - $url = 'class.php?action=remove_class_from_course&id='.$group['id'].'&'.api_get_cidreq(); + if ($obj->usergroup_was_added_in_course( + $group['id'], + $course_id, + $_SESSION['id_session'] + )) { + $url = 'class.php?action=remove_class_from_course&id='.$group['id'].'&'.api_get_cidreq().'&id_session='.$_SESSION['id_session']; $icon = Display::return_icon('delete.png', get_lang('Remove')); } else { $url = 'class.php?action=add_class_to_course&id='.$group['id'].'&'.api_get_cidreq().'&type=not_registered'; diff --git a/main/inc/lib/usergroup.lib.php b/main/inc/lib/usergroup.lib.php index 2b32396dd7..e9cdb6aabe 100755 --- a/main/inc/lib/usergroup.lib.php +++ b/main/inc/lib/usergroup.lib.php @@ -29,8 +29,11 @@ class UserGroup extends Model public $showGroupTypeSetting = false; public $usergroup_rel_user_table; public $usergroup_rel_course_table; + public $usergroup; public $usergroup_rel_session_table; + public $session_table; public $access_url_rel_usergroup; + public $session_rel_course_table; public $access_url_rel_user; public $table_course; public $table_user; @@ -45,7 +48,10 @@ 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->session_table = Database::get_main_table(TABLE_MAIN_SESSION); + $this->usergroup_table = Database::get_main_table(TABLE_USERGROUP); $this->access_url_rel_usergroup = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USERGROUP); + $this->session_rel_course_table = Database::get_main_table(TABLE_MAIN_SESSION_COURSE); $this->access_url_rel_user = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_USER); $this->table_course = Database::get_main_table(TABLE_MAIN_COURSE); $this->table_user = Database::get_main_table(TABLE_MAIN_USER); @@ -436,20 +442,80 @@ class UserGroup extends Model } /** + * Gets all users that are part of a group or class. + * + * Example to obtain the number of registered: + * + * $course_id]; + * $obj = new UserGroup(); + * $count = $obj->getUserGroupInCourse( + * $options, + * -1, + * true, + * true + * ); + * echo "
".var_export($count,true)."
"; + * ?> + *
+ * + * + * Example to obtain the list of classes or groups registered: + * + * $course_id]; + * $obj = new UserGroup(); + * $students = $obj->getUserGroupInCourse( + * $options, + * -1, + * false, + * true + * ); + * echo "
".var_export($students,true)."
"; + * ?> + *
+ * * @param array $options * @param int $type 0 = classes / 1 = social groups + * @param bool $withClasses Return with clases * * @return array */ - public function getUserGroupInCourse($options = [], $type = -1, $getCount = false) - { + public function getUserGroupInCourse( + $options = [], + $type = -1, + $getCount = false, + $withClasses = false + ) { + $data = []; + $sqlClasses = ''; + $whereClasess = ''; + $resultClasess = null; + $counts = 0; + $select = 'DISTINCT u.*'; if ($getCount) { $select = 'count(u.id) as count'; } + if ( + $withClasses == true && + isset($options['session_id']) && + (int) $options['session_id'] != 0 + ) { + $sessionId = (int) $options['session_id']; + $courseId = (int) $options['course_id']; + unset($options['session_id']); + $whereClasess = " WHERE ur.session_id = $sessionId AND sc.c_id = $courseId "; + } else { + $withClasses = false; + } + if ($this->getUseMultipleUrl()) { - $sql = "SELECT $select + if ($withClasses != true) { + $sql = "SELECT $select FROM {$this->usergroup_rel_course_table} usergroup INNER JOIN {$this->table} u ON (u.id = usergroup.usergroup_id) @@ -458,16 +524,37 @@ class UserGroup extends Model INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id) "; + } else { + $sqlClasses = "SELECT". + " $select ". + " FROM". + " {$this->usergroup_rel_session_table} ur". + " INNER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id ". + " INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id". + " INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id) ". + " INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ". + " $whereClasess "; + } } else { - $sql = "SELECT $select + if ($withClasses != true) { + $sql = "SELECT $select 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) "; + } else { + $sqlClasses = "SELECT". + " $select ". + " FROM". + " {$this->usergroup_rel_session_table} ur". + " INNER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id ". + " INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id". + " INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ". + " $whereClasess "; + } } - if (-1 != $type) { $type = (int) $type; $options['where']['AND group_type = ? '] = $type; @@ -479,29 +566,65 @@ class UserGroup extends Model $conditions = Database::parse_conditions($options); $sql .= $conditions; - - $result = Database::query($sql); + if ($withClasses == true) { + $resultClasess = Database::query($sqlClasses); + } else { + $result = Database::query($sql); + } if ($getCount) { - if (Database::num_rows($result)) { - $row = Database::fetch_array($result); + if (!empty($result)) { + if (Database::num_rows($result)) { + $row = Database::fetch_array($result); + $counts += $row['count']; + } + } + if (!empty($sqlClasses)) { + if (Database::num_rows($resultClasess)) { + $row = Database::fetch_array($resultClasess); + $counts += $row['count']; + } + } - return $row['count']; + return $counts; + } + if (!empty($result)) { + if (Database::num_rows($result) > 0) { + while ($row = Database::fetch_array($result, 'ASSOC')) { + $data[] = $row; + } + } + } + if (!empty($sqlClasses)) { + if (Database::num_rows($resultClasess) > 0) { + while ($row = Database::fetch_array($resultClasess, 'ASSOC')) { + $data[] = $row; + } } } - return Database::store_result($result, 'ASSOC'); + return $data; } /** * @param array $options * @param int $type * @param bool $getCount + * @param bool $withClasses * * @return array|bool */ - public function getUserGroupNotInCourse($options = [], $type = -1, $getCount = false) - { + public function getUserGroupNotInCourse( + $options = [], + $type = -1, + $getCount = false, + $withClasses = false + ) { + $data = []; + $sqlClasses = ''; + $whereClasess = ''; + $resultClasess = null; + $course_id = null; if (isset($options['course_id'])) { $course_id = (int) $options['course_id']; @@ -517,20 +640,56 @@ class UserGroup extends Model $select = 'count(u.id) as count'; } + if ( + $withClasses == true && + isset($options['session_id']) && + (int) $options['session_id'] != 0 + ) { + $sessionId = (int) $options['session_id']; + unset($options['session_id']); + $courseId = (int) $options['course_id']; + $whereClasess = " WHERE ur.session_id = $sessionId AND sc.c_id = $courseId"; + } else { + $withClasses = false; + } + if ($this->getUseMultipleUrl()) { - $sql = "SELECT $select + if ($withClasses == false) { + $sql = "SELECT $select 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 { + $sqlClasses = " SELECT". + " $select". + " FROM". + " {$this->usergroup_rel_session_table} ur". + " LEFT OUTER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id". + " INNER JOIN {$this->access_url_rel_usergroup} a ON (a.usergroup_id = u.id) ". + " INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id". + " INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ". + " $whereClasess "; + } } else { - $sql = "SELECT $select + if ($withClasses == false) { + $sql = "SELECT $select FROM {$this->table} u LEFT OUTER JOIN {$this->usergroup_rel_course_table} urc ON (u.id = urc.usergroup_id AND course_id = $course_id) "; + } else { + $sqlClasses = " SELECT". + " $select". + " FROM". + " {$this->usergroup_rel_session_table} ur". + " LEFT OUTER JOIN {$this->usergroup_table} u ON u.id = ur.usergroup_id". + " INNER JOIN `{$this->session_table}` s ON s.id = ur.session_id". + " INNER JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ". + " $whereClasess "; + } } if (-1 != $type) { @@ -553,16 +712,43 @@ class UserGroup extends Model $sql .= $conditions; - if ($getCount) { + if ($withClasses == true) { + $resultClasess = Database::query($sqlClasses); + } else { $result = Database::query($sql); - $array = Database::fetch_array($result, 'ASSOC'); + } + + if ($getCount) { + if (!empty($result)) { + $result = Database::query($sql); + $array = Database::fetch_array($result, 'ASSOC'); + + return $array['count']; + } + if (!empty($sqlClasses)) { + if (Database::num_rows($resultClasess)) { + $row = Database::fetch_array($resultClasess); - return $array['count']; + return $row['count']; + } + } + } + if (!empty($result)) { + if (Database::num_rows($result) > 0) { + while ($row = Database::fetch_array($result, 'ASSOC')) { + $data[] = $row; + } + } + } + if (!empty($sqlClasses)) { + if (Database::num_rows($resultClasess) > 0) { + while ($row = Database::fetch_array($resultClasess, 'ASSOC')) { + $data[] = $row; + } + } } - $result = Database::query($sql); - $array = Database::store_result($result, 'ASSOC'); - return $array; + return $data; } /** @@ -609,15 +795,29 @@ class UserGroup extends Model * * @return bool */ - public function usergroup_was_added_in_course($usergroup_id, $course_id) - { + public function usergroup_was_added_in_course( + $usergroup_id, + $course_id, + $Session = 0 + ) { + $Session = (int) $Session; + $results = Database::select( 'usergroup_id', $this->usergroup_rel_course_table, ['where' => ['course_id = ? AND usergroup_id = ?' => [$course_id, $usergroup_id]]] ); - if (empty($results)) { + $resultSession = Database::select( + 'usergroup_id', + $this->usergroup_rel_session_table, + ['where' => ['session_id = ? AND usergroup_id = ?' => [$Session, $usergroup_id]]] + ); + + if (empty($results) && $Session == 0) { + return false; + } + if ((empty($resultSession)) && $Session != 0) { return false; } @@ -940,12 +1140,13 @@ class UserGroup extends Model * @param int $usergroup_id * @param array $delete_items */ - public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items) + public function unsubscribe_courses_from_usergroup($usergroup_id, $delete_items, $sessionId = 0) { + $sessionId = (int) $sessionId; // Deleting items. if (!empty($delete_items)) { $user_list = $this->get_users_by_usergroup($usergroup_id); - + $groupId = isset($_GET['id']) ? (int) $_GET['id'] : 0; foreach ($delete_items as $course_id) { $course_info = api_get_course_info_by_id($course_id); if ($course_info) { @@ -953,20 +1154,26 @@ class UserGroup extends Model foreach ($user_list as $user_id) { CourseManager::unsubscribe_user( $user_id, - $course_info['code'] + $course_info['code'], + $sessionId ); } } Database::delete( - $this->usergroup_rel_course_table, - [ - 'usergroup_id = ? AND course_id = ?' => [ - $usergroup_id, - $course_id, - ], - ] - ); + $this->usergroup_rel_course_table, + [ + 'usergroup_id = ? AND course_id = ?' => [ + $usergroup_id, + $course_id, + ], + ] + ); + } + if ($sessionId != 0 && $groupId != 0) { + $this->subscribe_sessions_to_usergroup($groupId, [0]); + } else { + $s = $sessionId; } } } diff --git a/main/user/class.php b/main/user/class.php index 4218760b11..45448783b0 100755 --- a/main/user/class.php +++ b/main/user/class.php @@ -81,7 +81,9 @@ if (api_is_allowed_to_edit()) { switch ($action) { case 'add_class_to_course': $id = $_GET['id']; - if (!empty($id)) { + $idSession = (int) isset($_GET['id_session']) ? $_GET['id_session'] : 0; + if (!empty($id) and $idSession == 0) { + /* To suscribe Groups*/ $usergroup->subscribe_courses_to_usergroup( $id, [api_get_course_int_id()], @@ -90,16 +92,36 @@ if (api_is_allowed_to_edit()) { Display::addFlash(Display::return_message(get_lang('Added'))); header('Location: class.php?'.api_get_cidreq().'&type=registered'); exit; + } elseif ($idSession != 0) { + /* To suscribe session*/ + $usergroup->subscribe_sessions_to_usergroup($id, [$idSession]); + Display::addFlash(Display::return_message(get_lang('Added'))); + header('Location: class.php?'.api_get_cidreq().'&type=registered'); + exit; } break; case 'remove_class_from_course': $id = $_GET['id']; + $idSession = (int) isset($_GET['id_session']) ? $_GET['id_session'] : 0; if (!empty($id)) { $usergroup->unsubscribe_courses_from_usergroup( $id, - [api_get_course_int_id()] + [api_get_course_int_id()], + $idSession ); Display::addFlash(Display::return_message(get_lang('Deleted'))); + /* Remove class */ + $user_list = $usergroup->get_users_by_usergroup($id); + if (!empty($user_list)) { + foreach ($user_list as $user_id) { + SessionManager::unsubscribe_user_from_session($id, $user_id); + } + } + Database::delete( + $usergroup->usergroup_rel_session_table, + ['usergroup_id = ? AND session_id = ?' => [$id, $idSession]] + ); + /* Remove class */ } break; }