23184b3bbb0418cbc400a611e8315b9a86044883
[moodle.git] / calendar / classes / local / event / mappers / create_update_form_mapper.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  * Event create form and update form mapper.
19  *
20  * @package    core_calendar
21  * @copyright  2017 Ryan Wyllie <ryan@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_calendar\local\event\mappers;
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . '/calendar/lib.php');
31 /**
32  * Event create form and update form mapper class.
33  *
34  * This class will perform the necessary data transformations to take
35  * a legacy event and build the appropriate data structure for both the
36  * create and update event forms.
37  *
38  * It will also do the reverse transformation
39  * and take the returned form data and provide a data structure that can
40  * be used to set legacy event properties.
41  *
42  * @copyright 2017 Ryan Wyllie <ryan@moodle.com>
43  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
44  */
45 class create_update_form_mapper implements create_update_form_mapper_interface {
47     /**
48      * Generate the appropriate data for the form from a legacy event.
49      *
50      * @param \calendar_event $legacyevent
51      * @return stdClass
52      */
53     public function from_legacy_event_to_data(\calendar_event $legacyevent) {
54         $legacyevent->count_repeats();
55         $data = $legacyevent->properties();
56         $data->timedurationuntil = $legacyevent->timestart + $legacyevent->timeduration;
57         $data->duration = (empty($legacyevent->timeduration)) ? 0 : 1;
59         if ($legacyevent->eventtype == 'group') {
60             // Set up the correct value for the to display on the form.
61             $data->groupid = "{$legacyevent->courseid}-{$legacyevent->groupid}";
62             $data->groupcourseid = $legacyevent->courseid;
63         }
64         if ($legacyevent->eventtype == 'course') {
65             // Set up the correct value for the to display on the form.
66             $data->courseid = $legacyevent->courseid;
67         }
68         $data->description = [
69             'text' => $data->description,
70             'format' => $data->format
71         ];
73         // We don't want to return the context because it's not a
74         // form value and breaks the validation.
75         if (isset($data->context)) {
76             unset($data->context);
77         }
79         return $data;
80     }
82     /**
83      * Generate the appropriate calendar_event properties from the form data.
84      *
85      * @param \stdClass $data
86      * @return stdClass
87      */
88     public function from_data_to_event_properties(\stdClass $data) {
89         $properties = clone($data);
91         // Undo the form definition work around to allow us to have two different
92         // course selectors present depending on which event type the user selects.
93         if ($data->eventtype == 'course') {
94             // Default course id if none is set.
95             if (!isset($properties->courseid)) {
96                 if ($properties->eventtype === 'site') {
97                     $properties->courseid = SITEID;
98                 } else {
99                     $properties->courseid = 0;
100                 }
101             } else {
102                 $properties->courseid = $data->courseid;
103             }
104         }
106         if (isset($data->groupcourseid)) {
107             $properties->courseid = $data->groupcourseid;
108             unset($properties->groupcourseid);
109         }
111         // Pull the group id back out of the value. The form saves the value
112         // as "<courseid>-<groupid>" to allow the javascript to work correctly.
113         if (isset($data->groupid)) {
114             list($courseid, $groupid) = explode('-', $data->groupid);
115             $properties->groupid = $groupid;
116         }
119         // Decode the form fields back into valid event property.
120         $properties->timeduration = $this->get_time_duration_from_form_data($data);
122         return $properties;
123     }
125     /**
126      * A helper function to calculate the time duration for an event based on
127      * the event_form data.
128      *
129      * @param \stdClass $data event_form data
130      * @return int
131      */
132     private function get_time_duration_from_form_data(\stdClass $data) {
133         if ($data->duration == 1) {
134             return $data->timedurationuntil - $data->timestart;
135         } else if ($data->duration == 2) {
136             return $data->timedurationminutes * MINSECS;
137         } else {
138             return 0;
139         }
140     }