/** * Returns immediate child contexts of course (most likely classes), * decendents beyond immediate children are not returned. * * @return \local_elisprogram\context\course|array A context instance or an empty array */ public function get_child_contexts() { global $DB; $result = array(); $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_class($this)); $sql = "SELECT ctx.*\n FROM {context} ctx\n WHERE ctx.path LIKE ? AND (ctx.depth = ? OR ctx.contextlevel = ?)"; $params = array($this->_path . '/%', $this->depth + 1, $contextlevel); $records = $DB->get_recordset_sql($sql, $params); foreach ($records as $record) { $result[$record->id] = \local_eliscore\context\base::create_instance_from_record($record); } unset($records); return $result; }
/** * Triggered when a role assignment takes place. * This function should use the PM configured values to send messages to appropriate users when a role assignment * takes place. Users will be ones configured for the context, which can include the user that is assigned and users * assigned to configured roles for that context. The message template used should be the one configured as well. * * @param object $eventdata the role assignment record * @return boolean success * */ function pm_notify_role_assign_handler($eventdata) { global $CFG, $DB, $USER; pm_assign_instructor_from_mdl($eventdata); pm_assign_student_from_mdl($eventdata); /// Does the user receive a notification? $sendtouser = !empty(elis::$config->local_elisprogram->notify_classenrol_user) ? elis::$config->local_elisprogram->notify_classenrol_user : 0; $sendtorole = !empty(elis::$config->local_elisprogram->notify_classenrol_role) ? elis::$config->local_elisprogram->notify_classenrol_role : 0; $sendtosupervisor = !empty(elis::$config->local_elisprogram->notify_classenrol_supervisor) ? elis::$config->local_elisprogram->notify_classenrol_supervisor : 0; /// If nobody receives a notification, we're done. if (!$sendtouser && !$sendtorole && !$sendtosupervisor) { return true; } // First check if this is a standard Moodle context $context = context::instance_by_id($eventdata->contextid, IGNORE_MISSING); // If not, try checking to see if this is a custom ELIS context if (!$context) { $context = \local_eliscore\context\base::instance_by_id($eventdata->contextid, IGNORE_MISSING); } /// We get all context assigns, so check that this is a class. If not, we're done. // if (!$context = context::instance_by_id($eventdata->contextid)) { if (!$context) { if (in_cron()) { mtrace(getstring('invalidcontext')); } else { print_error('invalidcontext'); } return true; } else { if ($context->contextlevel == CONTEXT_SYSTEM) { // TBD: ^above was != CONTEXT_COURSE return true; } } /// Make sure this is a valid user. if (!($enroluser = $DB->get_record('user', array('id' => $eventdata->userid)))) { if (in_cron()) { mtrace(get_string('nomoodleuser', 'local_elisprogram')); } else { debugging(get_string('nomoodleuser', 'local_elisprogram')); } return true; } $course = null; /// Get the course record from the context id. if ($context->contextlevel == CONTEXT_COURSE && !($course = $DB->get_record('course', array('id' => $context->instanceid)))) { if (in_cron()) { mtrace(getstring('invalidcourse')); } else { print_error('invalidcourse'); } return true; } else { if (empty($course) && $context->contextlevel != CONTEXT_ELIS_CLASS) { // TBD //error_log("/local/elisprogram/lib/notifications.php::pm_notify_role_assign_handler(); eventdata->contextid != CONTEXT_ELIS_CLASS"); return true; } $name = !empty($course) ? $course->fullname : $DB->get_field(pmclass::TABLE, 'idnumber', array('id' => $context->instanceid)); if (empty($name)) { return true; } } $message = new notification(); /// Set up the text of the message $text = empty(elis::$config->local_elisprogram->notify_classenrol_message) ? get_string('notifyclassenrolmessagedef', 'local_elisprogram') : elis::$config->local_elisprogram->notify_classenrol_message; $search = array('%%userenrolname%%', '%%classname%%'); $replace = array(elis_fullname($enroluser), $name); $text = str_replace($search, $replace, $text); if ($sendtouser) { $message->send_notification($text, $enroluser); } $users = array(); if ($sendtorole) { // Get all users with the notify_classenrol capability. if ($roleusers = get_users_by_capability($context, 'local/elisprogram:notify_classenrol')) { $users = $users + $roleusers; } if ($roleusers = get_users_by_capability(context_system::instance(), 'local/elisprogram:notify_classenrol')) { $users = $users + $roleusers; } } if ($sendtosupervisor) { $pmuserid = pm_get_crlmuserid($eventdata->userid); // Get all users with the notify_classenrol capability. if ($supervisors = pm_get_users_by_capability('user', $pmuserid, 'local/elisprogram:notify_classenrol')) { $users = $users + $supervisors; } } foreach ($users as $user) { //error_log("/local/elisprogram/lib/notifications.php::pm_notify_role_assign_handler(eventdata); Sending notification to user[{$user->id}]: {$user->email}"); $message->send_notification($text, $user, $enroluser); } /// If you don't return true, the message queue will clog and no more will be sent. return true; }
/** * Rebuild context paths and depths at ELIS User Set context level. * * @static * @param bool $force Set to false to include records whose path is null or depth is zero */ protected static function build_paths($force) { global $DB; $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class()); if ($force or $DB->record_exists_select('context', "contextlevel = " . $contextlevel . " AND (depth = 0 OR path IS NULL)")) { if ($force) { $ctxemptyclause = $emptyclause = ''; } else { $ctxemptyclause = "AND (ctx.path IS NULL OR ctx.depth = 0)"; $emptyclause = "AND ({context}.path IS NULL OR {context}.depth = 0)"; } $base = '/' . SYSCONTEXTID; // Normal top level user sets $sql = "UPDATE {context}\n SET depth = 2,\n path = " . $DB->sql_concat("'{$base}/'", 'id') . "\n WHERE contextlevel = " . $contextlevel . "\n AND EXISTS (SELECT 'x'\n FROM {" . \userset::TABLE . "} eu\n WHERE eu.id = {context}.instanceid AND eu.depth = 1)\n {$emptyclause}"; $DB->execute($sql); // Deeper categories - one query per depthlevel $maxdepth = $DB->get_field_sql("SELECT MAX(depth) FROM {" . \userset::TABLE . "}"); for ($n = 2; $n <= $maxdepth; $n++) { $sql = "INSERT INTO {context_temp} (id, path, depth)\n SELECT ctx.id, " . $DB->sql_concat('pctx.path', "'/'", 'ctx.id') . ", pctx.depth+1\n FROM {context} ctx\n JOIN {" . \userset::TABLE . "} eu ON (eu.id = ctx.instanceid AND ctx.contextlevel = " . $contextlevel . " AND eu.depth = {$n})\n JOIN {context} pctx ON (pctx.instanceid = eu.parent AND pctx.contextlevel = " . $contextlevel . ")\n WHERE pctx.path IS NOT NULL AND pctx.depth > 0\n {$ctxemptyclause}"; $trans = $DB->start_delegated_transaction(); $DB->delete_records('context_temp'); $DB->execute($sql); \local_eliscore\context\base::merge_context_temp_table(); $DB->delete_records('context_temp'); $trans->allow_commit(); } } }
/** * Rebuild context paths and depths at ELIS track context level. * * @static * @param bool $force Set to false to include records whose path is null or depth is zero */ protected static function build_paths($force) { global $DB; $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class()); if ($force or $DB->record_exists_select('context', "contextlevel = " . $contextlevel . " AND (depth = 0 OR path IS NULL)")) { $ctxemptyclause = $force ? '' : "AND (ctx.path IS NULL OR ctx.depth = 0)"; $parentcontextlevel = \local_eliscore\context\helper::get_level_from_class_name('\\local_elisprogram\\context\\program'); $sql = "INSERT INTO {context_temp} (id, path, depth)\n SELECT ctx.id, " . $DB->sql_concat('pctx.path', "'/'", 'ctx.id') . ", pctx.depth+1\n FROM {context} ctx\n JOIN {local_elisprogram_trk} trk ON (trk.id = ctx.instanceid AND ctx.contextlevel = " . $contextlevel . ")\n JOIN {context} pctx ON (pctx.instanceid = trk.curid AND pctx.contextlevel = " . $parentcontextlevel . ")\n WHERE pctx.path IS NOT NULL AND pctx.depth > 0\n {$ctxemptyclause}"; $trans = $DB->start_delegated_transaction(); $DB->delete_records('context_temp'); $DB->execute($sql); \local_eliscore\context\base::merge_context_temp_table(); $DB->delete_records('context_temp'); $trans->allow_commit(); } }
/** * Returns ELIS User context instance. * * @static * @param int $instanceid The ELIS user id * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found; * IGNORE_MULTIPLE means return first, ignore multiple records found(not recommended); * MUST_EXIST means we will throw an exception if no record or multiple records found. * @return \local_elisprogram\context\user|bool Context instance or false if instance was not found. */ public static function instance($instanceid, $strictness = MUST_EXIST) { global $DB; $contextlevel = \local_eliscore\context\helper::get_level_from_class_name(get_called_class()); if ($context = \local_eliscore\context\base::cache_get($contextlevel, $instanceid)) { return $context; } if (!($record = $DB->get_record('context', array('contextlevel' => $contextlevel, 'instanceid' => $instanceid)))) { if ($user = $DB->get_record(\user::TABLE, array('id' => $instanceid), 'id', $strictness)) { $record = \local_eliscore\context\base::insert_context_record($contextlevel, $user->id, '/' . SYSCONTEXTID, 0); } } if ($record) { $context = new \local_elisprogram\context\user($record); \local_eliscore\context\base::cache_add($context); return $context; } return false; }