From 9f5170e9557d7f7fc75331a68ee0df04b4ccd0e8 Mon Sep 17 00:00:00 2001 From: John Beedell Date: Tue, 30 Aug 2016 10:58:29 +0100 Subject: [PATCH] MDL-31243 access/enrol libs: move enrol functions --- lib/accesslib.php | 345 ---------------------------------------------- lib/enrollib.php | 344 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 344 insertions(+), 345 deletions(-) diff --git a/lib/accesslib.php b/lib/accesslib.php index 19033df02f0..1b89ad9339f 100644 --- a/lib/accesslib.php +++ b/lib/accesslib.php @@ -2035,98 +2035,6 @@ function is_viewing(context $context, $user = null, $withcapability = '') { return true; } -/** - * Returns true if user is enrolled (is participating) in course - * this is intended for students and teachers. - * - * Since 2.2 the result for active enrolments and current user are cached. - * - * @package core_enrol - * @category access - * - * @param context $context - * @param int|stdClass $user if null $USER is used, otherwise user object or id expected - * @param string $withcapability extra capability name - * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions - * @return bool - */ -function is_enrolled(context $context, $user = null, $withcapability = '', $onlyactive = false) { - global $USER, $DB; - - // first find the course context - $coursecontext = $context->get_course_context(); - - // make sure there is a real user specified - if ($user === null) { - $userid = isset($USER->id) ? $USER->id : 0; - } else { - $userid = is_object($user) ? $user->id : $user; - } - - if (empty($userid)) { - // not-logged-in! - return false; - } else if (isguestuser($userid)) { - // guest account can not be enrolled anywhere - return false; - } - - if ($coursecontext->instanceid == SITEID) { - // everybody participates on frontpage - } else { - // try cached info first - the enrolled flag is set only when active enrolment present - if ($USER->id == $userid) { - $coursecontext->reload_if_dirty(); - if (isset($USER->enrol['enrolled'][$coursecontext->instanceid])) { - if ($USER->enrol['enrolled'][$coursecontext->instanceid] > time()) { - if ($withcapability and !has_capability($withcapability, $context, $userid)) { - return false; - } - return true; - } - } - } - - if ($onlyactive) { - // look for active enrolments only - $until = enrol_get_enrolment_end($coursecontext->instanceid, $userid); - - if ($until === false) { - return false; - } - - if ($USER->id == $userid) { - if ($until == 0) { - $until = ENROL_MAX_TIMESTAMP; - } - $USER->enrol['enrolled'][$coursecontext->instanceid] = $until; - if (isset($USER->enrol['tempguest'][$coursecontext->instanceid])) { - unset($USER->enrol['tempguest'][$coursecontext->instanceid]); - remove_temp_course_roles($coursecontext); - } - } - - } else { - // any enrolment is good for us here, even outdated, disabled or inactive - $sql = "SELECT 'x' - FROM {user_enrolments} ue - JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid) - JOIN {user} u ON u.id = ue.userid - WHERE ue.userid = :userid AND u.deleted = 0"; - $params = array('userid'=>$userid, 'courseid'=>$coursecontext->instanceid); - if (!$DB->record_exists_sql($sql, $params)) { - return false; - } - } - } - - if ($withcapability and !has_capability($withcapability, $context, $userid)) { - return false; - } - - return true; -} - /** * Returns true if the user is able to access the course. * @@ -2244,259 +2152,6 @@ function can_access_course(stdClass $course, $user = null, $withcapability = '', return false; } -/** - * Returns array with sql code and parameters returning all ids - * of users enrolled into course. - * - * This function is using 'eu[0-9]+_' prefix for table names and parameters. - * - * @package core_enrol - * @category access - * - * @param context $context - * @param string $withcapability - * @param int $groupid 0 means ignore groups, any other value limits the result by group id - * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions - * @param bool $onlysuspended inverse of onlyactive, consider only suspended enrolments - * @return array list($sql, $params) - */ -function get_enrolled_sql(context $context, $withcapability = '', $groupid = 0, $onlyactive = false, $onlysuspended = false) { - global $DB, $CFG; - - // use unique prefix just in case somebody makes some SQL magic with the result - static $i = 0; - $i++; - $prefix = 'eu'.$i.'_'; - - // first find the course context - $coursecontext = $context->get_course_context(); - - $isfrontpage = ($coursecontext->instanceid == SITEID); - - if ($onlyactive && $onlysuspended) { - throw new coding_exception("Both onlyactive and onlysuspended are set, this is probably not what you want!"); - } - if ($isfrontpage && $onlysuspended) { - throw new coding_exception("onlysuspended is not supported on frontpage; please add your own early-exit!"); - } - - $joins = array(); - $wheres = array(); - $params = array(); - - list($contextids, $contextpaths) = get_context_info_list($context); - - // get all relevant capability info for all roles - if ($withcapability) { - list($incontexts, $cparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'ctx'); - $cparams['cap'] = $withcapability; - - $defs = array(); - $sql = "SELECT rc.id, rc.roleid, rc.permission, ctx.path - FROM {role_capabilities} rc - JOIN {context} ctx on rc.contextid = ctx.id - WHERE rc.contextid $incontexts AND rc.capability = :cap"; - $rcs = $DB->get_records_sql($sql, $cparams); - foreach ($rcs as $rc) { - $defs[$rc->path][$rc->roleid] = $rc->permission; - } - - $access = array(); - if (!empty($defs)) { - foreach ($contextpaths as $path) { - if (empty($defs[$path])) { - continue; - } - foreach($defs[$path] as $roleid => $perm) { - if ($perm == CAP_PROHIBIT) { - $access[$roleid] = CAP_PROHIBIT; - continue; - } - if (!isset($access[$roleid])) { - $access[$roleid] = (int)$perm; - } - } - } - } - - unset($defs); - - // make lists of roles that are needed and prohibited - $needed = array(); // one of these is enough - $prohibited = array(); // must not have any of these - foreach ($access as $roleid => $perm) { - if ($perm == CAP_PROHIBIT) { - unset($needed[$roleid]); - $prohibited[$roleid] = true; - } else if ($perm == CAP_ALLOW and empty($prohibited[$roleid])) { - $needed[$roleid] = true; - } - } - - $defaultuserroleid = isset($CFG->defaultuserroleid) ? $CFG->defaultuserroleid : 0; - $defaultfrontpageroleid = isset($CFG->defaultfrontpageroleid) ? $CFG->defaultfrontpageroleid : 0; - - $nobody = false; - - if ($isfrontpage) { - if (!empty($prohibited[$defaultuserroleid]) or !empty($prohibited[$defaultfrontpageroleid])) { - $nobody = true; - } else if (!empty($needed[$defaultuserroleid]) or !empty($needed[$defaultfrontpageroleid])) { - // everybody not having prohibit has the capability - $needed = array(); - } else if (empty($needed)) { - $nobody = true; - } - } else { - if (!empty($prohibited[$defaultuserroleid])) { - $nobody = true; - } else if (!empty($needed[$defaultuserroleid])) { - // everybody not having prohibit has the capability - $needed = array(); - } else if (empty($needed)) { - $nobody = true; - } - } - - if ($nobody) { - // nobody can match so return some SQL that does not return any results - $wheres[] = "1 = 2"; - - } else { - - if ($needed) { - $ctxids = implode(',', $contextids); - $roleids = implode(',', array_keys($needed)); - $joins[] = "JOIN {role_assignments} {$prefix}ra3 ON ({$prefix}ra3.userid = {$prefix}u.id AND {$prefix}ra3.roleid IN ($roleids) AND {$prefix}ra3.contextid IN ($ctxids))"; - } - - if ($prohibited) { - $ctxids = implode(',', $contextids); - $roleids = implode(',', array_keys($prohibited)); - $joins[] = "LEFT JOIN {role_assignments} {$prefix}ra4 ON ({$prefix}ra4.userid = {$prefix}u.id AND {$prefix}ra4.roleid IN ($roleids) AND {$prefix}ra4.contextid IN ($ctxids))"; - $wheres[] = "{$prefix}ra4.id IS NULL"; - } - - if ($groupid) { - $joins[] = "JOIN {groups_members} {$prefix}gm ON ({$prefix}gm.userid = {$prefix}u.id AND {$prefix}gm.groupid = :{$prefix}gmid)"; - $params["{$prefix}gmid"] = $groupid; - } - } - - } else { - if ($groupid) { - $joins[] = "JOIN {groups_members} {$prefix}gm ON ({$prefix}gm.userid = {$prefix}u.id AND {$prefix}gm.groupid = :{$prefix}gmid)"; - $params["{$prefix}gmid"] = $groupid; - } - } - - $wheres[] = "{$prefix}u.deleted = 0 AND {$prefix}u.id <> :{$prefix}guestid"; - $params["{$prefix}guestid"] = $CFG->siteguest; - - if ($isfrontpage) { - // all users are "enrolled" on the frontpage - } else { - $where1 = "{$prefix}ue.status = :{$prefix}active AND {$prefix}e.status = :{$prefix}enabled"; - $where2 = "{$prefix}ue.timestart < :{$prefix}now1 AND ({$prefix}ue.timeend = 0 OR {$prefix}ue.timeend > :{$prefix}now2)"; - $ejoin = "JOIN {enrol} {$prefix}e ON ({$prefix}e.id = {$prefix}ue.enrolid AND {$prefix}e.courseid = :{$prefix}courseid)"; - $params[$prefix.'courseid'] = $coursecontext->instanceid; - - if (!$onlysuspended) { - $joins[] = "JOIN {user_enrolments} {$prefix}ue ON {$prefix}ue.userid = {$prefix}u.id"; - $joins[] = $ejoin; - if ($onlyactive) { - $wheres[] = "$where1 AND $where2"; - } - } else { - // Suspended only where there is enrolment but ALL are suspended. - // Consider multiple enrols where one is not suspended or plain role_assign. - $enrolselect = "SELECT DISTINCT {$prefix}ue.userid FROM {user_enrolments} {$prefix}ue $ejoin WHERE $where1 AND $where2"; - $joins[] = "JOIN {user_enrolments} {$prefix}ue1 ON {$prefix}ue1.userid = {$prefix}u.id"; - $joins[] = "JOIN {enrol} {$prefix}e1 ON ({$prefix}e1.id = {$prefix}ue1.enrolid AND {$prefix}e1.courseid = :{$prefix}_e1_courseid)"; - $params["{$prefix}_e1_courseid"] = $coursecontext->instanceid; - $wheres[] = "{$prefix}u.id NOT IN ($enrolselect)"; - } - - if ($onlyactive || $onlysuspended) { - $now = round(time(), -2); // rounding helps caching in DB - $params = array_merge($params, array($prefix.'enabled'=>ENROL_INSTANCE_ENABLED, - $prefix.'active'=>ENROL_USER_ACTIVE, - $prefix.'now1'=>$now, $prefix.'now2'=>$now)); - } - } - - $joins = implode("\n", $joins); - $wheres = "WHERE ".implode(" AND ", $wheres); - - $sql = "SELECT DISTINCT {$prefix}u.id - FROM {user} {$prefix}u - $joins - $wheres"; - - return array($sql, $params); -} - -/** - * Returns list of users enrolled into course. - * - * @package core_enrol - * @category access - * - * @param context $context - * @param string $withcapability - * @param int $groupid 0 means ignore groups, any other value limits the result by group id - * @param string $userfields requested user record fields - * @param string $orderby - * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set). - * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set). - * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions - * @return array of user records - */ -function get_enrolled_users(context $context, $withcapability = '', $groupid = 0, $userfields = 'u.*', $orderby = null, - $limitfrom = 0, $limitnum = 0, $onlyactive = false) { - global $DB; - - list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive); - $sql = "SELECT $userfields - FROM {user} u - JOIN ($esql) je ON je.id = u.id - WHERE u.deleted = 0"; - - if ($orderby) { - $sql = "$sql ORDER BY $orderby"; - } else { - list($sort, $sortparams) = users_order_by_sql('u'); - $sql = "$sql ORDER BY $sort"; - $params = array_merge($params, $sortparams); - } - - return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum); -} - -/** - * Counts list of users enrolled into course (as per above function) - * - * @package core_enrol - * @category access - * - * @param context $context - * @param string $withcapability - * @param int $groupid 0 means ignore groups, any other value limits the result by group id - * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions - * @return array of user records - */ -function count_enrolled_users(context $context, $withcapability = '', $groupid = 0, $onlyactive = false) { - global $DB; - - list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive); - $sql = "SELECT count(u.id) - FROM {user} u - JOIN ($esql) je ON je.id = u.id - WHERE u.deleted = 0"; - - return $DB->count_records_sql($sql, $params); -} - /** * Loads the capability definitions for the component (from file). * diff --git a/lib/enrollib.php b/lib/enrollib.php index f42e639b23f..0df34f563b1 100644 --- a/lib/enrollib.php +++ b/lib/enrollib.php @@ -1065,6 +1065,350 @@ function enrol_accessing_via_instance(stdClass $instance) { return $DB->record_exists('user_enrolments', array('userid'=>$USER->id, 'enrolid'=>$instance->id)); } +/** + * Returns true if user is enrolled (is participating) in course + * this is intended for students and teachers. + * + * Since 2.2 the result for active enrolments and current user are cached. + * + * @package core_enrol + * @category access + * + * @param context $context + * @param int|stdClass $user if null $USER is used, otherwise user object or id expected + * @param string $withcapability extra capability name + * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions + * @return bool + */ +function is_enrolled(context $context, $user = null, $withcapability = '', $onlyactive = false) { + global $USER, $DB; + + // first find the course context + $coursecontext = $context->get_course_context(); + + // make sure there is a real user specified + if ($user === null) { + $userid = isset($USER->id) ? $USER->id : 0; + } else { + $userid = is_object($user) ? $user->id : $user; + } + + if (empty($userid)) { + // not-logged-in! + return false; + } else if (isguestuser($userid)) { + // guest account can not be enrolled anywhere + return false; + } + + if ($coursecontext->instanceid == SITEID) { + // everybody participates on frontpage + } else { + // try cached info first - the enrolled flag is set only when active enrolment present + if ($USER->id == $userid) { + $coursecontext->reload_if_dirty(); + if (isset($USER->enrol['enrolled'][$coursecontext->instanceid])) { + if ($USER->enrol['enrolled'][$coursecontext->instanceid] > time()) { + if ($withcapability and !has_capability($withcapability, $context, $userid)) { + return false; + } + return true; + } + } + } + + if ($onlyactive) { + // look for active enrolments only + $until = enrol_get_enrolment_end($coursecontext->instanceid, $userid); + + if ($until === false) { + return false; + } + + if ($USER->id == $userid) { + if ($until == 0) { + $until = ENROL_MAX_TIMESTAMP; + } + $USER->enrol['enrolled'][$coursecontext->instanceid] = $until; + if (isset($USER->enrol['tempguest'][$coursecontext->instanceid])) { + unset($USER->enrol['tempguest'][$coursecontext->instanceid]); + remove_temp_course_roles($coursecontext); + } + } + + } else { + // any enrolment is good for us here, even outdated, disabled or inactive + $sql = "SELECT 'x' + FROM {user_enrolments} ue + JOIN {enrol} e ON (e.id = ue.enrolid AND e.courseid = :courseid) + JOIN {user} u ON u.id = ue.userid + WHERE ue.userid = :userid AND u.deleted = 0"; + $params = array('userid'=>$userid, 'courseid'=>$coursecontext->instanceid); + if (!$DB->record_exists_sql($sql, $params)) { + return false; + } + } + } + + if ($withcapability and !has_capability($withcapability, $context, $userid)) { + return false; + } + + return true; +} + +/** + * Returns array with sql code and parameters returning all ids + * of users enrolled into course. + * + * This function is using 'eu[0-9]+_' prefix for table names and parameters. + * + * @package core_enrol + * @category access + * + * @param context $context + * @param string $withcapability + * @param int $groupid 0 means ignore groups, any other value limits the result by group id + * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions + * @param bool $onlysuspended inverse of onlyactive, consider only suspended enrolments + * @return array list($sql, $params) + */ +function get_enrolled_sql(context $context, $withcapability = '', $groupid = 0, $onlyactive = false, $onlysuspended = false) { + global $DB, $CFG; + + // use unique prefix just in case somebody makes some SQL magic with the result + static $i = 0; + $i++; + $prefix = 'eu'.$i.'_'; + + // first find the course context + $coursecontext = $context->get_course_context(); + + $isfrontpage = ($coursecontext->instanceid == SITEID); + + if ($onlyactive && $onlysuspended) { + throw new coding_exception("Both onlyactive and onlysuspended are set, this is probably not what you want!"); + } + if ($isfrontpage && $onlysuspended) { + throw new coding_exception("onlysuspended is not supported on frontpage; please add your own early-exit!"); + } + + $joins = array(); + $wheres = array(); + $params = array(); + + list($contextids, $contextpaths) = get_context_info_list($context); + + // get all relevant capability info for all roles + if ($withcapability) { + list($incontexts, $cparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'ctx'); + $cparams['cap'] = $withcapability; + + $defs = array(); + $sql = "SELECT rc.id, rc.roleid, rc.permission, ctx.path + FROM {role_capabilities} rc + JOIN {context} ctx on rc.contextid = ctx.id + WHERE rc.contextid $incontexts AND rc.capability = :cap"; + $rcs = $DB->get_records_sql($sql, $cparams); + foreach ($rcs as $rc) { + $defs[$rc->path][$rc->roleid] = $rc->permission; + } + + $access = array(); + if (!empty($defs)) { + foreach ($contextpaths as $path) { + if (empty($defs[$path])) { + continue; + } + foreach($defs[$path] as $roleid => $perm) { + if ($perm == CAP_PROHIBIT) { + $access[$roleid] = CAP_PROHIBIT; + continue; + } + if (!isset($access[$roleid])) { + $access[$roleid] = (int)$perm; + } + } + } + } + + unset($defs); + + // make lists of roles that are needed and prohibited + $needed = array(); // one of these is enough + $prohibited = array(); // must not have any of these + foreach ($access as $roleid => $perm) { + if ($perm == CAP_PROHIBIT) { + unset($needed[$roleid]); + $prohibited[$roleid] = true; + } else if ($perm == CAP_ALLOW and empty($prohibited[$roleid])) { + $needed[$roleid] = true; + } + } + + $defaultuserroleid = isset($CFG->defaultuserroleid) ? $CFG->defaultuserroleid : 0; + $defaultfrontpageroleid = isset($CFG->defaultfrontpageroleid) ? $CFG->defaultfrontpageroleid : 0; + + $nobody = false; + + if ($isfrontpage) { + if (!empty($prohibited[$defaultuserroleid]) or !empty($prohibited[$defaultfrontpageroleid])) { + $nobody = true; + } else if (!empty($needed[$defaultuserroleid]) or !empty($needed[$defaultfrontpageroleid])) { + // everybody not having prohibit has the capability + $needed = array(); + } else if (empty($needed)) { + $nobody = true; + } + } else { + if (!empty($prohibited[$defaultuserroleid])) { + $nobody = true; + } else if (!empty($needed[$defaultuserroleid])) { + // everybody not having prohibit has the capability + $needed = array(); + } else if (empty($needed)) { + $nobody = true; + } + } + + if ($nobody) { + // nobody can match so return some SQL that does not return any results + $wheres[] = "1 = 2"; + + } else { + + if ($needed) { + $ctxids = implode(',', $contextids); + $roleids = implode(',', array_keys($needed)); + $joins[] = "JOIN {role_assignments} {$prefix}ra3 ON ({$prefix}ra3.userid = {$prefix}u.id AND {$prefix}ra3.roleid IN ($roleids) AND {$prefix}ra3.contextid IN ($ctxids))"; + } + + if ($prohibited) { + $ctxids = implode(',', $contextids); + $roleids = implode(',', array_keys($prohibited)); + $joins[] = "LEFT JOIN {role_assignments} {$prefix}ra4 ON ({$prefix}ra4.userid = {$prefix}u.id AND {$prefix}ra4.roleid IN ($roleids) AND {$prefix}ra4.contextid IN ($ctxids))"; + $wheres[] = "{$prefix}ra4.id IS NULL"; + } + + if ($groupid) { + $joins[] = "JOIN {groups_members} {$prefix}gm ON ({$prefix}gm.userid = {$prefix}u.id AND {$prefix}gm.groupid = :{$prefix}gmid)"; + $params["{$prefix}gmid"] = $groupid; + } + } + + } else { + if ($groupid) { + $joins[] = "JOIN {groups_members} {$prefix}gm ON ({$prefix}gm.userid = {$prefix}u.id AND {$prefix}gm.groupid = :{$prefix}gmid)"; + $params["{$prefix}gmid"] = $groupid; + } + } + + $wheres[] = "{$prefix}u.deleted = 0 AND {$prefix}u.id <> :{$prefix}guestid"; + $params["{$prefix}guestid"] = $CFG->siteguest; + + if ($isfrontpage) { + // all users are "enrolled" on the frontpage + } else { + $where1 = "{$prefix}ue.status = :{$prefix}active AND {$prefix}e.status = :{$prefix}enabled"; + $where2 = "{$prefix}ue.timestart < :{$prefix}now1 AND ({$prefix}ue.timeend = 0 OR {$prefix}ue.timeend > :{$prefix}now2)"; + $ejoin = "JOIN {enrol} {$prefix}e ON ({$prefix}e.id = {$prefix}ue.enrolid AND {$prefix}e.courseid = :{$prefix}courseid)"; + $params[$prefix.'courseid'] = $coursecontext->instanceid; + + if (!$onlysuspended) { + $joins[] = "JOIN {user_enrolments} {$prefix}ue ON {$prefix}ue.userid = {$prefix}u.id"; + $joins[] = $ejoin; + if ($onlyactive) { + $wheres[] = "$where1 AND $where2"; + } + } else { + // Suspended only where there is enrolment but ALL are suspended. + // Consider multiple enrols where one is not suspended or plain role_assign. + $enrolselect = "SELECT DISTINCT {$prefix}ue.userid FROM {user_enrolments} {$prefix}ue $ejoin WHERE $where1 AND $where2"; + $joins[] = "JOIN {user_enrolments} {$prefix}ue1 ON {$prefix}ue1.userid = {$prefix}u.id"; + $joins[] = "JOIN {enrol} {$prefix}e1 ON ({$prefix}e1.id = {$prefix}ue1.enrolid AND {$prefix}e1.courseid = :{$prefix}_e1_courseid)"; + $params["{$prefix}_e1_courseid"] = $coursecontext->instanceid; + $wheres[] = "{$prefix}u.id NOT IN ($enrolselect)"; + } + + if ($onlyactive || $onlysuspended) { + $now = round(time(), -2); // rounding helps caching in DB + $params = array_merge($params, array($prefix.'enabled'=>ENROL_INSTANCE_ENABLED, + $prefix.'active'=>ENROL_USER_ACTIVE, + $prefix.'now1'=>$now, $prefix.'now2'=>$now)); + } + } + + $joins = implode("\n", $joins); + $wheres = "WHERE ".implode(" AND ", $wheres); + + $sql = "SELECT DISTINCT {$prefix}u.id + FROM {user} {$prefix}u + $joins + $wheres"; + + return array($sql, $params); +} + +/** + * Returns list of users enrolled into course. + * + * @package core_enrol + * @category access + * + * @param context $context + * @param string $withcapability + * @param int $groupid 0 means ignore groups, any other value limits the result by group id + * @param string $userfields requested user record fields + * @param string $orderby + * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set). + * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set). + * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions + * @return array of user records + */ +function get_enrolled_users(context $context, $withcapability = '', $groupid = 0, $userfields = 'u.*', $orderby = null, + $limitfrom = 0, $limitnum = 0, $onlyactive = false) { + global $DB; + + list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive); + $sql = "SELECT $userfields + FROM {user} u + JOIN ($esql) je ON je.id = u.id + WHERE u.deleted = 0"; + + if ($orderby) { + $sql = "$sql ORDER BY $orderby"; + } else { + list($sort, $sortparams) = users_order_by_sql('u'); + $sql = "$sql ORDER BY $sort"; + $params = array_merge($params, $sortparams); + } + + return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum); +} + +/** + * Counts list of users enrolled into course (as per above function) + * + * @package core_enrol + * @category access + * + * @param context $context + * @param string $withcapability + * @param int $groupid 0 means ignore groups, any other value limits the result by group id + * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions + * @return array of user records + */ +function count_enrolled_users(context $context, $withcapability = '', $groupid = 0, $onlyactive = false) { + global $DB; + + list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive); + $sql = "SELECT count(u.id) + FROM {user} u + JOIN ($esql) je ON je.id = u.id + WHERE u.deleted = 0"; + + return $DB->count_records_sql($sql, $params); +} /** * All enrol plugins should be based on this class,