<?php
-
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
/**
* Category enrolment plugin.
*
- * @package enrol
- * @subpackage category
+ * @package enrol_category
* @copyright 2010 Petr Skoda {@link http://skodak.org}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+
/**
* category enrolment plugin implementation.
- * @author Petr Skoda
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ * @author Petr Skoda
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class enrol_category_plugin extends enrol_plugin {
/**
* Is it possible to delete enrol instance via standard UI?
*
- * @param object $instance
+ * @param stdClass $instance
* @return bool
*/
public function instance_deleteable($instance) {
if (!enrol_is_enabled('category')) {
return true;
}
- // allow delete only when no synced users here
+ // Allow delete only when no synced users here.
return !$DB->record_exists('user_enrolments', array('enrolid'=>$instance->id));
}
* @return moodle_url page url
*/
public function get_newinstance_link($courseid) {
- // instances are added automatically as necessary
- return NULL;
+ // Instances are added automatically as necessary.
+ return null;
}
/**
* Called after updating/inserting course.
*
* @param bool $inserted true if course just inserted
- * @param object $course
- * @param object $data form data
+ * @param stdClass $course
+ * @param stdClass $data form data
* @return void
*/
public function course_updated($inserted, $course, $data) {
return;
}
- // sync category enrols
+ // Sync category enrols.
require_once("$CFG->dirroot/enrol/category/locallib.php");
enrol_category_sync_course($course);
}
}
-
-
<?php
-
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
/**
* Local stuff for category enrolment plugin.
*
- * @package enrol
- * @subpackage category
+ * @package enrol_category
* @copyright 2010 Petr Skoda {@link http://skodak.org}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
+
/**
* Event handler for category enrolment plugin.
*
* it may fail sometimes, so we always do a full sync in cron too.
*/
class enrol_category_handler {
+ /**
+ * Triggered when user is assigned a new role.
+ * @static
+ * @param stdClass $ra
+ * @return bool
+ */
public static function role_assigned($ra) {
global $DB;
return true;
}
- //only category level roles are interesting
+ // Only category level roles are interesting.
$parentcontext = get_context_instance_by_id($ra->contextid);
if ($parentcontext->contextlevel != CONTEXT_COURSECAT) {
return true;
}
- // make sure the role is to be actually synchronised
- // please note we are ignoring overrides of the synchronised capability (for performance reasons in full sync)
- $syscontext = get_context_instance(CONTEXT_SYSTEM);
+ // Make sure the role is to be actually synchronised,
+ // please note we are ignoring overrides of the synchronised capability (for performance reasons in full sync).
+ $syscontext = context_system::instance();
if (!$DB->record_exists('role_capabilities', array('contextid'=>$syscontext->id, 'roleid'=>$ra->roleid, 'capability'=>'enrol/category:synchronised', 'permission'=>CAP_ALLOW))) {
return true;
}
- // add necessary enrol instances
+ // Add necessary enrol instances.
$plugin = enrol_get_plugin('category');
$sql = "SELECT c.*
FROM {course} c
}
$rs->close();
- // now look for missing enrols
+ // Now look for missing enrolments.
$sql = "SELECT e.*
FROM {course} c
JOIN {context} ctx ON (ctx.instanceid = c.id AND ctx.contextlevel = :courselevel AND ctx.path LIKE :match)
return true;
}
+ /**
+ * Triggered when user role is unassigned.
+ * @static
+ * @param stdClass $ra
+ * @return bool
+ */
public static function role_unassigned($ra) {
global $DB;
return true;
}
- // only category level roles are interesting
+ // Only category level roles are interesting.
$parentcontext = get_context_instance_by_id($ra->contextid);
if ($parentcontext->contextlevel != CONTEXT_COURSECAT) {
return true;
}
- // now this is going to be a bit slow, take all enrolments in child courses and verify each separately
- $syscontext = get_context_instance(CONTEXT_SYSTEM);
+ // Now this is going to be a bit slow, take all enrolments in child courses and verify each separately.
+ $syscontext = context_system::instance();
if (!$roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext)) {
return true;
}
$params['userid'] = $ra->userid;
foreach ($rs as $instance) {
- $coursecontext = get_context_instance(CONTEXT_COURSE, $instance->courseid);
+ $coursecontext = context_course::instance($instance->courseid);
$contextids = get_parent_contexts($coursecontext);
- array_pop($contextids); // remove system context, we are interested in categories only
+ array_pop($contextids); // Remove system context, we are interested in categories only.
list($contextids, $contextparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'c');
$params = array_merge($params, $contextparams);
FROM {role_assignments} ra
WHERE ra.userid = :userid AND ra.contextid $contextids AND ra.roleid $roleids";
if (!$DB->record_exists_sql($sql, $params)) {
- // user does not have any interesting role in any parent context, let's unenrol
+ // User does not have any interesting role in any parent context, let's unenrol.
$plugin->unenrol_user($instance, $ra->userid);
}
}
/**
* Sync all category enrolments in one course
- * @param int $courseid course id
+ * @param stdClass $course
* @return void
*/
function enrol_category_sync_course($course) {
$plugin = enrol_get_plugin('category');
- $syscontext = get_context_instance(CONTEXT_SYSTEM);
+ $syscontext = context_system::instance();
$roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext);
if (!$roles) {
- //nothing to sync, so remove the instance completely if exists
+ // Nothing to sync, so remove the instance completely if exists.
if ($instances = $DB->get_records('enrol', array('courseid'=>$course->id, 'enrol'=>'category'))) {
foreach ($instances as $instance) {
$plugin->delete_instance($instance);
return;
}
- // first find out if any parent category context contains interesting role assignments
- $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
+ // First find out if any parent category context contains interesting role assignments.
+ $coursecontext = context_course::instance($course->id);
$contextids = get_parent_contexts($coursecontext);
- array_pop($contextids); // remove system context, we are interested in categories only
+ array_pop($contextids); // Remove system context, we are interested in categories only.
list($roleids, $params) = $DB->get_in_or_equal(array_keys($roles), SQL_PARAMS_NAMED, 'r');
list($contextids, $contextparams) = $DB->get_in_or_equal($contextids, SQL_PARAMS_NAMED, 'c');
WHERE roleid $roleids AND contextid $contextids";
if (!$DB->record_exists_sql($sql, $params)) {
if ($instances = $DB->get_records('enrol', array('courseid'=>$course->id, 'enrol'=>'category'))) {
- // should be max one instance, but anyway
+ // Should be max one instance, but anyway.
foreach ($instances as $instance) {
$plugin->delete_instance($instance);
}
return;
}
- // make sure the enrol instance exists - there should be always only one instance
+ // Make sure the enrol instance exists - there should be always only one instance.
$delinstances = array();
if ($instances = $DB->get_records('enrol', array('courseid'=>$course->id, 'enrol'=>'category'))) {
$instance = array_shift($instances);
$instance = $DB->get_record('enrol', array('id'=>$i));
}
- // add new enrolments
+ // Add new enrolments.
$sql = "SELECT ra.userid, ra.estart
FROM (SELECT xra.userid, MIN(xra.timemodified) AS estart
FROM {role_assignments} xra
}
$rs->close();
- // remove unwanted enrolments
+ // Remove unwanted enrolments.
$sql = "SELECT DISTINCT ue.userid
FROM {user_enrolments} ue
LEFT JOIN {role_assignments} ra ON (ra.roleid $roleids AND ra.contextid $contextids AND ra.userid = ue.userid)
$rs->close();
if ($delinstances) {
- // we have to do this as the last step in order to prevent temporary unenrolment
+ // We have to do this as the last step in order to prevent temporary unenrolment.
foreach ($delinstances as $delinstance) {
$plugin->delete_instance($delinstance);
}
}
}
+/**
+ * Synchronise courses in all categories.
+ *
+ * It gets out-of-sync if:
+ * - you move course to different category
+ * - reorder categories
+ * - disable enrol_category and enable it again
+ *
+ * @param bool $verbose
+ * @return int exit code - 0 is ok, 1 means error, 2 if plugin disabled
+ */
function enrol_category_sync_full($verbose = false) {
global $DB;
return 2;
}
- // we may need a lot of time here
+ // We may need a lot of time here.
@set_time_limit(0);
$plugin = enrol_get_plugin('category');
- $syscontext = get_context_instance(CONTEXT_SYSTEM);
+ $syscontext = context_system::instance();
- // any interesting roles worth synchronising?
+ // Any interesting roles worth synchronising?
if (!$roles = get_roles_with_capability('enrol/category:synchronised', CAP_ALLOW, $syscontext)) {
// yay, nothing to do, so let's remove all leftovers
if ($verbose) {
$params['courselevel'] = CONTEXT_COURSE;
$params['catlevel'] = CONTEXT_COURSECAT;
- // first of all add necessary enrol instances to all courses
+ // First of all add necessary enrol instances to all courses.
$parentcat = $DB->sql_concat("cat.path", "'/%'");
$parentcctx = $DB->sql_concat("cctx.path", "'/%'");
- // need whole course records to be used by add_instance(), use inner view (ci) to
+ // Need whole course records to be used by add_instance(), use inner view (ci) to
// get distinct records only.
// TODO: Moodle 2.1. Improve enrol API to accept courseid / courserec
$sql = "SELECT c.*
}
$rs->close();
- // now look for courses that do not have any interesting roles in parent contexts,
- // but still have the instance and delete them
+ // Now look for courses that do not have any interesting roles in parent contexts,
+ // but still have the instance and delete them.
$sql = "SELECT e.*
FROM {enrol} e
JOIN {context} ctx ON (ctx.instanceid = e.courseid AND ctx.contextlevel = :courselevel)
}
$rs->close();
- // add missing enrolments
+ // Add missing enrolments.
$sql = "SELECT e.*, cat.userid, cat.estart
FROM {enrol} e
JOIN {context} ctx ON (ctx.instanceid = e.courseid AND ctx.contextlevel = :courselevel)
}
$rs->close();
- // remove stale enrolments
+ // Remove stale enrolments.
$sql = "SELECT e.*, ue.userid
FROM {enrol} e
JOIN {context} ctx ON (ctx.instanceid = e.courseid AND ctx.contextlevel = :courselevel)