Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
/competency/ -> lib.php (source)
   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   * Competency lib.
  19   *
  20   * @package    core_competency
  21   * @copyright  2016 Frédéric Massart - FMCorz.net
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  
  25  defined('MOODLE_INTERNAL') || die();
  26  
  27  use core_competency\api;
  28  use core_competency\plan;
  29  use core_competency\url;
  30  use core_competency\user_competency;
  31  use core_competency\user_evidence;
  32  
  33  /**
  34   * Hook when a comment is added.
  35   *
  36   * @param  stdClass $comment The comment.
  37   * @param  stdClass $params The parameters.
  38   * @return array
  39   */
  40  function core_competency_comment_add($comment, $params) {
  41      global $USER, $PAGE;
  42  
  43      if (!get_config('core_competency', 'enabled')) {
  44          return;
  45      }
  46  
  47      if ($params->commentarea == 'user_competency') {
  48          $uc = new user_competency($params->itemid);
  49  
  50          // Message both the user and the reviewer, except when they are the author of the message.
  51          $recipients = array($uc->get('userid'));
  52          if ($uc->get('reviewerid')) {
  53              $recipients[] = $uc->get('reviewerid');
  54          }
  55          $recipients = array_diff($recipients, array($comment->userid));
  56          if (empty($recipients)) {
  57              return;
  58          }
  59  
  60          // Get the sender.
  61          $user = $USER;
  62          if ($USER->id != $comment->userid) {
  63              $user = core_user::get_user($comment->userid);
  64          }
  65          $fullname = fullname($user);
  66  
  67          // Get the competency.
  68          $competency = $uc->get_competency();
  69          $competencyname = format_string($competency->get('shortname'), true, array('context' => $competency->get_context()));
  70  
  71          // We want to send a message for one plan, trying to find an active one first, or the last modified one.
  72          $plan = null;
  73          $plans = $uc->get_plans();
  74          foreach ($plans as $candidate) {
  75              if ($candidate->get('status') == plan::STATUS_ACTIVE) {
  76                  $plan = $candidate;
  77                  break;
  78  
  79              } else if (!empty($plan) && $plan->get('timemodified') < $candidate->get('timemodified')) {
  80                  $plan = $candidate;
  81  
  82              } else if (empty($plan)) {
  83                  $plan = $candidate;
  84              }
  85          }
  86  
  87          // Urls.
  88          // TODO MDL-52749 Replace the link to the plan with the user competency page.
  89          if (empty($plan)) {
  90              $urlname = get_string('userplans', 'core_competency');
  91              $url = url::plans($uc->get('userid'));
  92          } else {
  93              $urlname = $competencyname;
  94              $url = url::user_competency_in_plan($uc->get('userid'), $uc->get('competencyid'), $plan->get('id'));
  95          }
  96  
  97          // Construct the message content.
  98          $fullmessagehtml = get_string('usercommentedonacompetencyhtml', 'core_competency', array(
  99              'fullname' => $fullname,
 100              'competency' => $competencyname,
 101              'comment' => format_text($comment->content, $comment->format, array('context' => $params->context->id)),
 102              'url' => $url->out(true),
 103              'urlname' => $urlname,
 104          ));
 105          if ($comment->format == FORMAT_PLAIN || $comment->format == FORMAT_MOODLE) {
 106              $format = FORMAT_MOODLE;
 107              $fullmessage = get_string('usercommentedonacompetency', 'core_competency', array(
 108                  'fullname' => $fullname,
 109                  'competency' => $competencyname,
 110                  'comment' => $comment->content,
 111                  'url' => $url->out(false),
 112              ));
 113          } else {
 114              $format = FORMAT_HTML;
 115              $fullmessage = $fullmessagehtml;
 116          }
 117  
 118          $message = new \core\message\message();
 119          $message->courseid = SITEID;
 120          $message->component = 'moodle';
 121          $message->name = 'competencyusercompcomment';
 122          $message->notification = 1;
 123          $message->userfrom = core_user::get_noreply_user();
 124          $message->subject = get_string('usercommentedonacompetencysubject', 'core_competency', $fullname);
 125          $message->fullmessage = $fullmessage;
 126          $message->fullmessageformat = $format;
 127          $message->fullmessagehtml = $fullmessagehtml;
 128          $message->smallmessage = get_string('usercommentedonacompetencysmall', 'core_competency', array(
 129              'fullname' => $fullname,
 130              'competency' => $competencyname,
 131          ));
 132          $message->contexturl = $url->out(false);
 133          $message->contexturlname = $urlname;
 134  
 135          $userpicture = new \user_picture($user);
 136          $userpicture->size = 1; // Use f1 size.
 137          // Message each recipient.
 138          foreach ($recipients as $recipient) {
 139              $msgcopy = clone($message);
 140              $msgcopy->userto = $recipient;
 141              // Generate an out-of-session token for the user receiving the message.
 142              $userpicture->includetoken = $recipient;
 143              $msgcopy->customdata = [
 144                  'notificationiconurl' => $userpicture->get_url($PAGE)->out(false),
 145              ];
 146              message_send($msgcopy);
 147          }
 148  
 149      } else if ($params->commentarea == 'plan') {
 150          $plan = new plan($params->itemid);
 151  
 152          // Message both the user and the reviewer, except when they are the author of the message.
 153          $recipients = array($plan->get('userid'));
 154          if ($plan->get('reviewerid')) {
 155              $recipients[] = $plan->get('reviewerid');
 156          }
 157          $recipients = array_diff($recipients, array($comment->userid));
 158          if (empty($recipients)) {
 159              return;
 160          }
 161  
 162          // Get the sender.
 163          $user = $USER;
 164          if ($USER->id != $comment->userid) {
 165              $user = core_user::get_user($comment->userid);
 166          }
 167  
 168          $fullname = fullname($user);
 169          $planname = format_string($plan->get('name'), true, array('context' => $plan->get_context()));
 170          $urlname = $planname;
 171          $url = url::plan($plan->get('id'));
 172  
 173          // Construct the message content.
 174          $fullmessagehtml = get_string('usercommentedonaplanhtml', 'core_competency', array(
 175              'fullname' => $fullname,
 176              'plan' => $planname,
 177              'comment' => format_text($comment->content, $comment->format, array('context' => $params->context->id)),
 178              'url' => $url->out(true),
 179              'urlname' => $urlname,
 180          ));
 181          if ($comment->format == FORMAT_PLAIN || $comment->format == FORMAT_MOODLE) {
 182              $format = FORMAT_MOODLE;
 183              $fullmessage = get_string('usercommentedonaplan', 'core_competency', array(
 184                  'fullname' => $fullname,
 185                  'plan' => $planname,
 186                  'comment' => $comment->content,
 187                  'url' => $url->out(false),
 188              ));
 189          } else {
 190              $format = FORMAT_HTML;
 191              $fullmessage = $fullmessagehtml;
 192          }
 193  
 194          $message = new \core\message\message();
 195          $message->courseid = SITEID;
 196          $message->component = 'moodle';
 197          $message->name = 'competencyplancomment';
 198          $message->notification = 1;
 199          $message->userfrom = core_user::get_noreply_user();
 200          $message->subject = get_string('usercommentedonaplansubject', 'core_competency', $fullname);
 201          $message->fullmessage = $fullmessage;
 202          $message->fullmessageformat = $format;
 203          $message->fullmessagehtml = $fullmessagehtml;
 204          $message->smallmessage = get_string('usercommentedonaplansmall', 'core_competency', array(
 205              'fullname' => $fullname,
 206              'plan' => $planname,
 207          ));
 208          $message->contexturl = $url->out(false);
 209          $message->contexturlname = $urlname;
 210  
 211          $userpicture = new \user_picture($user);
 212          $userpicture->size = 1; // Use f1 size.
 213          // Message each recipient.
 214          foreach ($recipients as $recipient) {
 215              $msgcopy = clone($message);
 216              $msgcopy->userto = $recipient;
 217              // Generate an out-of-session token for the user receiving the message.
 218              $userpicture->includetoken = $recipient;
 219              $msgcopy->customdata = [
 220                  'notificationiconurl' => $userpicture->get_url($PAGE)->out(false),
 221              ];
 222              message_send($msgcopy);
 223          }
 224      }
 225  }
 226  
 227  /**
 228   * Return the permissions of for the comments.
 229   *
 230   * @param  stdClass $params The parameters.
 231   * @return array
 232   */
 233  function core_competency_comment_permissions($params) {
 234      if (!get_config('core_competency', 'enabled')) {
 235          return array('post' => false, 'view' => false);
 236      }
 237  
 238      if ($params->commentarea == 'user_competency') {
 239          $uc = new user_competency($params->itemid);
 240          if ($uc->can_read()) {
 241              return array('post' => $uc->can_comment(), 'view' => $uc->can_read_comments());
 242          }
 243      } else if ($params->commentarea == 'plan') {
 244          $plan = new plan($params->itemid);
 245          if ($plan->can_read()) {
 246              return array('post' => $plan->can_comment(), 'view' => $plan->can_read_comments());
 247          }
 248      }
 249  
 250      return array('post' => false, 'view' => false);
 251  }
 252  
 253  /**
 254   * Validates comments.
 255   *
 256   * @param  stdClass $params The parameters.
 257   * @return bool
 258   */
 259  function core_competency_comment_validate($params) {
 260      if (!get_config('core_competency', 'enabled')) {
 261          return false;
 262      }
 263  
 264      if ($params->commentarea == 'user_competency') {
 265          if (!user_competency::record_exists($params->itemid)) {
 266              return false;
 267          }
 268          return true;
 269      } else if ($params->commentarea == 'plan') {
 270          if (!plan::record_exists($params->itemid)) {
 271              return false;
 272          }
 273          return true;
 274      }
 275      return false;
 276  }
 277  
 278  /**
 279   * File serving.
 280   *
 281   * @param stdClass $course The course object.
 282   * @param stdClass $cm The cm object.
 283   * @param context $context The context object.
 284   * @param string $filearea The file area.
 285   * @param array $args List of arguments.
 286   * @param bool $forcedownload Whether or not to force the download of the file.
 287   * @param array $options Array of options.
 288   * @return void|false
 289   */
 290  function core_competency_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options = array()) {
 291      global $CFG;
 292  
 293      if (!get_config('core_competency', 'enabled')) {
 294          return false;
 295      }
 296  
 297      $fs = get_file_storage();
 298      $file = null;
 299  
 300      $itemid = array_shift($args);
 301      $filename = array_shift($args);
 302      $filepath = $args ? '/' .implode('/', $args) . '/' : '/';
 303  
 304      if ($filearea == 'userevidence' && $context->contextlevel == CONTEXT_USER) {
 305          if (user_evidence::can_read_user($context->instanceid)) {
 306              $file = $fs->get_file($context->id, 'core_competency', $filearea, $itemid, $filepath, $filename);
 307              $forcedownload = true;
 308          }
 309      }
 310  
 311      if (!$file) {
 312          return false;
 313      }
 314  
 315      send_stored_file($file, null, 0, $forcedownload);
 316  }