/** * Processes the bulk operation request for the given userids with the provided properties. * * @param course_enrolment_manager $manager * @param array $userids * @param stdClass $properties The data returned by the form. */ public function process(course_enrolment_manager $manager, array $users, stdClass $properties) { global $DB, $USER; if (!has_capability("enrol/manual:manage", $manager->get_context())) { return false; } // Get all of the user enrolment id's. $ueids = array(); $instances = array(); foreach ($users as $user) { foreach ($user->enrolments as $enrolment) { $ueids[] = $enrolment->id; if (!array_key_exists($enrolment->id, $instances)) { $instances[$enrolment->id] = $enrolment; } } } // Check that each instance is manageable by the current user. foreach ($instances as $instance) { if (!$this->plugin->allow_manage($instance)) { return false; } } // Collect the known properties. $status = $properties->status; $timestart = $properties->timestart; $timeend = $properties->timeend; list($ueidsql, $params) = $DB->get_in_or_equal($ueids, SQL_PARAMS_NAMED); $updatesql = array(); if ($status == ENROL_USER_ACTIVE || $status == ENROL_USER_SUSPENDED) { $updatesql[] = 'status = :status'; $params['status'] = (int) $status; } if (!empty($timestart)) { $updatesql[] = 'timestart = :timestart'; $params['timestart'] = (int) $timestart; } if (!empty($timeend)) { $updatesql[] = 'timeend = :timeend'; $params['timeend'] = (int) $timeend; } if (empty($updatesql)) { return true; } // Update the modifierid. $updatesql[] = 'modifierid = :modifierid'; $params['modifierid'] = (int) $USER->id; // Update the time modified. $updatesql[] = 'timemodified = :timemodified'; $params['timemodified'] = time(); // Build the SQL statement. $updatesql = join(', ', $updatesql); $sql = "UPDATE {user_enrolments}\n SET {$updatesql}\n WHERE id {$ueidsql}"; if ($DB->execute($sql, $params)) { foreach ($users as $user) { foreach ($user->enrolments as $enrolment) { $enrolment->courseid = $enrolment->enrolmentinstance->courseid; $enrolment->enrol = 'manual'; // Trigger event. $event = \core\event\user_enrolment_updated::create(array('objectid' => $enrolment->id, 'courseid' => $enrolment->courseid, 'context' => context_course::instance($enrolment->courseid), 'relateduserid' => $user->id, 'other' => array('enrol' => 'manual'))); $event->trigger(); } } // Delete cached course contacts for this course because they may be affected. cache::make('core', 'coursecontacts')->delete($manager->get_context()->instanceid); return true; } return false; }
/** * Store user_enrolments changes and trigger event. * * @param stdClass $instance * @param int $userid * @param int $status * @param int $timestart * @param int $timeend * @return void */ public function update_user_enrol(stdClass $instance, $userid, $status = NULL, $timestart = NULL, $timeend = NULL) { global $DB, $USER; $name = $this->get_name(); if ($instance->enrol !== $name) { throw new coding_exception('invalid enrol instance!'); } if (!$ue = $DB->get_record('user_enrolments', array('enrolid'=>$instance->id, 'userid'=>$userid))) { // weird, user not enrolled return; } $modified = false; if (isset($status) and $ue->status != $status) { $ue->status = $status; $modified = true; } if (isset($timestart) and $ue->timestart != $timestart) { $ue->timestart = $timestart; $modified = true; } if (isset($timeend) and $ue->timeend != $timeend) { $ue->timeend = $timeend; $modified = true; } if (!$modified) { // no change return; } $ue->modifierid = $USER->id; $DB->update_record('user_enrolments', $ue); context_course::instance($instance->courseid)->mark_dirty(); // reset enrol caches // Invalidate core_access cache for get_suspended_userids. cache_helper::invalidate_by_definition('core', 'suspended_userids', array(), array($instance->courseid)); // Trigger event. $event = \core\event\user_enrolment_updated::create( array( 'objectid' => $ue->id, 'courseid' => $instance->courseid, 'context' => context_course::instance($instance->courseid), 'relateduserid' => $ue->userid, 'other' => array('enrol' => $name) ) ); $event->trigger(); }