Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 138
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
tool_driprelease_form
0.00% covered (danger)
0.00%
0 / 136
0.00% covered (danger)
0.00%
0 / 5
702
0.00% covered (danger)
0.00%
0 / 1
 definition
0.00% covered (danger)
0.00%
0 / 80
0.00% covered (danger)
0.00%
0 / 1
42
 validation
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
56
 get_modules
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
 set_data
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 1
30
 add_action_buttons
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
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
25defined('MOODLE_INTERNAL') || die();
26use tool_driprelease\driprelease;
27require_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 */
36class 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 = driprelease::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}