public static function user_enrolment_deleted(\core\event\user_enrolment_deleted $event) { global $DB; $unenrolleduserid = $event->relateduserid; $enroltype = $event->get_data()['other']['enrol']; $courseid = $event->courseid; if (!emarking_unenrol_student($unenrolleduserid, $courseid)) { error_log("Error updating drafts from {$unenrolleduserid} in course {$courseid}"); } }
/** * Unenrol user from course, * the last unenrolment removes all remaining roles. * * @param stdClass $instance * @param int $userid * @return void */ public function unenrol_user(stdClass $instance, $userid) { global $CFG, $USER, $DB; require_once("$CFG->dirroot/group/lib.php"); $name = $this->get_name(); $courseid = $instance->courseid; if ($instance->enrol !== $name) { throw new coding_exception('invalid enrol instance!'); } $context = context_course::instance($instance->courseid, MUST_EXIST); if (!$ue = $DB->get_record('user_enrolments', array('enrolid'=>$instance->id, 'userid'=>$userid))) { // weird, user not enrolled return; } // Remove all users groups linked to this enrolment instance. if ($gms = $DB->get_records('groups_members', array('userid'=>$userid, 'component'=>'enrol_'.$name, 'itemid'=>$instance->id))) { foreach ($gms as $gm) { groups_remove_member($gm->groupid, $gm->userid); } } role_unassign_all(array('userid'=>$userid, 'contextid'=>$context->id, 'component'=>'enrol_'.$name, 'itemid'=>$instance->id)); $DB->delete_records('user_enrolments', array('id'=>$ue->id)); // add extra info and trigger event $ue->courseid = $courseid; $ue->enrol = $name; $sql = "SELECT 'x' FROM {user_enrolments} ue JOIN {enrol} e ON (e.id = ue.enrolid) WHERE ue.userid = :userid AND e.courseid = :courseid"; if ($DB->record_exists_sql($sql, array('userid'=>$userid, 'courseid'=>$courseid))) { $ue->lastenrol = false; } else { // the big cleanup IS necessary! require_once("$CFG->libdir/gradelib.php"); // remove all remaining roles role_unassign_all(array('userid'=>$userid, 'contextid'=>$context->id), true, false); //clean up ALL invisible user data from course if this is the last enrolment - groups, grades, etc. groups_delete_group_members($courseid, $userid); grade_user_unenrol($courseid, $userid); $DB->delete_records('user_lastaccess', array('userid'=>$userid, 'courseid'=>$courseid)); $ue->lastenrol = true; // means user not enrolled any more } // Trigger event. $event = \core\event\user_enrolment_deleted::create( array( 'courseid' => $courseid, 'context' => $context, 'relateduserid' => $ue->userid, 'objectid' => $ue->id, 'other' => array( 'userenrolment' => (array)$ue, 'enrol' => $name ) ) ); $event->trigger(); // reset all enrol caches $context->mark_dirty(); // reset current user enrolment caching if ($userid == $USER->id) { if (isset($USER->enrol['enrolled'][$courseid])) { unset($USER->enrol['enrolled'][$courseid]); } if (isset($USER->enrol['tempguest'][$courseid])) { unset($USER->enrol['tempguest'][$courseid]); remove_temp_course_roles($context); } } }
$confirm = optional_param('confirm', 0, PARAM_BOOL); $instance = $DB->get_record('enrol', array('id' => $enrolid, 'enrol' => 'apply'), '*', MUST_EXIST); $course = $DB->get_record('course', array('id' => $instance->courseid), '*', MUST_EXIST); $context = context_course::instance($course->id, MUST_EXIST); require_login(); if (!is_enrolled($context)) { redirect(new moodle_url('/')); } require_login($course); $plugin = enrol_get_plugin('apply'); // Security defined inside following function. if (!$plugin->get_unenrolself_link($instance)) { redirect(new moodle_url('/course/view.php', array('id' => $course->id))); } $PAGE->set_url('/enrol/apply/unenrolself.php', array('enrolid' => $instance->id)); $PAGE->set_title($plugin->get_instance_name($instance)); if ($confirm and confirm_sesskey()) { $plugin->unenrol_user($instance, $USER->id); // Deprecated fixed by Shiro <*****@*****.**> //add_to_log($course->id, 'course', 'unenrol', '../enrol/users.php?id='.$course->id, $course->id); //TODO: there should be userid somewhere! $context = context_course::instance($course->id); \core\event\user_enrolment_deleted::delete(array('context' => $context))->trigger(); redirect(new moodle_url('/index.php')); } echo $OUTPUT->header(); $yesurl = new moodle_url($PAGE->url, array('confirm' => 1, 'sesskey' => sesskey())); $nourl = new moodle_url('/course/view.php', array('id' => $course->id)); $message = get_string('unenrolselfconfirm', 'enrol_self', format_string($course->fullname)); //I leave the unenrolselfconfirm message because it fits perfectly echo $OUTPUT->confirm($message, $yesurl, $nourl); echo $OUTPUT->footer();