$context_cache_id = array(); // Index to above cache by id
+/**
+ * Loads the capabilities for the default guest role to the current user in a specific context
+ * @return object
+ */
+function load_guest_role($context=NULL) {
+ global $USER;
+
+ static $guestrole;
+
+ if (!isloggedin()) {
+ return false;
+ }
+
+ if (!$sitecontext = get_context_instance(CONTEXT_SYSTEM, SITEID)) {
+ return false;
+ }
+
+ if (empty($context)) {
+ $context = $sitecontext;
+ }
+
+ if (empty($guestrole)) {
+ if ($roles = get_roles_with_capability('moodle/legacy:guest', CAP_ALLOW)) {
+ $guestrole = array_shift($roles); // Pick the first one
+ } else {
+ return false;
+ }
+ }
+
+ if ($capabilities = get_records_select('role_capabilities',
+ "roleid = $guestrole->id AND contextid = $sitecontext->id")) {
+ foreach ($capabilities as $capability) {
+ $USER->capabilities[$context->id][$capability->capability] = $capability->permission;
+ }
+ }
+
+ return true;
+}
+
/**
* Load default not logged in role capabilities when user is not logged in
* @return bool
foreach ($roles as $role) {
// Assign a site level capability.
- if(!assign_capability($capability, $perm, $role->id, $systemcontext->id)) {
+ if (!assign_capability($capability, $perm, $role->id, $systemcontext->id)) {
return false;
}
}
* @param roleid - role id
* @param permission - int 1,-1 or -1000
*/
-function assign_capability($capability, $permission, $roleid, $contextid) {
+function assign_capability($capability, $permission, $roleid, $contextid, $overwrite=false) {
global $USER;
unassign_capability($capability, $roleid, $contextid);
}
+ $existing = get_record('role_capabilities', 'contextid', $contextid, 'roleid', $capability, $capability);
+
+ if ($existing and !$overwrite) { // We want to keep whatever is there already
+ return true;
+ }
+
$cap = new object;
$cap->contextid = $contextid;
$cap->roleid = $roleid;
$cap->permission = $permission;
$cap->timemodified = time();
$cap->modifierid = empty($USER->id) ? 0 : $USER->id;
-
- return insert_record('role_capabilities', $cap);
+
+ if ($existing) {
+ $cap->id = $existing->id;
+ return update_record('role_capabilities', $cap);
+ } else {
+ return insert_record('role_capabilities', $cap);
+ }
}