diff --git a/enrol/ajax.php b/enrol/ajax.php index 0b344f2a020..8a0bdfc09a7 100644 --- a/enrol/ajax.php +++ b/enrol/ajax.php @@ -63,7 +63,7 @@ switch ($action) { case 'unenrol': $ue = $DB->get_record('user_enrolments', array('id'=>required_param('ue', PARAM_INT)), '*', MUST_EXIST); list ($instance, $plugin) = $manager->get_user_enrolment_components($ue); - if (!$instance || !$plugin || !$plugin->allow_unenrol($instance) || !has_capability("enrol/$instance->enrol:unenrol", $manager->get_context()) || !$manager->unenrol_user($ue)) { + if (!$instance || !$plugin || !$plugin->allow_unenrol_user($instance, $ue) || !has_capability("enrol/$instance->enrol:unenrol", $manager->get_context()) || !$manager->unenrol_user($ue)) { throw new enrol_ajax_exception('unenrolnotpermitted'); } break; diff --git a/enrol/bulkchange.php b/enrol/bulkchange.php index d9d44261bd6..d033a56ed67 100644 --- a/enrol/bulkchange.php +++ b/enrol/bulkchange.php @@ -31,7 +31,7 @@ require_once("$CFG->dirroot/group/lib.php"); $id = required_param('id', PARAM_INT); // course id $bulkuserop = required_param('bulkuserop', PARAM_ALPHANUMEXT); -$userids = required_param('bulkuser', PARAM_INT); +$userids = required_param_array('bulkuser', PARAM_INT); $action = optional_param('action', '', PARAM_ACTION); $filter = optional_param('ifilter', 0, PARAM_INT); diff --git a/enrol/locallib.php b/enrol/locallib.php index a2a6a204654..fb2663e13fd 100644 --- a/enrol/locallib.php +++ b/enrol/locallib.php @@ -506,7 +506,7 @@ class course_enrolment_manager { public function unenrol_user($ue) { global $DB; list ($instance, $plugin) = $this->get_user_enrolment_components($ue); - if ($instance && $plugin && $plugin->allow_unenrol($instance) && has_capability("enrol/$instance->enrol:unenrol", $this->context)) { + if ($instance && $plugin && $plugin->allow_unenrol_user($instance, $ue) && has_capability("enrol/$instance->enrol:unenrol", $this->context)) { $plugin->unenrol_user($instance, $ue->userid); return true; } diff --git a/enrol/manual/lib.php b/enrol/manual/lib.php index 92d5e74b160..b2e8501812f 100644 --- a/enrol/manual/lib.php +++ b/enrol/manual/lib.php @@ -79,7 +79,8 @@ class enrol_manual_plugin extends enrol_plugin { * * By defaults looks for manage.php file and tests for manage capability. * - * @param object $instance + * @param navigation_node $instancesnode + * @param stdClass $instance * @return moodle_url; */ public function add_course_navigation($instancesnode, stdClass $instance) { @@ -263,8 +264,8 @@ class enrol_manual_plugin extends enrol_plugin { $instance = $ue->enrolmentinstance; $params = $manager->get_moodlepage()->url->params(); $params['ue'] = $ue->id; - if ($this->allow_unenrol($instance) && has_capability("enrol/manual:unenrol", $context)) { - $url = new moodle_url('/enrol/manual/unenroluser.php', $params); + if ($this->allow_unenrol_user($instance, $ue) && has_capability("enrol/manual:unenrol", $context)) { + $url = new moodle_url('/enrol/unenroluser.php', $params); $actions[] = new user_enrolment_action(new pix_icon('t/delete', ''), get_string('unenrol', 'enrol'), $url, array('class'=>'unenrollink', 'rel'=>$ue->id)); } if ($this->allow_manage($instance) && has_capability("enrol/manual:manage", $context)) { @@ -276,6 +277,7 @@ class enrol_manual_plugin extends enrol_plugin { /** * The manual plugin has several bulk operations that can be performed + * @param course_enrolment_manager $manager * @return array */ public function get_bulk_operations(course_enrolment_manager $manager) { diff --git a/enrol/manual/locallib.php b/enrol/manual/locallib.php index b2bfb82d72e..2a25af75c6c 100644 --- a/enrol/manual/locallib.php +++ b/enrol/manual/locallib.php @@ -348,7 +348,7 @@ class enrol_manual_deleteselectedusers_operation extends enrol_bulk_enrolment_op foreach ($user->enrolments as $enrolment) { $plugin = $enrolment->enrolmentplugin; $instance = $enrolment->enrolmentinstance; - if ($plugin->allow_unenrol($instance)) { + if ($plugin->allow_unenrol_user($instance, $enrolment)) { $plugin->unenrol_user($instance, $user->id); } } diff --git a/enrol/manual/unenroluser.php b/enrol/manual/unenroluser.php deleted file mode 100644 index 4157ed984a5..00000000000 --- a/enrol/manual/unenroluser.php +++ /dev/null @@ -1,96 +0,0 @@ -. - -/** - * Unenrol a user who was enrolled through a manual enrolment. - * - * Please note when unenrolling a user all of their grades are removed as well. - * - * @package enrol - * @subpackage manual - * @copyright 2011 Sam Hemelryk - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -require('../../config.php'); -require_once("$CFG->dirroot/enrol/locallib.php"); -require_once("$CFG->dirroot/enrol/renderer.php"); - -$ueid = required_param('ue', PARAM_INT); // user enrolment id -$filter = optional_param('ifilter', 0, PARAM_INT); -$confirm = optional_param('confirm', false, PARAM_BOOL); - -// Get the user enrolment object -$ue = $DB->get_record('user_enrolments', array('id' => $ueid), '*', MUST_EXIST); -// Get the user for whom the enrolment is -$user = $DB->get_record('user', array('id'=>$ue->userid), '*', MUST_EXIST); -// Get the course the enrolment is to -list($ctxsql, $ctxjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx'); -$sql = "SELECT c.* $ctxsql - FROM {course} c - LEFT JOIN {enrol} e ON e.courseid = c.id - $ctxjoin - WHERE e.id = :enrolid"; -$params = array('enrolid' => $ue->enrolid); -$course = $DB->get_record_sql($sql, $params, MUST_EXIST); -context_instance_preload($course); - -if ($course->id == SITEID) { - redirect(new moodle_url('/')); -} - -require_login($course); -require_capability("enrol/manual:unenrol", get_context_instance(CONTEXT_COURSE, $course->id, MUST_EXIST)); - -$manager = new course_enrolment_manager($PAGE, $course, $filter); -$table = new course_enrolment_users_table($manager, $PAGE); - -// The URL of the enrolled users page for the course. -$usersurl = new moodle_url('/enrol/users.php', array('id' => $course->id)); -// The URl to return the user too after this screen. -$returnurl = new moodle_url($usersurl, $manager->get_url_params()+$table->get_url_params()); -// The URL of this page -$url = new moodle_url('/enrol/manual/unenroluser.php', $returnurl->params()); -$url->param('ue', $ueid); - -$PAGE->set_url($url); -$PAGE->set_pagelayout('admin'); -navigation_node::override_active_url($usersurl); - -list($instance, $plugin) = $manager->get_user_enrolment_components($ue); -if (!$plugin->allow_unenrol($instance) || $instance->enrol != 'manual' || !($plugin instanceof enrol_manual_plugin)) { - print_error('erroreditenrolment', 'enrol'); -} - -// If the unenrolment has been confirmed and the sesskey is valid unenrol the user. -if ($confirm && confirm_sesskey() && $manager->unenrol_user($ue)) { - redirect($returnurl); -} - -$yesurl = new moodle_url($PAGE->url, array('confirm'=>1, 'sesskey'=>sesskey())); -$message = get_string('unenroluser', 'enrol_manual', array('user'=>fullname($user, true), 'course'=>format_string($course->fullname))); -$fullname = fullname($user); -$title = get_string('unenrol', 'enrol_manual'); - -$PAGE->set_title($title); -$PAGE->set_heading($title); -$PAGE->navbar->add($title); -$PAGE->navbar->add($fullname); - -echo $OUTPUT->header(); -echo $OUTPUT->heading($fullname); -echo $OUTPUT->confirm($message, $yesurl, $returnurl); -echo $OUTPUT->footer(); \ No newline at end of file diff --git a/enrol/self/lib.php b/enrol/self/lib.php index 378b54ad907..2e425a6791a 100644 --- a/enrol/self/lib.php +++ b/enrol/self/lib.php @@ -363,7 +363,7 @@ class enrol_self_plugin extends enrol_plugin { $params = $manager->get_moodlepage()->url->params(); $params['ue'] = $ue->id; if ($this->allow_unenrol($instance) && has_capability("enrol/self:unenrol", $context)) { - $url = new moodle_url('/enrol/self/unenroluser.php', $params); + $url = new moodle_url('/enrol/unenroluser.php', $params); $actions[] = new user_enrolment_action(new pix_icon('t/delete', ''), get_string('unenrol', 'enrol'), $url, array('class'=>'unenrollink', 'rel'=>$ue->id)); } if ($this->allow_manage($instance) && has_capability("enrol/self:manage", $context)) { diff --git a/enrol/self/unenroluser.php b/enrol/self/unenroluser.php deleted file mode 100644 index a0c670409b0..00000000000 --- a/enrol/self/unenroluser.php +++ /dev/null @@ -1,101 +0,0 @@ -. - -/** - * Unenrol a user who was enrolled through a self enrolment. - * - * @package enrol - * @subpackage self - * @copyright 2011 Sam Hemelryk - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -require('../../config.php'); -require_once("$CFG->dirroot/enrol/locallib.php"); -require_once("$CFG->dirroot/enrol/renderer.php"); - -$ueid = required_param('ue', PARAM_INT); // user enrolment id -$filter = optional_param('ifilter', 0, PARAM_INT); -$confirm = optional_param('confirm', false, PARAM_BOOL); - -// Get the user enrolment object -$ue = $DB->get_record('user_enrolments', array('id' => $ueid), '*', MUST_EXIST); -// Get the user for whom the enrolment is -$user = $DB->get_record('user', array('id'=>$ue->userid), '*', MUST_EXIST); -// Get the course the enrolment is to -list($ctxsql, $ctxjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx'); -$sql = "SELECT c.* $ctxsql - FROM {course} c - LEFT JOIN {enrol} e ON e.courseid = c.id - $ctxjoin - WHERE e.id = :enrolid"; -$params = array('enrolid' => $ue->enrolid); -$course = $DB->get_record_sql($sql, $params, MUST_EXIST); -context_instance_preload($course); - -// Make sure it's not the front page -if ($course->id == SITEID) { - redirect(new moodle_url('/')); -} - -// Obviously -require_login($course); -// Make sure the user can unenrol self enrolled users. -require_capability("enrol/self:unenrol", get_context_instance(CONTEXT_COURSE, $course->id)); - -// Get the enrolment manager for this course -$manager = new course_enrolment_manager($PAGE, $course, $filter); -// Get an enrolment users table object. Doign this will automatically retrieve the the URL params -// relating to table the user was viewing before coming here, and allows us to return the user to the -// exact page of the users screen they can from. -$table = new course_enrolment_users_table($manager, $PAGE); - -// The URL of the enrolled users page for the course. -$usersurl = new moodle_url('/enrol/users.php', array('id' => $course->id)); -// The URl to return the user too after this screen. -$returnurl = new moodle_url($usersurl, $manager->get_url_params()+$table->get_url_params()); -// The URL of this page -$url = new moodle_url('/enrol/self/unenroluser.php', $returnurl->params()); -$url->param('ue', $ueid); - -$PAGE->set_url($url); -$PAGE->set_pagelayout('admin'); -navigation_node::override_active_url($usersurl); - -list($instance, $plugin) = $manager->get_user_enrolment_components($ue); -if (!$plugin->allow_unenrol($instance) || $instance->enrol != 'self' || !($plugin instanceof enrol_self_plugin)) { - print_error('erroreditenrolment', 'enrol'); -} - -// If the unenrolment has been confirmed and the sesskey is valid unenrol the user. -if ($confirm && confirm_sesskey() && $manager->unenrol_user($ue)) { - redirect($returnurl); -} - -$yesurl = new moodle_url($PAGE->url, array('confirm'=>1, 'sesskey'=>sesskey())); -$message = get_string('unenroluser', 'enrol_self', array('user' => fullname($user, true), 'course' => format_string($course->fullname))); -$fullname = fullname($user); -$title = get_string('unenrol', 'enrol_self'); - -$PAGE->set_title($title); -$PAGE->set_heading($title); -$PAGE->navbar->add($title); -$PAGE->navbar->add($fullname); - -echo $OUTPUT->header(); -echo $OUTPUT->heading($fullname); -echo $OUTPUT->confirm($message, $yesurl, $returnurl); -echo $OUTPUT->footer(); \ No newline at end of file diff --git a/enrol/unenroluser.php b/enrol/unenroluser.php new file mode 100644 index 00000000000..08a75f5ee52 --- /dev/null +++ b/enrol/unenroluser.php @@ -0,0 +1,87 @@ +. + +/** + * Completely unenrol a user from a course. + * + * Please note when unenrolling a user all of their grades are removed as well, + * most ppl actually expect enrolments to be suspended only... + * + * @package core + * @subpackage enrol + * @copyright 2011 Petr skoda + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require('../config.php'); +require_once("$CFG->dirroot/enrol/locallib.php"); +require_once("$CFG->dirroot/enrol/renderer.php"); + +$ueid = required_param('ue', PARAM_INT); // user enrolment id +$confirm = optional_param('confirm', false, PARAM_BOOL); +$filter = optional_param('ifilter', 0, PARAM_INT); + +$ue = $DB->get_record('user_enrolments', array('id' => $ueid), '*', MUST_EXIST); +$user = $DB->get_record('user', array('id'=>$ue->userid), '*', MUST_EXIST); +$instance = $DB->get_record('enrol', array('id'=>$ue->enrolid), '*', MUST_EXIST); +$course = $DB->get_record('course', array('id'=>$instance->courseid), '*', MUST_EXIST); + +$context = context_course::instance($course->id); + +// set up PAGE url first! +$PAGE->set_url('/enrol/unenroluser.php', array('ue'=>$ueid, 'ifilter'=>$filter)); + +require_login($course); + +if (!enrol_is_enabled($instance->enrol)) { + print_error('erroreditenrolment', 'enrol'); +} + +$plugin = enrol_get_plugin($instance->enrol); + +if (!$plugin->allow_unenrol_user($instance, $ue) or !has_capability("enrol/$instance->enrol:unenrol", $context)) { + print_error('erroreditenrolment', 'enrol'); +} + +$manager = new course_enrolment_manager($PAGE, $course, $filter); +$table = new course_enrolment_users_table($manager, $PAGE); + +$returnurl = new moodle_url('/enrol/users.php', array('id' => $course->id)+$manager->get_url_params()+$table->get_url_params()); +$usersurl = new moodle_url('/enrol/users.php', array('id' => $course->id)); + +$PAGE->set_pagelayout('admin'); +navigation_node::override_active_url($usersurl); + +// If the unenrolment has been confirmed and the sesskey is valid unenrol the user. +if ($confirm && confirm_sesskey()) { + $plugin->unenrol_user($instance, $ue->userid); + redirect($returnurl); +} + +$yesurl = new moodle_url($PAGE->url, array('confirm'=>1, 'sesskey'=>sesskey())); +$message = get_string('unenrolconfirm', 'core_enrol', array('user'=>fullname($user, true), 'course'=>format_string($course->fullname))); +$fullname = fullname($user); +$title = get_string('unenrol', 'core_enrol'); + +$PAGE->set_title($title); +$PAGE->set_heading($title); +$PAGE->navbar->add($title); +$PAGE->navbar->add($fullname); + +echo $OUTPUT->header(); +echo $OUTPUT->heading($fullname); +echo $OUTPUT->confirm($message, $yesurl, $returnurl); +echo $OUTPUT->footer(); diff --git a/lib/enrollib.php b/lib/enrollib.php index 515a4c7ade8..4154db427da 100644 --- a/lib/enrollib.php +++ b/lib/enrollib.php @@ -1088,24 +1088,39 @@ abstract class enrol_plugin { * @param stdClass $instance course enrol instance * All plugins allowing this must implement 'enrol/xxx:enrol' capability * - * @return bool - true means user with 'enrol/xxx:enrol' may enrol others freely, trues means nobody may add more enrolments manually + * @return bool - true means user with 'enrol/xxx:enrol' may enrol others freely, false means nobody may add more enrolments manually */ public function allow_enrol(stdClass $instance) { return false; } /** - * Does this plugin allow manual unenrolments? - * - * @param stdClass $instance course enrol instance + * Does this plugin allow manual unenrolment of all users? * All plugins allowing this must implement 'enrol/xxx:unenrol' capability * - * @return bool - true means user with 'enrol/xxx:unenrol' may unenrol others freely, trues means nobody may touch user_enrolments + * @param stdClass $instance course enrol instance + * @return bool - true means user with 'enrol/xxx:unenrol' may unenrol others freely, false means nobody may touch user_enrolments */ public function allow_unenrol(stdClass $instance) { return false; } + /** + * Does this plugin allow manual unenrolment of a specific user? + * All plugins allowing this must implement 'enrol/xxx:unenrol' capability + * + * This is useful especially for synchronisation plugins that + * do suspend instead of full unenrolment. + * + * @param stdClass $instance course enrol instance + * @param stdClass $ue record from user_enrolments table, specifies user + * + * @return bool - true means user with 'enrol/xxx:unenrol' may unenrol this user, false means nobody may touch this user enrolment + */ + public function allow_unenrol_user(stdClass $instance, stdClass $ue) { + return $this->allow_unenrol($instance); + } + /** * Does this plugin allow manual changes in user_enrolments table? *