public static function process_enrolments($event = null, $instanceid = null) { global $DB; $nbenrolled = 0; $possible_unenrolments = array(); if ($instanceid) { // We're processing one particular instance, making sure it's active $enrol_attributes_records = $DB->get_records('enrol', array('enrol' => 'attributes', 'status' => 0, 'id' => $instanceid)); } else { // We're processing all active instances, // because a user just logged in // OR we're running the cron $enrol_attributes_records = $DB->get_records('enrol', array('enrol' => 'attributes', 'status' => 0)); if (!is_null($event)) { // Let's check if there are any potential unenroling instances $userid = (int) $event->userid; $possible_unenrolments = $DB->get_records_sql("SELECT id, enrolid FROM {user_enrolments} WHERE userid = ? AND status = 0 AND enrolid IN ( SELECT id FROM {enrol} WHERE enrol = 'attributes' AND customint1 = 1 ) ", array($userid)); } } // are we to unenrol from anywhere? foreach ($possible_unenrolments as $id => $user_enrolment) { $unenrol_attributes_record = $DB->get_record('enrol', array('enrol' => 'attributes', 'status' => 0, 'customint1' => 1, 'id' => $user_enrolment->enrolid)); if (!$unenrol_attributes_record) { continue; } $select = 'SELECT DISTINCT u.id FROM {user} u'; $where = ' WHERE u.id=' . $userid . ' AND u.deleted=0 AND '; $arraysyntax = self::attrsyntax_toarray($unenrol_attributes_record->customtext1); $arraysql = self::arraysyntax_tosql($arraysyntax); $users = $DB->get_records_sql($select . $arraysql['select'] . $where . $arraysql['where'], $arraysql['params']); if (!array_key_exists($userid, $users)) { $enrol_attributes_instance = new enrol_attributes_plugin(); $enrol_attributes_instance->unenrol_user($unenrol_attributes_record, (int) $userid); } } // are we to enrol anywhere? foreach ($enrol_attributes_records as $enrol_attributes_record) { $rules = json_decode($enrol_attributes_record->customtext1)->rules; $configured_profilefields = explode(',', get_config('enrol_attributes', 'profilefields')); foreach ($rules as $rule) { if (!isset($rule->param)) { break; } if (!in_array($rule->param, $configured_profilefields)) { break 2; } } $enrol_attributes_instance = new enrol_attributes_plugin(); $enrol_attributes_instance->name = $enrol_attributes_record->name; $select = 'SELECT DISTINCT u.id FROM {user} u'; if ($event) { // called by an event, i.e. user login $userid = (int) $event->userid; $where = ' WHERE u.id=' . $userid; } else { // called by cron or by construct $where = ' WHERE 1=1'; } $where .= ' AND u.deleted=0 AND '; $arraysyntax = self::attrsyntax_toarray($enrol_attributes_record->customtext1); $arraysql = self::arraysyntax_tosql($arraysyntax); $users = $DB->get_records_sql($select . $arraysql['select'] . $where . $arraysql['where'], $arraysql['params']); foreach ($users as $user) { if (is_enrolled(context_course::instance($enrol_attributes_record->courseid), $user)) { continue; } $enrol_attributes_instance->enrol_user($enrol_attributes_record, $user->id, $enrol_attributes_record->roleid); $nbenrolled++; } } if (!$event && !$instanceid) { // we only want output if runnning within the cron mtrace('enrol_attributes : enrolled ' . $nbenrolled . ' users.'); } return $nbenrolled; }