<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* The main mod_h5pactivity configuration form.
*
* @package mod_h5pactivity
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use mod_h5pactivity\local\manager;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot.'/course/moodleform_mod.php');
/**
* Module instance settings form.
*
* @package mod_h5pactivity
* @copyright 2020 Ferran Recio <ferran@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_h5pactivity_mod_form extends moodleform_mod {
/**
* Defines forms elements
*/
public function definition(): void {
global $CFG, $OUTPUT;
$mform = $this->_form;
// Adding the "general" fieldset, where all the common settings are shown.
$mform->addElement('header', 'general', get_string('general', 'form'));
// Adding the standard "name" field.
$mform->addElement('text', 'name', get_string('name'), ['size' => '64']);
if (!empty($CFG->formatstringstriptags)) {
$mform->setType('name', PARAM_TEXT);
} else {
$mform->setType('name', PARAM_CLEANHTML);
}
$mform->addRule('name', null, 'required', null, 'client');
$mform->addRule('name', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
$this->standard_intro_elements();
// Adding the rest of mod_h5pactivity settings, spreading all them into this fieldset.
$options = [];
$options['accepted_types'] = ['.h5p'];
$options['maxbytes'] = 0;
$options['maxfiles'] = 1;
$options['subdirs'] = 0;
$mform->addElement('filemanager', 'packagefile', get_string('package', 'mod_h5pactivity'), null, $options);
$mform->addHelpButton('packagefile', 'package', 'mod_h5pactivity');
$mform->addRule('packagefile', null, 'required');
// Add a link to the Content Bank if the user can access.
$course = $this->get_course();
< $context = context_course::instance($course->id);
< if (has_capability('moodle/contentbank:access', $context)) {
< $url = new moodle_url('/contentbank/index.php', ['contextid' => $context->id]);
> $coursecontext = context_course::instance($course->id);
> if (has_capability('moodle/contentbank:access', $coursecontext)) {
> $msg = null;
> $context = $this->get_context();
> if ($context instanceof \context_module) {
> // This is an existing activity. If the H5P file it's a referenced file from the content bank, a link for
> // displaying this specific content will be used instead of the generic link to the main page of the content bank.
> $fs = get_file_storage();
> $files = $fs->get_area_files($context->id, 'mod_h5pactivity', 'package', 0, 'sortorder, itemid, filepath,
> filename', false);
> $file = reset($files);
> if ($file && $file->get_reference() != null) {
> $referencedfile = \repository::get_moodle_file($file->get_reference());
> if ($referencedfile->get_component() == 'contentbank') {
> // If the attached file is a referencedfile in the content bank, display a link to open this content.
> $url = new moodle_url('/contentbank/view.php', ['id' => $referencedfile->get_itemid()]);
> $msg = get_string('opencontentbank', 'mod_h5pactivity', $url->out());
> $msg .= ' '.$OUTPUT->help_icon('contentbank', 'mod_h5pactivity');
> }
> }
> }
> if (!isset($msg)) {
> $url = new moodle_url('/contentbank/index.php', ['contextid' => $coursecontext->id]);
$msg = get_string('usecontentbank', 'mod_h5pactivity', $url->out());
$msg .= ' '.$OUTPUT->help_icon('contentbank', 'mod_h5pactivity');
> }
$mform->addElement('static', 'contentbank', '', $msg);
>
}
// H5P displaying options.
$factory = new \core_h5p\factory();
$core = $factory->get_core();
$displayoptions = (array) \core_h5p\helper::decode_display_options($core);
$mform->addElement('header', 'h5pdisplay', get_string('h5pdisplay', 'mod_h5pactivity'));
foreach ($displayoptions as $key => $value) {
$name = get_string('display'.$key, 'mod_h5pactivity');
$fieldname = "displayopt[$key]";
$mform->addElement('checkbox', $fieldname, $name);
$mform->setType($fieldname, PARAM_BOOL);
}
// Add standard grading elements.
$this->standard_grading_coursemodule_elements();
// Attempt options.
$mform->addElement('header', 'h5pattempts', get_string('h5pattempts', 'mod_h5pactivity'));
$mform->addElement('static', 'trackingwarning', '', get_string('tracking_messages', 'mod_h5pactivity'));
$options = [1 => get_string('yes'), 0 => get_string('no')];
$mform->addElement('select', 'enabletracking', get_string('enabletracking', 'mod_h5pactivity'), $options);
$mform->setDefault('enabletracking', 1);
$options = manager::get_grading_methods();
$mform->addElement('select', 'grademethod', get_string('grade_grademethod', 'mod_h5pactivity'), $options);
$mform->setType('grademethod', PARAM_INT);
$mform->hideIf('grademethod', 'enabletracking', 'neq', 1);
$mform->disabledIf('grademethod', 'grade[modgrade_type]', 'neq', 'point');
$mform->addHelpButton('grademethod', 'grade_grademethod', 'mod_h5pactivity');
$options = manager::get_review_modes();
$mform->addElement('select', 'reviewmode', get_string('review_mode', 'mod_h5pactivity'), $options);
$mform->setType('reviewmode', PARAM_INT);
$mform->hideIf('reviewmode', 'enabletracking', 'neq', 1);
// Add standard elements.
$this->standard_coursemodule_elements();
// Add standard buttons.
$this->add_action_buttons();
}
/**
* Enforce validation rules here
*
* @param array $data array of ("fieldname"=>value) of submitted data
* @param array $files array of uploaded files "element_name"=>tmp_file_path
* @return array
**/
public function validation($data, $files) {
global $USER;
$errors = parent::validation($data, $files);
if (empty($data['packagefile'])) {
$errors['packagefile'] = get_string('required');
} else {
$draftitemid = file_get_submitted_draft_itemid('packagefile');
file_prepare_draft_area($draftitemid, $this->context->id, 'mod_h5pactivity', 'packagefilecheck', null,
['subdirs' => 0, 'maxfiles' => 1]);
// Get file from users draft area.
$usercontext = context_user::instance($USER->id);
$fs = get_file_storage();
$files = $fs->get_area_files($usercontext->id, 'user', 'draft', $draftitemid, 'id', false);
if (count($files) < 1) {
$errors['packagefile'] = get_string('required');
return $errors;
}
$file = reset($files);
if (!$file->is_external_file() && !empty($data['updatefreq'])) {
// Make sure updatefreq is not set if using normal local file.
$errors['updatefreq'] = get_string('updatefreq_error', 'mod_h5pactivity');
}
}
return $errors;
}
/**
* Enforce defaults here.
*
* @param array $defaultvalues Form defaults
* @return void
**/
public function data_preprocessing(&$defaultvalues) {
// H5P file.
$draftitemid = file_get_submitted_draft_itemid('packagefile');
file_prepare_draft_area($draftitemid, $this->context->id, 'mod_h5pactivity',
'package', 0, ['subdirs' => 0, 'maxfiles' => 1]);
$defaultvalues['packagefile'] = $draftitemid;
// H5P display options.
$factory = new \core_h5p\factory();
$core = $factory->get_core();
if (isset($defaultvalues['displayoptions'])) {
$currentdisplay = $defaultvalues['displayoptions'];
$displayoptions = (array) \core_h5p\helper::decode_display_options($core, $currentdisplay);
} else {
$displayoptions = (array) \core_h5p\helper::decode_display_options($core);
}
foreach ($displayoptions as $key => $value) {
$fieldname = "displayopt[$key]";
$defaultvalues[$fieldname] = $value;
}
}
/**
* Allows modules to modify the data returned by form get_data().
* This method is also called in the bulk activity completion form.
*
* Only available on moodleform_mod.
*
* @param stdClass $data passed by reference
*/
public function data_postprocessing($data) {
parent::data_postprocessing($data);
$factory = new \core_h5p\factory();
$core = $factory->get_core();
if (isset($data->displayopt)) {
$config = (object) $data->displayopt;
} else {
$config = \core_h5p\helper::decode_display_options($core);
}
$data->displayoptions = \core_h5p\helper::get_display_options($core, $config);
if (!isset($data->enabletracking)) {
$data->enabletracking = 0;
}
}
}