MDL-54708 message: add renderer for get_popup_notification
[moodle.git] / message / classes / output / popup_notification.php
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/>.
17 /**
18  * Contains class used to prepare a popup notification for display.
19  *
20  * @package   core_message
21  * @copyright 2016 Ryan Wyllie <ryan@moodle.com>
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_message\output;
27 require_once($CFG->dirroot . '/message/lib.php');
29 use renderable;
30 use templatable;
31 use moodle_url;
32 use core_user;
34 /**
35  * Class to prepare a popup notification for display.
36  *
37  * @package   core_message
38  * @copyright 2016 Ryan Wyllie <ryan@moodle.com>
39  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40  */
41 class popup_notification implements templatable, renderable {
43     /**
44      * The notification.
45      */
46     protected $notification;
48     /**
49      * Indicates if the receiver of the notification should have their
50      * details embedded in the output.
51      */
52     protected $embeduserto;
54     /**
55      * Indicates if the sender of the notification should have their
56      * details embedded in the output.
57      */
58     protected $embeduserfrom;
60     /**
61      * Indicates if the receiver of the notification should have their
62      * notification preferences embedded in the output.
63      */
64     protected $embedpreference;
66     /**
67      * A cache for the receiver's full name, if it's already known, so that
68      * a DB lookup isn't required.
69      */
70     protected $usertofullname;
72     /**
73      * Constructor.
74      *
75      * @param \stdClass $notification
76      */
77     public function __construct($notification, $embeduserto,
78         $embeduserfrom, $embedpreference, $usertofullname = '') {
80         $this->notification = $notification;
81         $this->embeduserto = $embeduserto;
82         $this->embeduserfrom = $embeduserfrom;
83         $this->embedpreference = $embedpreference;
84         $this->usertofullname = $usertofullname;
85     }
87     public function export_for_template(\renderer_base $output) {
88         global $USER;
90         $context = clone $this->notification;
92         if ($context->useridto == $USER->id && $context->timeusertodeleted) {
93             $context->deleted = true;
94         } else {
95             $context->deleted = false;
96         }
98         // We need to get the user from the query.
99         if ($this->embeduserfrom) {
100             // Check for non-reply and support users.
101             if (core_user::is_real_user($context->useridfrom)) {
102                 $user = new \stdClass();
103                 $user = username_load_fields_from_object($user, $context, 'userfrom');
104                 $profileurl = new moodle_url('/user/profile.php', array('id' => $context->useridfrom));
105                 $context->userfromfullname = fullname($user);
106                 $context->userfromprofileurl = $profileurl->out();
107             } else {
108                 $context->userfromfullname = get_string('coresystem');
109             }
110         }
112         // We need to get the user from the query.
113         if ($this->embeduserto) {
114             if (empty($this->usertofullname)) {
115                 $user = new \stdClass();
116                 $user = username_load_fields_from_object($user, $context, 'userto');
117                 $context->usertofullname = fullname($user);
118             } else {
119                 $context->usertofullname = $this->usertofullname;
120             }
121         }
123         $context->timecreatedpretty = get_string('ago', 'message', format_time(time() - $context->timecreated));
124         $context->text = message_format_message_text($context);
125         $context->read = $context->timeread ? true : false;
127         if (!empty($context->component) && substr($context->component, 0, 4) == 'mod_') {
128             $iconurl = $output->pix_url('icon', $context->component);
129         } else {
130             $iconurl = $output->pix_url('i/marker', 'core');
131         }
133         $context->iconurl = $iconurl->out();
135         // We only return the logged in user's preferences, so if it isn't the sender or receiver
136         // of this notification then skip embedding the preferences.
137         if ($this->embedpreference && !empty($context->component) && !empty($context->eventtype)
138                 && $USER->id == $context->useridto) {
139             $key = 'message_provider_' . $context->component . '_' . $context->eventtype;
140             $context->preference = array(
141                 'key' => $key,
142                 'loggedin' => get_user_preferences($key . '_loggedin', $USER->id),
143                 'loggedoff' => get_user_preferences($key . '_loggedoff', $USER->id),
144             );
145         }
147         return $context;
148     }