Merge branch 'MDL-70408-master' of git://github.com/sarjona/moodle
[moodle.git] / mod / h5pactivity / mod_form.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  * The main mod_h5pactivity configuration form.
19  *
20  * @package     mod_h5pactivity
21  * @copyright   2020 Ferran Recio <ferran@moodle.com>
22  * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 use mod_h5pactivity\local\manager;
27 defined('MOODLE_INTERNAL') || die();
29 global $CFG;
30 require_once($CFG->dirroot.'/course/moodleform_mod.php');
32 /**
33  * Module instance settings form.
34  *
35  * @package    mod_h5pactivity
36  * @copyright  2020 Ferran Recio <ferran@moodle.com>
37  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38  */
39 class mod_h5pactivity_mod_form extends moodleform_mod {
41     /**
42      * Defines forms elements
43      */
44     public function definition(): void {
45         global $CFG, $OUTPUT;
47         $mform = $this->_form;
49         // Adding the "general" fieldset, where all the common settings are shown.
50         $mform->addElement('header', 'general', get_string('general', 'form'));
52         // Adding the standard "name" field.
53         $mform->addElement('text', 'name', get_string('name'), ['size' => '64']);
55         if (!empty($CFG->formatstringstriptags)) {
56             $mform->setType('name', PARAM_TEXT);
57         } else {
58             $mform->setType('name', PARAM_CLEANHTML);
59         }
61         $mform->addRule('name', null, 'required', null, 'client');
62         $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
64         $this->standard_intro_elements();
66         // Adding the rest of mod_h5pactivity settings, spreading all them into this fieldset.
67         $options = [];
68         $options['accepted_types'] = ['.h5p'];
69         $options['maxbytes'] = 0;
70         $options['maxfiles'] = 1;
71         $options['subdirs'] = 0;
73         $mform->addElement('filemanager', 'packagefile', get_string('package', 'mod_h5pactivity'), null, $options);
74         $mform->addHelpButton('packagefile', 'package', 'mod_h5pactivity');
75         $mform->addRule('packagefile', null, 'required');
77         // Add a link to the Content Bank if the user can access.
78         $course = $this->get_course();
79         $coursecontext = context_course::instance($course->id);
80         if (has_capability('moodle/contentbank:access', $coursecontext)) {
81             $msg = null;
82             $context = $this->get_context();
83             if ($context instanceof \context_module) {
84                 // This is an existing activity. If the H5P file it's a referenced file from the content bank, a link for
85                 // displaying this specific content will be used instead of the generic link to the main page of the content bank.
86                 $fs = get_file_storage();
87                 $files = $fs->get_area_files($context->id, 'mod_h5pactivity', 'package', 0, 'sortorder, itemid, filepath,
88                     filename', false);
89                 $file = reset($files);
90                 if ($file && $file->get_reference() != null) {
91                     $referencedfile = \repository::get_moodle_file($file->get_reference());
92                     if ($referencedfile->get_component() == 'contentbank') {
93                         // If the attached file is a referencedfile in the content bank, display a link to open this content.
94                         $url = new moodle_url('/contentbank/view.php', ['id' => $referencedfile->get_itemid()]);
95                         $msg = get_string('opencontentbank', 'mod_h5pactivity', $url->out());
96                         $msg .= ' '.$OUTPUT->help_icon('contentbank', 'mod_h5pactivity');
97                     }
98                 }
99             }
100             if (!isset($msg)) {
101                 $url = new moodle_url('/contentbank/index.php', ['contextid' => $coursecontext->id]);
102                 $msg = get_string('usecontentbank', 'mod_h5pactivity', $url->out());
103                 $msg .= ' '.$OUTPUT->help_icon('contentbank', 'mod_h5pactivity');
104             }
106             $mform->addElement('static', 'contentbank', '', $msg);
107         }
109         // H5P displaying options.
110         $factory = new \core_h5p\factory();
111         $core = $factory->get_core();
112         $displayoptions = (array) \core_h5p\helper::decode_display_options($core);
113         $mform->addElement('header', 'h5pdisplay', get_string('h5pdisplay', 'mod_h5pactivity'));
114         foreach ($displayoptions as $key => $value) {
115             $name = get_string('display'.$key, 'mod_h5pactivity');
116             $fieldname = "displayopt[$key]";
117             $mform->addElement('checkbox', $fieldname, $name);
118             $mform->setType($fieldname, PARAM_BOOL);
119         }
121         // Add standard grading elements.
122         $this->standard_grading_coursemodule_elements();
124         // Attempt options.
125         $mform->addElement('header', 'h5pattempts', get_string('h5pattempts', 'mod_h5pactivity'));
127         $mform->addElement('static', 'trackingwarning', '', get_string('tracking_messages', 'mod_h5pactivity'));
129         $options = [1 => get_string('yes'), 0 => get_string('no')];
130         $mform->addElement('select', 'enabletracking', get_string('enabletracking', 'mod_h5pactivity'), $options);
131         $mform->setDefault('enabletracking', 1);
133         $options = manager::get_grading_methods();
134         $mform->addElement('select', 'grademethod', get_string('grade_grademethod', 'mod_h5pactivity'), $options);
135         $mform->setType('grademethod', PARAM_INT);
136         $mform->hideIf('grademethod', 'enabletracking', 'neq', 1);
137         $mform->disabledIf('grademethod', 'grade[modgrade_type]', 'neq', 'point');
138         $mform->addHelpButton('grademethod', 'grade_grademethod', 'mod_h5pactivity');
140         $options = manager::get_review_modes();
141         $mform->addElement('select', 'reviewmode', get_string('review_mode', 'mod_h5pactivity'), $options);
142         $mform->setType('reviewmode', PARAM_INT);
143         $mform->hideIf('reviewmode', 'enabletracking', 'notchecked');
145         // Add standard elements.
146         $this->standard_coursemodule_elements();
148         // Add standard buttons.
149         $this->add_action_buttons();
150     }
152     /**
153      * Enforce validation rules here
154      *
155      * @param array $data array of ("fieldname"=>value) of submitted data
156      * @param array $files array of uploaded files "element_name"=>tmp_file_path
157      * @return array
158      **/
159     public function validation($data, $files) {
160         global $USER;
161         $errors = parent::validation($data, $files);
163         if (empty($data['packagefile'])) {
164             $errors['packagefile'] = get_string('required');
166         } else {
167             $draftitemid = file_get_submitted_draft_itemid('packagefile');
169             file_prepare_draft_area($draftitemid, $this->context->id, 'mod_h5pactivity', 'packagefilecheck', null,
170                 ['subdirs' => 0, 'maxfiles' => 1]);
172             // Get file from users draft area.
173             $usercontext = context_user::instance($USER->id);
174             $fs = get_file_storage();
175             $files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftitemid, 'id', false);
177             if (count($files) < 1) {
178                 $errors['packagefile'] = get_string('required');
179                 return $errors;
180             }
181             $file = reset($files);
182             if (!$file->is_external_file() && !empty($data['updatefreq'])) {
183                 // Make sure updatefreq is not set if using normal local file.
184                 $errors['updatefreq'] = get_string('updatefreq_error', 'mod_h5pactivity');
185             }
186         }
188         return $errors;
189     }
191     /**
192      * Enforce defaults here.
193      *
194      * @param array $defaultvalues Form defaults
195      * @return void
196      **/
197     public function data_preprocessing(&$defaultvalues) {
198         // H5P file.
199         $draftitemid = file_get_submitted_draft_itemid('packagefile');
200         file_prepare_draft_area($draftitemid, $this->context->id, 'mod_h5pactivity',
201                 'package', 0, ['subdirs' => 0, 'maxfiles' => 1]);
202         $defaultvalues['packagefile'] = $draftitemid;
204         // H5P display options.
205         $factory = new \core_h5p\factory();
206         $core = $factory->get_core();
207         if (isset($defaultvalues['displayoptions'])) {
208             $currentdisplay = $defaultvalues['displayoptions'];
209             $displayoptions = (array) \core_h5p\helper::decode_display_options($core, $currentdisplay);
210         } else {
211             $displayoptions = (array) \core_h5p\helper::decode_display_options($core);
212         }
213         foreach ($displayoptions as $key => $value) {
214             $fieldname = "displayopt[$key]";
215             $defaultvalues[$fieldname] = $value;
216         }
217     }
219     /**
220      * Allows modules to modify the data returned by form get_data().
221      * This method is also called in the bulk activity completion form.
222      *
223      * Only available on moodleform_mod.
224      *
225      * @param stdClass $data passed by reference
226      */
227     public function data_postprocessing($data) {
228         parent::data_postprocessing($data);
230         $factory = new \core_h5p\factory();
231         $core = $factory->get_core();
232         if (isset($data->displayopt)) {
233             $config = (object) $data->displayopt;
234         } else {
235             $config = \core_h5p\helper::decode_display_options($core);
236         }
237         $data->displayoptions = \core_h5p\helper::get_display_options($core, $config);
239         if (!isset($data->enabletracking)) {
240             $data->enabletracking = 0;
241         }
242     }