Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.

Differences Between: [Versions 310 and 403] [Versions 311 and 403] [Versions 39 and 403] [Versions 400 and 403] [Versions 401 and 403] [Versions 402 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * This file defines an adhoc task to send notifications.
  19   *
  20   * @package    tool_monitor
  21   * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  namespace tool_monitor;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  /**
  30   * Adhock class, used to send notifications to users.
  31   *
  32   * @since      Moodle 2.8
  33   * @package    tool_monitor
  34   * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
  35   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  36   */
  37  class notification_task extends \core\task\adhoc_task {
  38  
  39      /**
  40       * Send out messages.
  41       */
  42      public function execute() {
  43          foreach ($this->get_custom_data() as $data) {
  44              $eventobj = $data->event;
  45              $subscriptionids = $data->subscriptionids;
  46              foreach ($subscriptionids as $id) {
  47                  if ($message = $this->generate_message($id, $eventobj)) {
  48                      mtrace("Sending message to the user with id " . $message->userto->id . " for the subscription with id $id...");
  49                      message_send($message);
  50                      mtrace("Sent.");
  51                  }
  52              }
  53          }
  54      }
  55  
  56      /**
  57       * Generates the message object for a give subscription and event.
  58       *
  59       * @param int $subscriptionid Subscription instance
  60       * @param \stdClass $eventobj Event data
  61       *
  62       * @return false|\stdClass message object
  63       */
  64      protected function generate_message($subscriptionid, \stdClass $eventobj) {
  65  
  66          try {
  67              $subscription = subscription_manager::get_subscription($subscriptionid);
  68          } catch (\dml_exception $e) {
  69              // Race condition, someone deleted the subscription.
  70              return false;
  71          }
  72          $user = \core_user::get_user($subscription->userid);
  73          if (empty($user)) {
  74              // User doesn't exist. Should never happen, nothing to do return.
  75              return false;
  76          }
  77          $context = \context_user::instance($user->id, IGNORE_MISSING);
  78          if ($context === false) {
  79              // User context doesn't exist. Should never happen, nothing to do return.
  80              return false;
  81          }
  82  
  83          $template = $subscription->template;
  84          $template = $this->replace_placeholders($template, $subscription, $eventobj, $context);
  85          $htmlmessage = format_text($template, $subscription->templateformat, array('context' => $context));
  86          $msgdata = new \core\message\message();
  87          $msgdata->courseid          = empty($subscription->courseid) ? SITEID : $subscription->courseid;
  88          $msgdata->component         = 'tool_monitor'; // Your component name.
  89          $msgdata->name              = 'notification'; // This is the message name from messages.php.
  90          $msgdata->userfrom          = \core_user::get_noreply_user();
  91          $msgdata->userto            = $user;
  92          $msgdata->subject           = $subscription->get_name($context);
  93          $msgdata->fullmessage       = html_to_text($htmlmessage);
  94          $msgdata->fullmessageformat = FORMAT_PLAIN;
  95          $msgdata->fullmessagehtml   = $htmlmessage;
  96          $msgdata->smallmessage      = '';
  97          $msgdata->notification      = 1; // This is only set to 0 for personal messages between users.
  98  
  99          return $msgdata;
 100      }
 101  
 102      /**
 103       * Replace place holders in the template with respective content.
 104       *
 105       * @param string $template Message template.
 106       * @param subscription $subscription subscription instance
 107       * @param \stdclass $eventobj Event data
 108       * @param \context $context context object
 109       *
 110       * @return mixed final template string.
 111       */
 112      protected function replace_placeholders($template, subscription $subscription, $eventobj, $context) {
 113          $replacements = [
 114              '{link}' => $eventobj->link,
 115              '{rulename}' => $subscription->get_name($context),
 116              '{description}' => $subscription->get_description($context),
 117              '{eventname}' => $subscription->get_event_name(),
 118          ];
 119  
 120          if ($eventobj->contextlevel >= CONTEXT_COURSE && !empty($eventobj->courseid)) {
 121              $iscoursetemplate = str_contains($template, '{course');
 122              $ismodtemplate = str_contains($template, '{module');
 123              if ($iscoursetemplate || $ismodtemplate) {
 124                  $modinfo = get_fast_modinfo($eventobj->courseid);
 125                  $course = $modinfo->get_course();
 126                  $replacements['{coursefullname}'] = $course->fullname;
 127                  $replacements['{courseshortname}'] = $course->shortname;
 128  
 129                  if ($eventobj->contextlevel == CONTEXT_MODULE && !empty($eventobj->contextinstanceid) && $ismodtemplate) {
 130                      $cm = $modinfo->get_cm($eventobj->contextinstanceid);
 131                      $replacements['{modulelink}'] = $cm->url;
 132                      $replacements['{modulename}'] = $cm->get_name();
 133                  }
 134              }
 135          }
 136          return str_replace(
 137              search: array_keys($replacements),
 138              replace: array_values($replacements),
 139              subject: $template,
 140          );
 141      }
 142  }