Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
0.00% |
0 / 138 |
|
0.00% |
0 / 5 |
CRAP | |
0.00% |
0 / 1 |
tool_driprelease_form | |
0.00% |
0 / 136 |
|
0.00% |
0 / 5 |
702 | |
0.00% |
0 / 1 |
definition | |
0.00% |
0 / 80 |
|
0.00% |
0 / 1 |
42 | |||
validation | |
0.00% |
0 / 20 |
|
0.00% |
0 / 1 |
56 | |||
get_modules | |
0.00% |
0 / 7 |
|
0.00% |
0 / 1 |
12 | |||
set_data | |
0.00% |
0 / 16 |
|
0.00% |
0 / 1 |
30 | |||
add_action_buttons | |
0.00% |
0 / 13 |
|
0.00% |
0 / 1 |
30 |
1 | <?php |
2 | // This file is part of Moodle - https://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 <https://www.gnu.org/licenses/>. |
16 | |
17 | /** |
18 | * The main tool_driprelease configuration form. |
19 | * |
20 | * @package tool_driprelease |
21 | * @copyright 2022 Marcus Green |
22 | * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
23 | */ |
24 | |
25 | defined('MOODLE_INTERNAL') || die(); |
26 | |
27 | require_once($CFG->libdir . '/formslib.php'); |
28 | |
29 | /** |
30 | * Module instance settings form. |
31 | * |
32 | * @package tool_driprelease |
33 | * @copyright 2022 Marcus Greebn |
34 | * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
35 | */ |
36 | class tool_driprelease_form extends moodleform { |
37 | /** @var array options to be used with date_time_selector fields in the quiz. */ |
38 | public static $datefieldoptions = ['optional' => false]; |
39 | /** @var array modules on the course */ |
40 | public $modules; |
41 | /** |
42 | * Defines forms elements |
43 | */ |
44 | public function definition() { |
45 | global $CFG, $DB, $PAGE, $COURSE; |
46 | |
47 | require_once($CFG->dirroot . '/course/externallib.php'); |
48 | $modtype = optional_param('modtype', 'quiz', PARAM_RAW); |
49 | $courseid = optional_param('courseid', '', PARAM_INT); |
50 | |
51 | $PAGE->requires->js_call_amd('tool_driprelease/modform', 'init', ['courseid' => $courseid]); |
52 | |
53 | $mform = $this->_form; |
54 | $driprelease = (object) $this->_customdata['driprelease']; |
55 | |
56 | $course = $DB->get_record('course', ['id' => $courseid]); |
57 | |
58 | $mform->addElement('hidden', 'courseid', $courseid); |
59 | |
60 | $mform->addElement('header', 'driprelease', get_string('dripreleaseforcourse', 'tool_driprelease')." ".$course->shortname); |
61 | $mform->setExpanded('driprelease'); |
62 | |
63 | $mform->setType('courseid', PARAM_INT); |
64 | |
65 | $moduletypes = get_course_module_types($courseid); |
66 | $group[] = $mform->createElement('select', 'modtype', get_string('activitytype', 'tool_driprelease'), $moduletypes); |
67 | $group[] = $mform->createElement('submit', 'refresh', get_string('refresh', 'tool_driprelease')); |
68 | $string = get_string('activity', 'tool_driprelease'); |
69 | $mform->addgroup($group, '', $string, [''], true); |
70 | |
71 | $mform->setDefault('modtype', $modtype ?? 'quiz'); |
72 | |
73 | $this->modules = $this->get_modules($course, $modtype); |
74 | if ($this->modules) { |
75 | foreach ($this->modules as $module) { |
76 | $activitycbx[] = $mform->createElement('advcheckbox', 'activity_'.$module->id, null, null, ['hidden' => true]); |
77 | } |
78 | $mform->addGroup( $activitycbx, 'activitygroup'); |
79 | } |
80 | $driprelease->schedulestart = $driprelease->schedulestart ?? time(); |
81 | // Start dates. |
82 | $mform->addElement( |
83 | 'date_time_selector', |
84 | 'schedulestart', |
85 | get_string('schedulestart', 'tool_driprelease'), |
86 | $driprelease->schedulestart |
87 | ); |
88 | $mform->setDefault('schedulestart', ($driprelease->schedulestart ?? '')); |
89 | $mform->addHelpButton('schedulestart', 'schedulestart', 'tool_driprelease'); |
90 | |
91 | $driprelease->schedulefinish = $driprelease->schedulefinish ?? (time() + DAYSECS); |
92 | |
93 | // Finish dates. |
94 | $mform->addElement( |
95 | 'date_time_selector', |
96 | 'schedulefinish', |
97 | get_string('schedulefinish', 'tool_driprelease'), |
98 | $driprelease->schedulefinish |
99 | ); |
100 | $mform->setDefault('schedulefinish', ($driprelease->schedulefinish ?? '')); |
101 | $mform->setType('schedulefinish', PARAM_INT); |
102 | |
103 | $coursegroups = ['' => '']; |
104 | if ($COURSE->groupmode == NOGROUPS) { |
105 | $coursegroups = ['' => get_string('coursesettingnogroups', 'tool_driprelease')]; |
106 | } |
107 | $groupinfo = groups_get_all_groups($COURSE->id); |
108 | $coursegroups = ['' => '']; |
109 | foreach ($groupinfo as $coursegroup) { |
110 | $coursegroups[$coursegroup->id] = $coursegroup->name; |
111 | } |
112 | if (count($coursegroups) == 0 ) { |
113 | $coursegroups = ['' => get_string('courshasnogroups', 'tool_driprelease')]; |
114 | } |
115 | $mform->addElement('select', 'coursegroup', get_string('coursegroups', 'tool_driprelease' ), $coursegroups); |
116 | |
117 | $driprelease->sessionlength = $driprelease->sessionlength ?? get_config('tool_driprelease', 'tool_driprelease'); |
118 | |
119 | $mform->addElement('text', 'sessionlength', get_string('sessionlength', 'tool_driprelease'), |
120 | ['value' => $driprelease->sessionlength, 'size' => 2]); |
121 | $mform->addRule('sessionlength', null, 'required', null, 'client'); |
122 | |
123 | $mform->setType('sessionlength', PARAM_RAW); |
124 | $mform->addHelpButton('sessionlength', 'session', 'tool_driprelease'); |
125 | |
126 | $mform->addElement('text', 'activitiespersession', get_string('activitiespersession', 'tool_driprelease'), ['size' => '3']); |
127 | $mform->addRule('activitiespersession', null, 'required', null, 'client'); |
128 | $mform->setType('activitiespersession', PARAM_INT); |
129 | $mform->setDefault('activitiespersession', $driprelease->activitiespersession ?? get_config('activitiespersession', |
130 | 'tool_driprelease')); |
131 | $mform->addHelpButton('activitiespersession', 'activitiespersession', 'tool_driprelease'); |
132 | |
133 | $mform->addElement('advcheckbox', 'stayavailable', get_string('stayavailable', 'tool_driprelease')); |
134 | $mform->addHelpButton('stayavailable', 'stayavailable', 'tool_driprelease'); |
135 | $mform->setDefault('stayavailable', $driprelease->stayavailable ?? get_config('stayavailable', 'tool_driprelease')); |
136 | $mform->setAdvanced('stayavailable'); |
137 | |
138 | $mform->addElement('advcheckbox', 'hideunselected', get_string('hideunselected', 'tool_driprelease')); |
139 | $mform->addHelpButton('hideunselected', 'hideunselected', 'tool_driprelease'); |
140 | $mform->setDefault('hideunselected', $driprelease->hideunselected ?? get_config('hideunselected', 'tool_driprelease')); |
141 | $mform->setAdvanced('hideunselected'); |
142 | |
143 | $mform->addElement('advcheckbox', 'resetunselected', get_string('resetunselected', 'tool_driprelease')); |
144 | $mform->addHelpButton('resetunselected', 'resetunselected', 'tool_driprelease'); |
145 | $mform->setDefault('resetunselected', false); |
146 | $mform->setAdvanced('resetunselected'); |
147 | |
148 | $mform->addElement('advcheckbox', 'displaydisabled', get_string('displaydisabled', 'tool_driprelease')); |
149 | $mform->addHelpButton('displaydisabled', 'displaydisabled', 'tool_driprelease'); |
150 | $mform->setDefault('displaydisabled', $driprelease->displaydisabled ?? false); |
151 | $mform->setAdvanced('displaydisabled'); |
152 | |
153 | $this->add_action_buttons(); |
154 | } |
155 | |
156 | /** |
157 | * Check for errors in the form data |
158 | * |
159 | * @param array $fromform |
160 | * @param array $tabledata |
161 | * @return boolean |
162 | */ |
163 | public function validation($fromform, $tabledata) { |
164 | parent::validation($fromform, $tabledata); |
165 | $modulecount = count($this->modules); |
166 | $errors = []; |
167 | $activitiespersession = $fromform['activitiespersession']; |
168 | $sessionlength = $fromform['sessionlength']; |
169 | $duration = round(($fromform['schedulefinish'] - $fromform['schedulestart']) / DAYSECS); |
170 | |
171 | if ($duration < 1) { |
172 | $errors['schedulefinish'] = get_string('starttofinishmustbe', 'tool_driprelease'); |
173 | } |
174 | if ($activitiespersession < 1) { |
175 | $errors['activitiespersession'] = get_string('activitiespersessionerror', 'tool_driprelease'); |
176 | } |
177 | if ($sessionlength < 1) { |
178 | $errors['sessiongroup'] = get_string('sessionlengtherror', 'tool_driprelease'); |
179 | } |
180 | |
181 | // Is the session length more than the start to finish duration. |
182 | if (($sessionlength) > $duration) { |
183 | $errors['sessiongroup'] = get_string('sessionlengthislonger', 'tool_driprelease'); |
184 | } |
185 | if ($modulecount < $activitiespersession) { |
186 | $a = (object) ['activitiespersession' => $activitiespersession, 'modulecount' => $modulecount]; |
187 | $errors['activitiespersession'] = get_string('activitiespersessionerror', 'tool_driprelease', $a); |
188 | } |
189 | |
190 | if ($errors) { |
191 | return $errors; |
192 | } else { |
193 | return true; |
194 | } |
195 | } |
196 | |
197 | /** |
198 | * Get an array of the modules of a specified type within a courseß |
199 | * |
200 | * @param \stdClass $course |
201 | * @param string $modtype |
202 | * @return array |
203 | */ |
204 | public function get_modules(\stdClass $course, string $modtype): array { |
205 | |
206 | $modinfo = get_fast_modinfo($course); |
207 | if (!isset($modinfo->instances[$modtype])) { |
208 | return []; |
209 | } |
210 | $modules = []; |
211 | foreach ($modinfo->instances[$modtype] as $cm) { |
212 | $modules[$cm->id] = $cm; |
213 | } |
214 | return $modules; |
215 | } |
216 | /** |
217 | * Set form default values |
218 | * |
219 | * @param \stdClass $driprelease |
220 | * @return void |
221 | */ |
222 | public function set_data($driprelease) { |
223 | if (!isset($driprelease->id)) { |
224 | return; |
225 | } |
226 | if (empty($this->modules)) { |
227 | return; |
228 | } |
229 | global $DB; |
230 | $mform = $this->_form; |
231 | $mform->getElement('coursegroup')->setValue($driprelease->coursegroup); |
232 | $activitygroup = $mform->getElement('activitygroup'); |
233 | $checkboxes = $activitygroup->getElements(); |
234 | $dbselections = $DB->get_records_menu('tool_driprelease_cmids', |
235 | ['driprelease' => $driprelease->id], null, 'id,coursemoduleid'); |
236 | |
237 | foreach ($checkboxes as $checkbox) { |
238 | $name = $checkbox->getAttributes()['name']; |
239 | $id = explode('_', $name)[1]; |
240 | if (in_array($id, $dbselections)) { |
241 | $checkbox->setValue(true); |
242 | } |
243 | } |
244 | } |
245 | /** |
246 | * Duplicate the functionality of the mod forms action buttons |
247 | * |
248 | * @param boolean $cancel |
249 | * @param string $submitlabel |
250 | * @param string $submit2label |
251 | * @return void |
252 | */ |
253 | public function add_action_buttons($cancel=true, $submitlabel=null, $submit2label=null) { |
254 | if (is_null($submitlabel)) { |
255 | $submitlabel = get_string('savechangesanddisplay'); |
256 | } |
257 | |
258 | if (is_null($submit2label)) { |
259 | $submit2label = get_string('savechangesandreturntocourse'); |
260 | } |
261 | |
262 | $mform = $this->_form; |
263 | |
264 | // Elements in a row need a group. |
265 | $buttonarray = []; |
266 | $buttonarray[] = &$mform->createElement('submit', 'submitbutton2', $submit2label); |
267 | |
268 | if ($submitlabel !== false) { |
269 | $buttonarray[] = &$mform->createElement('submit', 'submitbutton', $submitlabel); |
270 | } |
271 | |
272 | if ($cancel) { |
273 | $buttonarray[] = &$mform->createElement('cancel'); |
274 | } |
275 | |
276 | $mform->addGroup($buttonarray, 'buttonar', '', [' '], false); |
277 | $mform->setType('buttonar', PARAM_RAW); |
278 | } |
279 | } |