table = Database::get_main_table(TABLE_USERGROUP); $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); $this->useMultipleUrl = api_get_multiple_access_url(); if ($this->allowTeachers()) { $this->columns[] = 'author_id'; } } /** * @return bool */ public function getUseMultipleUrl() { return $this->useMultipleUrl; } /** * @return int */ public function getTotalCount() { $options = []; $from = $this->table; if ($this->getUseMultipleUrl()) { $urlId = api_get_current_access_url_id(); $options = [ 'where' => [ 'access_url_id = ?' => [ $urlId, ], ], ]; $from = " $this->table u INNER JOIN $this->access_url_rel_usergroup a ON (u.id = a.usergroup_id) "; } $row = Database::select('count(*) as count', $from, $options, 'first'); return $row['count']; } /** * @param int $id user group id * @param bool $getCount * * @return array|int */ public function getUserGroupUsers($id, $getCount = false, $start = 0, $limit = 0) { $id = (int) $id; $start = (int) $start; $limit = (int) $limit; $select = ' u.* '; if ($getCount) { $select = 'COUNT(u.id) count '; } if ($this->getUseMultipleUrl()) { $urlId = api_get_current_access_url_id(); $sql = "SELECT $select FROM $this->usergroup_rel_user_table u INNER JOIN $this->access_url_rel_user a ON (u.user_id = a.user_id) WHERE u.usergroup_id = $id AND access_url_id = $urlId "; } else { $sql = "SELECT $select FROM $this->usergroup_rel_user_table u WHERE u.usergroup_id = $id"; } $limitCondition = ''; if (!empty($start) && !empty($limit)) { $limitCondition = " LIMIT $start, $limit"; } $sql .= $limitCondition; $result = Database::query($sql); if ($getCount) { if (Database::num_rows($result)) { $row = Database::fetch_array($result); return $row['count']; } return 0; } else { $list = []; $showCalendar = 'true' === api_get_plugin_setting('learning_calendar', 'enabled'); $calendarPlugin = null; if ($showCalendar) { $calendarPlugin = LearningCalendarPlugin::create(); } $url = api_get_path(WEB_PLUGIN_PATH).'learning_calendar/calendar.php?'; while ($data = Database::fetch_array($result)) { $userId = $data['user_id']; $userInfo = api_get_user_info($userId); $data['title'] = $userInfo['complete_name_with_username']; if ($showCalendar) { $calendar = $calendarPlugin->getUserCalendar($userId); $data['calendar_id'] = 0; $data['calendar'] = ''; if (!empty($calendar)) { $calendarInfo = $calendarPlugin->getCalendar($calendar['calendar_id']); if ($calendarInfo) { $data['calendar_id'] = $calendar['calendar_id']; $data['calendar'] = Display::url( $calendarInfo['title'], $url.'&id='.$calendar['calendar_id'] ); } } $courseAndSessionList = Tracking::show_user_progress( $userId, 0, '', true, true, true ); $stats = $calendarPlugin->getUserStats($userId, $courseAndSessionList); $evaluations = $calendarPlugin->getGradebookEvaluationListToString($userId, $courseAndSessionList); $data['gradebook_items'] = $evaluations; $totalTime = 0; foreach ($courseAndSessionList as $sessionId => $course) { foreach ($course as $courseId) { $totalTime += Tracking::get_time_spent_on_the_course($userId, $courseId, $sessionId); } } $data['time_spent'] = api_time_to_hms($totalTime); $data['lp_day_completed'] = $stats['completed']; $data['days_diff'] = $stats['completed'] - $stats['user_event_count']; } $data['id'] = $data['user_id']; $list[] = $data; } return $list; } } /** * @param string $extraWhereCondition * * @return int */ public function get_count($extraWhereCondition = '') { $authorCondition = ''; if ($this->allowTeachers()) { if (!api_is_platform_admin()) { $userId = api_get_user_id(); $authorCondition = " AND author_id = $userId"; } } if ($this->getUseMultipleUrl()) { $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 $authorCondition AND $extraWhereCondition "; $result = Database::query($sql); if (Database::num_rows($result)) { $row = Database::fetch_array($result); return $row['count']; } } else { $sql = "SELECT count(a.id) as count FROM {$this->table} a WHERE 1 = 1 $authorCondition AND $extraWhereCondition "; $result = Database::query($sql); if (Database::num_rows($result)) { $row = Database::fetch_array($result); return $row['count']; } } return 0; } /** * @param int $course_id * @param int $type * * @return mixed */ public function getUserGroupByCourseWithDataCount($course_id, $type = -1) { if ($this->getUseMultipleUrl()) { $course_id = (int) $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 { $typeCondition = ''; if (-1 != $type) { $type = (int) $type; $typeCondition = " AND group_type = $type "; } $sql = "SELECT count(c.usergroup_id) as count FROM {$this->usergroup_rel_course_table} c INNER JOIN {$this->table} a ON (c.usergroup_id = a.id) WHERE course_id = $course_id $typeCondition "; $result = Database::query($sql); if (Database::num_rows($result)) { $row = Database::fetch_array($result); return $row['count']; } return 0; } } /** * @param string $name * * @return int */ public function getIdByName($name) { $row = Database::select( 'id', $this->table, ['where' => ['title = ?' => $name]], 'first' ); if ($row) { return (int) $row['id']; } return 0; } /** * Displays the title + grid. */ public function returnGrid() { $html = ''; $actions = ''; if (api_is_platform_admin()) { $actions .= ''. Display::getMdiIcon( ActionIcon::BACK, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Back to').' '.get_lang('Administration') ). ''; } $actions .= ''. Display::getMdiIcon(ActionIcon::ADD, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Add classes')). ''; $actions .= Display::url( Display::getMdiIcon(ActionIcon::IMPORT_ARCHIVE, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Import')), 'usergroup_import.php' ); $actions .= Display::url( Display::getMdiIcon(ActionIcon::EXPORT_CSV, 'ch-tool-icon', null, ICON_SIZE_MEDIUM, get_lang('Export')), 'usergroup_export.php' ); $html .= Display::toolbarAction('toolbar', [$actions]); $html .= Display::grid_html('usergroups'); return $html; } /** * Displays the title + grid. */ public function displayToolBarUserGroupUsers() { // action links echo '
* $course_id];
* $obj = new UserGroupModel();
* $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 UserGroupModel();
* $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 classes.
*
* @return array
*/
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 (
true == $withClasses &&
isset($options['session_id']) &&
0 != (int) $options['session_id']
) {
$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()) {
if (true != $withClasses) {
$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)
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 {
if (true != $withClasses) {
$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;
}
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$options['where']['AND access_url_id = ? '] = $urlId;
}
$conditions = Database::parse_conditions($options);
if (true == $withClasses) {
$resultClasess = Database::query($sqlClasses);
} else {
$sql .= $conditions;
$result = Database::query($sql);
}
if ($getCount) {
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 $counts;
}
if (!empty($result)) {
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_assoc($result)) {
$data[] = $row;
}
}
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess) > 0) {
while ($row = Database::fetch_assoc($resultClasess)) {
$data[] = $row;
}
}
}
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,
$withClasses = false
) {
$data = [];
$sqlClasses = '';
$whereClasess = '';
$resultClasess = null;
$course_id = null;
if (isset($options['course_id'])) {
$course_id = (int) $options['course_id'];
unset($options['course_id']);
}
if (empty($course_id)) {
return false;
}
$select = 'DISTINCT u.*';
if ($getCount) {
$select = 'count(u.id) as count';
}
if (
true == $withClasses &&
isset($options['session_id']) &&
0 != (int) $options['session_id']
) {
$sessionId = (int) $options['session_id'];
unset($options['session_id']);
$whereClasess = " WHERE ur.session_id != $sessionId ";
} else {
$withClasses = false;
}
if ($this->getUseMultipleUrl()) {
if (false == $withClasses) {
$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) ".
" LEFT JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" LEFT JOIN {$this->session_rel_course_table} sc ON s.id = sc.session_id ".
" $whereClasess ";
}
} else {
if (false == $withClasses) {
$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".
" LEFT JOIN `{$this->session_table}` s ON s.id = ur.session_id".
" LEFT 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;
}
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$options['where']['AND access_url_id = ? '] = $urlId;
}
/*if ($this->allowTeachers()) {
if (!api_is_platform_admin()) {
$userId = api_get_user_id();
$options['where']['AND author_id = ? '] = $userId;
}
}*/
$conditions = Database::parse_conditions($options);
if (true == $withClasses) {
$resultClasess = Database::query($sqlClasses);
} else {
$sql .= $conditions;
$result = Database::query($sql);
}
if ($getCount) {
if (!empty($result)) {
$result = Database::query($sql);
$array = Database::fetch_assoc($result);
return $array['count'];
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess)) {
$row = Database::fetch_array($resultClasess);
return $row['count'];
}
}
}
if (!empty($result)) {
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_assoc($result)) {
$data[] = $row;
}
}
}
if (!empty($sqlClasses)) {
if (Database::num_rows($resultClasess) > 0) {
while ($row = Database::fetch_assoc($resultClasess)) {
$data[] = $row;
}
}
}
return $data;
}
/**
* @param int $course_id
*
* @deprecated ?
*
* @return array
*/
public function get_usergroup_by_course($course_id)
{
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$options = [
'where' => [
'c.course_id = ? AND access_url_id = ?' => [
$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 = ['where' => ['c.course_id = ?' => $course_id]];
$from = $this->usergroup_rel_course_table." c";
}
$results = Database::select('c.usergroup_id', $from, $options);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row['usergroup_id'];
}
}
return $array;
}
/**
* @param int $usergroup_id
* @param int $course_id
*
* @return bool
*/
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]]]
);
$resultSession = Database::select(
'usergroup_id',
$this->usergroup_rel_session_table,
['where' => ['session_id = ? AND usergroup_id = ?' => [$Session, $usergroup_id]]]
);
if (empty($results) && 0 == $Session) {
return false;
}
if ((empty($resultSession)) && 0 != $Session) {
return false;
}
return true;
}
/**
* Gets a list of session ids by user group.
*
* @param int $id group id
*
* @return array
*/
public function get_sessions_by_usergroup($id)
{
$results = Database::select(
'session_id',
$this->usergroup_rel_session_table,
['where' => ['usergroup_id = ?' => $id]]
);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row['session_id'];
}
}
return $array;
}
/**
* Gets a list of user ids by user group.
*
* @param int $id user group id
* @param array $roles
*
* @return array with a list of user ids
*/
public function get_users_by_usergroup($id = null, $roles = [])
{
$relationCondition = '';
if (!empty($roles)) {
$relationConditionArray = [];
foreach ($roles as $relation) {
$relation = (int) $relation;
if (empty($relation)) {
$relationConditionArray[] = " (relation_type = 0 OR relation_type IS NULL OR relation_type = '') ";
} else {
$relationConditionArray[] = " relation_type = $relation ";
}
}
$relationCondition = ' AND ( ';
$relationCondition .= implode('OR', $relationConditionArray);
$relationCondition .= ' ) ';
}
if (empty($id)) {
$conditions = [];
} else {
$conditions = ['where' => ["usergroup_id = ? $relationCondition " => $id]];
}
$results = Database::select(
'user_id',
$this->usergroup_rel_user_table,
$conditions
);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row['user_id'];
}
}
return $array;
}
/**
* Gets a list of user ids by user group.
*
* @param int $id user group id
* @param int $relation
*
* @return array with a list of user ids
*/
public function getUsersByUsergroupAndRelation($id, $relation = 0)
{
$relation = (int) $relation;
if (empty($relation)) {
$conditions = ['where' => ['usergroup_id = ? AND (relation_type = 0 OR relation_type IS NULL OR relation_type = "") ' => [$id]]];
} else {
$conditions = ['where' => ['usergroup_id = ? AND relation_type = ?' => [$id, $relation]]];
}
$results = Database::select(
'user_id',
$this->usergroup_rel_user_table,
$conditions
);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row['user_id'];
}
}
return $array;
}
/**
* Get the group list for a user.
*
* @param int $userId The user ID
* @param int $filterByType Optional. The type of group
*
* @return array
*/
public function getUserGroupListByUser($userId, $filterByType = null)
{
$userId = (int) $userId;
if ($this->getUseMultipleUrl()) {
$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)
INNER JOIN {$this->table} g
ON (u.usergroup_id = g.id)
";
$where = ['where' => ['user_id = ? AND access_url_id = ? ' => [$userId, $urlId]]];
} else {
$from = $this->usergroup_rel_user_table." u
INNER JOIN {$this->table} g
ON (u.usergroup_id = g.id)
";
$where = ['where' => ['user_id = ?' => $userId]];
}
if (null !== $filterByType) {
$where['where'][' AND g.group_type = ?'] = (int) $filterByType;
}
$results = Database::select(
'g.*',
$from,
$where
);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row;
}
}
return $array;
}
/**
* Gets the usergroup id list by user id.
*
* @param int $userId user id
*
* @return array
*/
public function get_usergroup_by_user($userId)
{
$userId = (int) $userId;
if ($this->getUseMultipleUrl()) {
$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 = u.usergroup_id) ";
$where = ['where' => ['user_id = ? AND access_url_id = ? ' => [$userId, $urlId]]];
} else {
$from = $this->usergroup_rel_user_table.' u ';
$where = ['where' => ['user_id = ?' => $userId]];
}
$results = Database::select(
'u.usergroup_id',
$from,
$where
);
$array = [];
if (!empty($results)) {
foreach ($results as $row) {
$array[] = $row['usergroup_id'];
}
}
return $array;
}
/**
* Subscribes sessions to a group (also adding the members of the group in the session and course).
*
* @param int $usergroup_id usergroup id
* @param array $list list of session ids
* @param bool $deleteCurrentSessions Optional. Empty the session list for the usergroup (class)
*/
public function subscribe_sessions_to_usergroup($usergroup_id, $list, $deleteCurrentSessions = true)
{
$current_list = $this->get_sessions_by_usergroup($usergroup_id);
$user_list = $this->get_users_by_usergroup($usergroup_id);
$delete_items = $new_items = [];
if (!empty($list)) {
foreach ($list as $session_id) {
if (!in_array($session_id, $current_list)) {
$new_items[] = $session_id;
}
}
}
if ($deleteCurrentSessions) {
if (!empty($current_list)) {
foreach ($current_list as $session_id) {
if (!in_array($session_id, $list)) {
$delete_items[] = $session_id;
}
}
}
// Deleting items
if (!empty($delete_items)) {
foreach ($delete_items as $session_id) {
if (!empty($user_list)) {
foreach ($user_list as $user_id) {
SessionManager::unsubscribe_user_from_session($session_id, $user_id);
}
}
Database::delete(
$this->usergroup_rel_session_table,
['usergroup_id = ? AND session_id = ?' => [$usergroup_id, $session_id]]
);
}
}
}
// Adding new relationships.
if (!empty($new_items)) {
foreach ($new_items as $session_id) {
$params = ['session_id' => $session_id, 'usergroup_id' => $usergroup_id];
Database::insert($this->usergroup_rel_session_table, $params);
if (!empty($user_list)) {
SessionManager::subscribeUsersToSession(
$session_id,
$user_list,
null,
false
);
}
}
}
}
/**
* Subscribes courses to a group (also adding the members of the group in the course).
*
* @param int $usergroup_id usergroup id
* @param array $list list of course ids (integers)
* @param bool $delete_groups
*/
public function subscribe_courses_to_usergroup($usergroup_id, $list, $delete_groups = true)
{
$current_list = $this->get_courses_by_usergroup($usergroup_id);
$user_list = $this->get_users_by_usergroup($usergroup_id);
$delete_items = $new_items = [];
if (!empty($list)) {
foreach ($list as $id) {
if (!in_array($id, $current_list)) {
$new_items[] = $id;
}
}
}
if (!empty($current_list)) {
foreach ($current_list as $id) {
if (!in_array($id, $list)) {
$delete_items[] = $id;
}
}
}
if ($delete_groups) {
$this->unsubscribe_courses_from_usergroup($usergroup_id, $delete_items);
}
// Adding new relationships
if (!empty($new_items)) {
foreach ($new_items as $course_id) {
$course_info = api_get_course_info_by_id($course_id);
if ($course_info) {
if (!empty($user_list)) {
foreach ($user_list as $user_id) {
CourseManager::subscribeUser(
$user_id,
$course_id
);
}
}
$params = [
'course_id' => $course_id,
'usergroup_id' => $usergroup_id,
];
Database::insert(
$this->usergroup_rel_course_table,
$params
);
}
}
}
}
/**
* @param int $usergroup_id
* @param array $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) {
if (!empty($user_list)) {
foreach ($user_list as $user_id) {
CourseManager::unsubscribe_user(
$user_id,
$course_info['code'],
$sessionId
);
}
}
Database::delete(
$this->usergroup_rel_course_table,
[
'usergroup_id = ? AND course_id = ?' => [
$usergroup_id,
$course_id,
],
]
);
}
if (0 != $sessionId && 0 != $groupId) {
$this->subscribe_sessions_to_usergroup($groupId, [0]);
} else {
$s = $sessionId;
}
}
}
}
/**
* Subscribe users to a group.
*
* @param int $usergroup_id usergroup id
* @param array $list list of user ids
* @param bool $delete_users_not_present_in_list
* @param int $relationType
*/
public function subscribe_users_to_usergroup(
$usergroup_id,
$list,
$delete_users_not_present_in_list = true,
$relationType = 0
) {
$current_list = $this->get_users_by_usergroup($usergroup_id);
$course_list = $this->get_courses_by_usergroup($usergroup_id);
$session_list = $this->get_sessions_by_usergroup($usergroup_id);
$session_list = array_filter($session_list);
$relationType = (int) $relationType;
$delete_items = [];
$new_items = [];
if (!empty($list)) {
foreach ($list as $user_id) {
if (!in_array($user_id, $current_list)) {
$new_items[] = $user_id;
}
}
}
if (!empty($current_list)) {
foreach ($current_list as $user_id) {
if (!in_array($user_id, $list)) {
$delete_items[] = $user_id;
}
}
}
// Deleting items
if (!empty($delete_items) && $delete_users_not_present_in_list) {
foreach ($delete_items as $user_id) {
// Removing courses
if (!empty($course_list)) {
foreach ($course_list as $course_id) {
$course_info = api_get_course_info_by_id($course_id);
CourseManager::unsubscribe_user($user_id, $course_info['code']);
}
}
// Removing sessions
if (!empty($session_list)) {
foreach ($session_list as $session_id) {
SessionManager::unsubscribe_user_from_session($session_id, $user_id);
}
}
if (empty($relationType)) {
Database::delete(
$this->usergroup_rel_user_table,
[
'usergroup_id = ? AND user_id = ? AND (relation_type = "0" OR relation_type IS NULL OR relation_type = "")' => [
$usergroup_id,
$user_id,
],
]
);
} else {
Database::delete(
$this->usergroup_rel_user_table,
[
'usergroup_id = ? AND user_id = ? AND relation_type = ?' => [
$usergroup_id,
$user_id,
$relationType,
],
]
);
}
}
}
// Adding new relationships
if (!empty($new_items)) {
// Adding sessions
if (!empty($session_list)) {
foreach ($session_list as $session_id) {
SessionManager::subscribeUsersToSession($session_id, $new_items, null, false);
}
}
foreach ($new_items as $user_id) {
// Adding courses.
if (!empty($course_list)) {
foreach ($course_list as $course_id) {
CourseManager::subscribeUser($user_id, $course_id);
}
}
$params = [
'user_id' => $user_id,
'usergroup_id' => $usergroup_id,
'relation_type' => $relationType,
];
Database::insert($this->usergroup_rel_user_table, $params);
}
}
}
/**
* @param string $title
*
* @return bool
* @throws Exception
*/
public function usergroup_exists(string $title): bool
{
$title = Database::escape_string($title);
if ($this->getUseMultipleUrl()) {
$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 title = '".$title."' AND access_url_id = $urlId";
} else {
$sql = "SELECT * FROM $this->table WHERE title = '".$title."'";
}
$res = Database::query($sql);
return 0 != Database::num_rows($res);
}
/**
* @return bool
*/
public function allowTeachers()
{
return 'true' === api_get_setting('profile.allow_teachers_to_classes');
}
/**
* @param int $sidx
* @param int $sord
* @param int $start
* @param int $limit
* @param string $extraWhereCondition
*
* @return array
*/
public function getUsergroupsPagination($sidx, $sord, $start, $limit, $extraWhereCondition = '')
{
$sord = in_array(strtolower($sord), ['asc', 'desc']) ? $sord : 'desc';
$start = (int) $start;
$limit = (int) $limit;
$sqlFrom = "{$this->table} u ";
$sqlWhere = '1 = 1 ';
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$sqlFrom .= " INNER JOIN {$this->access_url_rel_usergroup} a ON (u.id = a.usergroup_id) ";
$sqlWhere .= " AND a.access_url_id = $urlId ";
}
if ($this->allowTeachers()) {
if (!api_is_platform_admin()) {
$userId = api_get_user_id();
$sqlWhere .= " AND author_id = $userId ";
}
}
if ($extraWhereCondition) {
$sqlWhere .= " AND $extraWhereCondition ";
}
$result = Database::store_result(
Database::query("SELECT u.* FROM $sqlFrom WHERE $sqlWhere ORDER BY title $sord LIMIT $start, $limit")
);
$new_result = [];
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']));
$roles = [];
switch ($group['group_type']) {
case 0:
$group['group_type'] = Display::label(get_lang('Class'), 'info');
$roles = [0];
break;
case 1:
$group['group_type'] = Display::label(get_lang('Social'), 'success');
$roles = [
GROUP_USER_PERMISSION_ADMIN,
GROUP_USER_PERMISSION_READER,
GROUP_USER_PERMISSION_MODERATOR,
GROUP_USER_PERMISSION_HRM,
];
break;
}
$group['users'] = Display::url(
count($this->get_users_by_usergroup($group['id'], $roles)),
api_get_path(WEB_CODE_PATH).'admin/usergroup_users.php?id='.$group['id']
);
$new_result[] = $group;
}
$result = $new_result;
}
$columns = ['title', 'users', 'courses', 'sessions', 'group_type'];
if (!in_array($sidx, $columns)) {
$sidx = 'title';
}
// Multidimensional sort
$result = msort($result, $sidx, $sord);
return $result;
}
/**
* @param array $options
*
* @return array
*/
public function getDataToExport($options = [])
{
if ($this->getUseMultipleUrl()) {
$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 = ['where' => ['access_url_id = ? ' => $urlId]];
if ($this->allowTeachers()) {
$options['where'] = [' author_id = ? ' => api_get_user_id()];
}
$classes = Database::select('a.id, title, description', $from, $options);
} else {
if ($this->allowTeachers()) {
$options['where'] = [' author_id = ? ' => api_get_user_id()];
}
$classes = Database::select('id, title, description', $this->table, $options);
}
$result = [];
if (!empty($classes)) {
foreach ($classes as $data) {
$users = $this->getUserListByUserGroup($data['id']);
$userToString = null;
if (!empty($users)) {
$userNameList = [];
foreach ($users as $userData) {
$userNameList[] = $userData['username'];
}
$userToString = implode(',', $userNameList);
}
$data['users'] = $userToString;
$result[] = $data;
}
}
return $result;
}
/**
* @param string $firstLetter
* @param int $limit
*
* @return array
*/
public function filterByFirstLetter($firstLetter, $limit = 0)
{
$firstLetter = Database::escape_string($firstLetter);
$limit = (int) $limit;
$sql = ' SELECT g.id, title ';
$urlCondition = '';
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$sql .= " FROM $this->table g
INNER JOIN $this->access_url_rel_usergroup a
ON (g.id = a.usergroup_id) ";
$urlCondition = " AND access_url_id = $urlId ";
} else {
$sql = " FROM $this->table g ";
}
$sql .= "
WHERE
title LIKE '".$firstLetter."%' OR
title LIKE '".api_strtolower($firstLetter)."%'
$urlCondition
ORDER BY title DESC ";
if (!empty($limit)) {
$sql .= " LIMIT $limit ";
}
$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 [];
}
$list = array_map('intval', $list);
$listToString = implode("','", $list);
$sql = 'SELECT * ';
$urlCondition = '';
if ($this->getUseMultipleUrl()) {
$urlId = api_get_current_access_url_id();
$sql .= " FROM $this->table g
INNER JOIN $this->access_url_rel_usergroup a
ON (g.id = a.usergroup_id)";
$urlCondition = " AND access_url_id = $urlId ";
} else {
$sql = " FROM $this->table g ";
}
$sql .= " WHERE g.id NOT IN ('$listToString') $urlCondition ";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');
}
/**
* @param $params
* @param bool $showQuery
*
* @return bool|int
*/
public function save($params, $showQuery = false)
{
$params['updated_at'] = $params['created_at'] = api_get_utc_datetime();
$params['group_type'] = isset($params['group_type']) ? Usergroup::SOCIAL_CLASS : Usergroup::NORMAL_CLASS;
$params['allow_members_leave_group'] = isset($params['allow_members_leave_group']) ? 1 : 0;
$userGroupExists = $this->usergroup_exists(trim($params['title']));
if (false === $userGroupExists) {
$userGroup = new Usergroup();
$repo = Container::getUsergroupRepository();
$userGroup
->setTitle(trim($params['title']))
->setDescription($params['description'])
->setUrl($params['url'])
->setVisibility($params['visibility'])
->setGroupType($params['group_type'])
->setAllowMembersToLeaveGroup($params['allow_members_leave_group'])
;
if ($this->allowTeachers()) {
$userGroup->setAuthorId(api_get_user_id());
}
$repo->create($userGroup);
$id = $userGroup->getId();
if ($id) {
if ($this->getUseMultipleUrl()) {
$this->subscribeToUrl($id, api_get_current_access_url_id());
}
if (Usergroup::SOCIAL_CLASS == $params['group_type']) {
$this->add_user_to_group(
api_get_user_id(),
$id,
$params['group_type']
);
}
$request = Container::getRequest();
$file = $request->files->get('picture');
if (null !== $file) {
$this->manageFileUpload($userGroup, $file);
}
}
return $id;
}
return false;
}
public function update($params, $showQuery = false)
{
$repo = Container::getUsergroupRepository();
/** @var Usergroup $userGroup */
$userGroup = $repo->find($params['id']);
if (null === $userGroup) {
return false;
}
//$params['updated_on'] = api_get_utc_datetime();
$userGroup
->setGroupType(isset($params['group_type']) ? Usergroup::SOCIAL_CLASS : Usergroup::NORMAL_CLASS)
->setAllowMembersToLeaveGroup(isset($params['allow_members_leave_group']) ? 1 : 0)
;
$cropImage = $params['picture_crop_result'] ?? null;
$picture = $_FILES['picture'] ?? null;
if (!empty($picture)) {
$request = Container::getRequest();
$file = $request->files->get('picture');
if (null !== $file) {
$this->manageFileUpload($userGroup, $file, $cropImage);
}
}
$repo->update($userGroup);
if (isset($params['delete_picture'])) {
$this->delete_group_picture($params['id']);
}
return true;
}
public function manageFileUpload(
Usergroup $userGroup,
UploadedFile $picture,
string $cropParameters = ''
): ?ResourceFile {
$illustrationRepo = Container::getIllustrationRepository();
return $illustrationRepo->addIllustration($userGroup, api_get_user_entity(), $picture, $cropParameters);
}
/**
* @param int $groupId
*
* @return string
*/
public function delete_group_picture($groupId)
{
$repo = Container::getUsergroupRepository();
$userGroup = $repo->find($groupId);
if ($userGroup) {
$illustrationRepo = Container::getIllustrationRepository();
$illustrationRepo->deleteIllustration($userGroup);
}
}
/**
* @return mixed
*/
public function getGroupType()
{
return $this->groupType;
}
/**
* @param int $id
*
* @return bool|void
*/
public function delete($id)
{
$id = (int) $id;
if ($this->getUseMultipleUrl()) {
$this->unsubscribeToUrl($id, api_get_current_access_url_id());
}
$sql = "DELETE FROM $this->usergroup_rel_user_table
WHERE usergroup_id = $id";
Database::query($sql);
$sql = "DELETE FROM $this->usergroup_rel_course_table
WHERE usergroup_id = $id";
Database::query($sql);
$sql = "DELETE FROM $this->usergroup_rel_session_table
WHERE usergroup_id = $id";
Database::query($sql);
$repo = Container::getUsergroupRepository();
$userGroup = $repo->find($id);
$repo->delete($userGroup);
}
/**
* @param int $id
* @param int $urlId
*/
public function subscribeToUrl($id, $urlId)
{
Database::insert(
$this->access_url_rel_usergroup,
[
'access_url_id' => $urlId,
'usergroup_id' => $id,
]
);
}
/**
* @param int $id
* @param int $urlId
*/
public function unsubscribeToUrl($id, $urlId)
{
Database::delete(
$this->access_url_rel_usergroup,
[
'access_url_id = ? AND usergroup_id = ? ' => [$urlId, $id],
]
);
}
/**
* @param $needle
*
* @return xajaxResponse
*/
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);
$sql = 'SELECT id, title
FROM '.Database::get_main_table(TABLE_USERGROUP).' u
WHERE title LIKE "'.$needle.'%"
ORDER BY title
LIMIT 11';
$result = Database::query($sql);
$i = 0;
while ($data = Database::fetch_array($result)) {
$i++;
if ($i <= 10) {
$return .= ''.$data['title'].'