mirror of
https://github.com/moodle/moodle.git
synced 2025-04-15 13:33:52 +02:00
MDL-31243 access/enrol libs: move enrol functions
This commit is contained in:
parent
ddd8dc0d1b
commit
9f5170e955
@ -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).
|
||||
*
|
||||
|
344
lib/enrollib.php
344
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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user