MDL-59890 calendar: Exporters support for categories
[moodle.git] / calendar / classes / external / week_day_exporter.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 event class for displaying the day on month view.
19  *
20  * @package   core_calendar
21  * @copyright 2017 Andrew Nicols <andrew@nicols.co.uk>
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_calendar\external;
27 defined('MOODLE_INTERNAL') || die();
29 use renderer_base;
30 use moodle_url;
32 /**
33  * Class for displaying the day on month view.
34  *
35  * @package   core_calendar
36  * @copyright 2017 Andrew Nicols <andrew@nicols.co.uk>
37  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class week_day_exporter extends day_exporter {
41     /**
42      * Return the list of properties.
43      *
44      * @return array
45      */
46     protected static function define_properties() {
47         $return = parent::define_properties();
48         $return = array_merge($return, [
49             // These are additional params.
50             'istoday' => [
51                 'type' => PARAM_BOOL,
52                 'default' => false,
53             ],
54             'isweekend' => [
55                 'type' => PARAM_BOOL,
56                 'default' => false,
57             ],
58         ]);
60         return $return;
61     }
62     /**
63      * Return the list of additional properties.
64      *
65      * @return array
66      */
67     protected static function define_other_properties() {
68         $return = parent::define_other_properties();
69         $return = array_merge($return, [
70             'timestamp' => [
71                 'type' => PARAM_INT,
72             ],
73             'neweventtimestamp' => [
74                 'type' => PARAM_INT,
75             ],
76             'viewdaylink' => [
77                 'type' => PARAM_URL,
78                 'optional' => true,
79             ],
80             'calendareventtypes' => [
81                 'type' => PARAM_RAW,
82                 'multiple' => true,
83             ],
84             'popovertitle' => [
85                 'type' => PARAM_RAW,
86                 'default' => '',
87             ],
88             'haslastdayofevent' => [
89                 'type' => PARAM_BOOL,
90                 'default' => false,
91             ],
92         ]);
94         return $return;
95     }
97     /**
98      * Get the additional values to inject while exporting.
99      *
100      * @param renderer_base $output The renderer.
101      * @return array Keys are the property names, values are their values.
102      */
103     protected function get_other_values(renderer_base $output) {
104         $timestamp = $this->data[0];
105         // Need to account for user's timezone.
106         $usernow = usergetdate(time());
107         $today = new \DateTimeImmutable();
108         // The start time should use the day's date but the current
109         // time of the day (adjusted for user's timezone).
110         $neweventstarttime = $today->setTimestamp($timestamp)->setTime(
111             $usernow['hours'],
112             $usernow['minutes'],
113             $usernow['seconds']
114         );
116         $return = parent::get_other_values($output);
118         $url = new moodle_url('/calendar/view.php', [
119                 'view' => 'day',
120                 'time' => $timestamp,
121             ]);
123         if ($this->calendar->course && SITEID !== $this->calendar->course->id) {
124             $url->param('course', $this->calendar->course->id);
125         } else if ($this->calendar->categoryid) {
126             $url->param('category', $this->calendar->categoryid);
127         }
129         $return['viewdaylink'] = $url->out(false);
131         if ($popovertitle = $this->get_popover_title()) {
132             $return['popovertitle'] = $popovertitle;
133         }
134         $cache = $this->related['cache'];
135         $eventexporters = array_map(function($event) use ($cache, $output, $url) {
136             $context = $cache->get_context($event);
137             $course = $cache->get_course($event);
138             $exporter = new calendar_event_exporter($event, [
139                 'context' => $context,
140                 'course' => $course,
141                 'daylink' => $url,
142                 'type' => $this->related['type'],
143                 'today' => $this->data[0],
144             ]);
146             return $exporter;
147         }, $this->related['events']);
149         $return['events'] = array_map(function($exporter) use ($output) {
150             return $exporter->export($output);
151         }, $eventexporters);
153         if ($popovertitle = $this->get_popover_title()) {
154             $return['popovertitle'] = $popovertitle;
155         }
157         $return['calendareventtypes'] = array_map(function($exporter) {
158             return $exporter->get_calendar_event_type();
159         }, $eventexporters);
160         $return['calendareventtypes'] = array_values(array_unique($return['calendareventtypes']));
162         $return['haslastdayofevent'] = false;
163         foreach ($return['events'] as $event) {
164             if ($event->islastday) {
165                 $return['haslastdayofevent'] = true;
166                 break;
167             }
168         }
170         return $return;
171     }
173     /**
174      * Returns a list of objects that are related.
175      *
176      * @return array
177      */
178     protected static function define_related() {
179         return [
180             'events' => '\core_calendar\local\event\entities\event_interface[]',
181             'cache' => '\core_calendar\external\events_related_objects_cache',
182             'type' => '\core_calendar\type_base',
183         ];
184     }
186     /**
187      * Get the title for this popover.
188      *
189      * @return string
190      */
191     protected function get_popover_title() {
192         $title = null;
194         $userdate = userdate($this->data[0], get_string('strftimedayshort'));
195         if (count($this->related['events'])) {
196             $title = get_string('eventsfor', 'calendar', $userdate);
197         } else if ($this->data['istoday']) {
198             $title = $userdate;
199         }
201         if ($this->data['istoday']) {
202             $title = get_string('todayplustitle', 'calendar', $userdate);
203         }
205         return $title;
206     }