public static function study_groups_list()

in classes/feature/usergroups/utils.php [368:455]


    public static function study_groups_list($userid, $filter, $manage = true, $start = 0, $max = 5, $mode = false) {
        global $DB;
        if (empty($filter['courseid']) || !empty($filter['courseid']) && $filter['courseid'] == SITEID) {
            // Quering for all moodle groups that user has access to.
            if (is_siteadmin($userid) && $manage) {
                // This user is a site admin and can access all groups.
                $moodlegroups = $DB->get_records('groups', [], 'name', '*', $start, $max + 1);
            } else {
                if ($manage) {
                    // Get groups that user can manage.
                    $roles = get_roles_with_capability('local/o365:managegroups', CAP_ALLOW);
                    if (empty($roles)) {
                        // No roles with capability, than user does not have access.
                        return [];
                    }
                    $roleids = [];
                    foreach ($roles as $role) {
                        $roleids[] = $role->id;
                    }
                    [$rolesql, $roleparams] = $DB->get_in_or_equal($roleids);
                    $params = array_merge($roleparams, [$userid]);
                    $groupssql = 'SELECT DISTINCT g.id id, g.name, g.courseid
                                    FROM {groups} g, {role_assignments} ra, {context} c
                                   WHERE ra.roleid '.$rolesql.'
                                         AND ra.userid = ?
                                         AND ra.contextid = c.id
                                         AND contextlevel = '.CONTEXT_COURSE.'
                                         AND g.courseid = c.instanceid
                                ORDER BY g.name';
                    $moodlegroups = $DB->get_records_sql($groupssql, $params);
                } else {
                    // Get groups that user is enroled in.
                    $groupssql = 'SELECT DISTINCT g.id id, g.name, g.courseid
                                    FROM {groups} g, {groups_members} gm
                                   WHERE gm.userid = ?
                                         AND gm.groupid = g.id
                                ORDER BY g.name';
                    $moodlegroups = $DB->get_records_sql($groupssql, [$userid]);
                }
            }
        } else {
            // Retrieve groups by filter.
            $moodlegroups = $DB->get_records('groups', $filter, 'name', 'id,name,courseid');
        }

        // Ensure that user can access the group.
        if ($manage) {
            $capability = 'moodle/course:managegroups';
        } else {
            $capability = 'local/o365:viewgroups';
        }

        $grouplist = [];
        $groupcount = 0;
        foreach ($moodlegroups as $moodlegroup) {
            $context = \context_course::instance($moodlegroup->courseid);
            if (!has_capability($capability, $context, $userid)) {
                continue;
            }
            if ($groupcount < $max) {
                if (empty($moodlegroup->groupid) && !empty($moodlegroup->id)) {
                    $moodlegroup->groupid = $moodlegroup->id;
                }
                $params = ['courseid' => $moodlegroup->courseid, 'groupid' => $moodlegroup->id];
                if ($manage) {
                    $groupurl = new \moodle_url('/local/o365/groupcp.php', $params);
                } else {
                    $groupurl = new \moodle_url('/local/o365/groupcp.php', $params);
                }
                if ($mode == 1) {
                    $grouplist[] = $groupurl->out(false);
                } else if ($mode == 2) {
                    $grouplist[] = $moodlegroup;
                } else {
                    $attr = ['class' => 'servicelink'];
                    $grouplist[] = \html_writer::link($groupurl, $moodlegroup->name, $attr);
                }
                $groupcount++;
            }
        }
        if (count($moodlegroups) > $max && !$mode) {
            $morestr = get_string('groups_more', 'local_o365');
            $moreurl = new \moodle_url('/local/o365/groupcp.php',
                ['action' => 'managecoursegroups', 'courseid' => $filter['courseid']]);
            $grouplist[] = \html_writer::link($moreurl, $morestr, ['class' => 'servicelink']);
        }
        return $grouplist;
    }