Example #1
0
 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;
 }