Merge branch 'MDL-70408-master' of git://github.com/sarjona/moodle
[moodle.git] / mod / h5pactivity / mod_form.php
CommitLineData
b7a41681
FR
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/>.
16
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 */
24
e28b4069
FR
25use mod_h5pactivity\local\manager;
26
b7a41681
FR
27defined('MOODLE_INTERNAL') || die();
28
4d0241e4 29global $CFG;
b7a41681
FR
30require_once($CFG->dirroot.'/course/moodleform_mod.php');
31
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 */
39class mod_h5pactivity_mod_form extends moodleform_mod {
40
41 /**
42 * Defines forms elements
43 */
44 public function definition(): void {
7f602632 45 global $CFG, $OUTPUT;
b7a41681
FR
46
47 $mform = $this->_form;
48
49 // Adding the "general" fieldset, where all the common settings are shown.
50 $mform->addElement('header', 'general', get_string('general', 'form'));
51
52 // Adding the standard "name" field.
53 $mform->addElement('text', 'name', get_string('name'), ['size' => '64']);
54
55 if (!empty($CFG->formatstringstriptags)) {
56 $mform->setType('name', PARAM_TEXT);
57 } else {
58 $mform->setType('name', PARAM_CLEANHTML);
59 }
60
61 $mform->addRule('name', null, 'required', null, 'client');
62 $mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
63
64 $this->standard_intro_elements();
65
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;
72
73 $mform->addElement('filemanager', 'packagefile', get_string('package', 'mod_h5pactivity'), null, $options);
74 $mform->addHelpButton('packagefile', 'package', 'mod_h5pactivity');
bcea21d8 75 $mform->addRule('packagefile', null, 'required');
b7a41681 76
7f602632 77 // Add a link to the Content Bank if the user can access.
dd75c988 78 $course = $this->get_course();
064e1a7e
SA
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 }
105
7f602632
FR
106 $mform->addElement('static', 'contentbank', '', $msg);
107 }
108
b7a41681
FR
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 }
120
121 // Add standard grading elements.
122 $this->standard_grading_coursemodule_elements();
123
e28b4069
FR
124 // Attempt options.
125 $mform->addElement('header', 'h5pattempts', get_string('h5pattempts', 'mod_h5pactivity'));
126
127 $mform->addElement('static', 'trackingwarning', '', get_string('tracking_messages', 'mod_h5pactivity'));
128
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);
132
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');
139
9a4307dd
FR
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');
144
b7a41681
FR
145 // Add standard elements.
146 $this->standard_coursemodule_elements();
147
148 // Add standard buttons.
149 $this->add_action_buttons();
150 }
151
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);
162
163 if (empty($data['packagefile'])) {
164 $errors['packagefile'] = get_string('required');
165
166 } else {
167 $draftitemid = file_get_submitted_draft_itemid('packagefile');
168
169 file_prepare_draft_area($draftitemid, $this->context->id, 'mod_h5pactivity', 'packagefilecheck', null,
170 ['subdirs' => 0, 'maxfiles' => 1]);
171
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);
176
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 }
187
188 return $errors;
189 }
190
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;
203
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 }
218
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);
229
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);
e28b4069
FR
238
239 if (!isset($data->enabletracking)) {
240 $data->enabletracking = 0;
241 }
b7a41681
FR
242 }
243}