See Release Notes
Long Term Support Release
<?php // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Moodle is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** * This file defines an adhoc task to send notifications. * * @package tool_monitor * @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace tool_monitor; defined('MOODLE_INTERNAL') || die(); /** * Adhock class, used to send notifications to users. * * @since Moodle 2.8 * @package tool_monitor * @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class notification_task extends \core\task\adhoc_task { /** * Send out messages. */ public function execute() { foreach ($this->get_custom_data() as $data) { $eventobj = $data->event; $subscriptionids = $data->subscriptionids; foreach ($subscriptionids as $id) { if ($message = $this->generate_message($id, $eventobj)) { mtrace("Sending message to the user with id " . $message->userto->id . " for the subscription with id $id..."); message_send($message); mtrace("Sent."); } } } } /** * Generates the message object for a give subscription and event. * * @param int $subscriptionid Subscription instance * @param \stdClass $eventobj Event data * * @return false|\stdClass message object */ protected function generate_message($subscriptionid, \stdClass $eventobj) { try { $subscription = subscription_manager::get_subscription($subscriptionid); } catch (\dml_exception $e) { // Race condition, someone deleted the subscription. return false; } $user = \core_user::get_user($subscription->userid); if (empty($user)) { // User doesn't exist. Should never happen, nothing to do return. return false; } $context = \context_user::instance($user->id, IGNORE_MISSING); if ($context === false) { // User context doesn't exist. Should never happen, nothing to do return. return false; } $template = $subscription->template; $template = $this->replace_placeholders($template, $subscription, $eventobj, $context); $htmlmessage = format_text($template, $subscription->templateformat, array('context' => $context)); $msgdata = new \core\message\message(); $msgdata->courseid = empty($subscription->courseid) ? SITEID : $subscription->courseid; $msgdata->component = 'tool_monitor'; // Your component name. $msgdata->name = 'notification'; // This is the message name from messages.php. $msgdata->userfrom = \core_user::get_noreply_user(); $msgdata->userto = $user; $msgdata->subject = $subscription->get_name($context); $msgdata->fullmessage = html_to_text($htmlmessage); $msgdata->fullmessageformat = FORMAT_PLAIN; $msgdata->fullmessagehtml = $htmlmessage; $msgdata->smallmessage = ''; $msgdata->notification = 1; // This is only set to 0 for personal messages between users. return $msgdata; } /** * Replace place holders in the template with respective content. * * @param string $template Message template. * @param subscription $subscription subscription instance * @param \stdclass $eventobj Event data * @param \context $context context object * * @return mixed final template string. */ protected function replace_placeholders($template, subscription $subscription, $eventobj, $context) {< $template = str_replace('{link}', $eventobj->link, $template); < if ($eventobj->contextlevel == CONTEXT_MODULE && !empty($eventobj->contextinstanceid) < && (strpos($template, '{modulelink}') !== false)) { < $cm = get_fast_modinfo($eventobj->courseid)->get_cm($eventobj->contextinstanceid); < $modulelink = $cm->url; < $template = str_replace('{modulelink}', $modulelink, $template); < } < $template = str_replace('{rulename}', $subscription->get_name($context), $template); < $template = str_replace('{description}', $subscription->get_description($context), $template); < $template = str_replace('{eventname}', $subscription->get_event_name(), $template);> $replacements = [ > '{link}' => $eventobj->link, > '{rulename}' => $subscription->get_name($context), > '{description}' => $subscription->get_description($context), > '{eventname}' => $subscription->get_event_name(), > ]; > > if ($eventobj->contextlevel >= CONTEXT_COURSE && !empty($eventobj->courseid)) { > $iscoursetemplate = str_contains($template, '{course'); > $ismodtemplate = str_contains($template, '{module'); > if ($iscoursetemplate || $ismodtemplate) { > $modinfo = get_fast_modinfo($eventobj->courseid); > $course = $modinfo->get_course(); > $replacements['{coursefullname}'] = $course->fullname; > $replacements['{courseshortname}'] = $course->shortname;< return $template;> if ($eventobj->contextlevel == CONTEXT_MODULE && !empty($eventobj->contextinstanceid) && $ismodtemplate) { > $cm = $modinfo->get_cm($eventobj->contextinstanceid); > $replacements['{modulelink}'] = $cm->url; > $replacements['{modulename}'] = $cm->get_name(); > } > } > } > return str_replace( > search: array_keys($replacements), > replace: array_values($replacements), > subject: $template, > );} }