AutorÃa | Ultima modificación | Ver Log |
<?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 mod_hvp view assets convenience class for viewing and embedding H5Ps** @package mod_hvp* @copyright 2017 Joubel* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace mod_hvp;use moodle_url;defined('MOODLE_INTERNAL') || die();/*** Handles finding and attaching assets for view* @package mod_hvp*/class view_assets {private $cm;private $course;private $core;private $content;private $jsrequires;private $cssrequires;protected $settings;protected $embedtype;protected $files;public function __construct($cm, $course, $options = []) {$this->cm = $cm;$this->course = $course;$this->core = framework::instance();$this->content = $this->core->loadContent($cm->instance);$this->settings = hvp_get_core_assets(\context_module::instance($cm->id));$this->jsrequires = [];$this->cssrequires = [];$context = \context_module::instance($this->cm->id);$displayoptions = $this->core->getDisplayOptionsForView($this->content['disable'], $context->instanceid);if (isset($options['disabledownload']) && $options['disabledownload']) {$displayoptions[\H5PCore::DISPLAY_OPTION_DOWNLOAD] = false;}if (isset($options['disablefullscreen']) && $options['disablefullscreen']) {$this->settings['fullscreenDisabled'] = true;}// Add JavaScript settings for this content.$cid = 'cid-' . $this->content['id'];$root = self::getsiteroot();$this->settings['contents'][ $cid ] = array('library' => \H5PCore::libraryToString($this->content['library']),'jsonContent' => $this->getfilteredparameters(),'fullScreen' => $this->content['library']['fullscreen'],'exportUrl' => $this->getexportsettings($displayoptions[ \H5PCore::DISPLAY_OPTION_DOWNLOAD ]),'embedCode' => $this->getembedcode($displayoptions[ \H5PCore::DISPLAY_OPTION_EMBED ]),'resizeCode' => $this->getresizecode($displayoptions[ \H5PCore::DISPLAY_OPTION_EMBED ]),'title' => $this->content['title'],'displayOptions' => $displayoptions,'url' => "{$root}/mod/hvp/view.php?id={$this->cm->id}",'contentUrl' => "{$root}/pluginfile.php/{$context->id}/mod_hvp/content/{$this->content['id']}",'metadata' => $this->content['metadata'],'contentUserData' => array(0 => content_user_data::load_pre_loaded_user_data($this->content['id'])));$this->embedtype = isset($options->forceembedtype) ? $options->forceembedtype : \H5PCore::determineEmbedType($this->content['embedType'], $this->content['library']['embedTypes']);$this->files = $this->getdependencyfiles();$this->generateassets();}/*** Filtered and potentially altered parameters** @return Object|string*/private function getfilteredparameters() {global $PAGE;$safeparameters = $this->core->filterParameters($this->content);$decodedparams = json_decode($safeparameters);$hvpoutput = $PAGE->get_renderer('mod_hvp');$hvpoutput->hvp_alter_filtered_parameters($decodedparams,$this->content['library']['name'],$this->content['library']['majorVersion'],$this->content['library']['minorVersion']);$safeparameters = json_encode($decodedparams);return $safeparameters;}/*** Export path for settings** @param $downloadenabled** @return string*/private function getexportsettings($downloadenabled) {global $CFG;if ( ! $downloadenabled || (isset($CFG->mod_hvp_export) && $CFG->mod_hvp_export === false)) {return '';}$modulecontext = \context_module::instance($this->cm->id);$slug = $this->content['slug'] ? $this->content['slug'] . '-' : '';$url = \moodle_url::make_pluginfile_url($modulecontext->id,'mod_hvp','exports','','',"{$slug}{$this->content['id']}.h5p");return $url->out();}/*** Embed code for settings** @param $embedenabled** @return string*/private function getembedcode($embedenabled) {if ( ! $embedenabled) {return '';}$root = self::getsiteroot();$embedurl = new \moodle_url("{$root}/mod/hvp/embed.php?id={$this->cm->id}");$title = isset($this->content['metadata']['a11yTitle'])? $this->content['metadata']['a11yTitle']: (isset($this->content['metadata']['title'])? $this->content['metadata']['title']: '');return "<iframe src=\"{$embedurl->out()}\" width=\":w\" height=\":h\" frameborder=\"0\" " ."allowfullscreen=\"allowfullscreen\" title=\"{$title}\"></iframe>";}/*** Resizing script for settings** @param $embedenabled** @return string*/private function getresizecode($embedenabled) {if ( ! $embedenabled) {return '';}$resizeurl = new \moodle_url(self::getsiteroot() . '/mod/hvp/library/js/h5p-resizer.js');return "<script src=\"{$resizeurl->out()}\" charset=\"UTF-8\"></script>";}/*** Finds library dependencies of view** @return array Files that the view has dependencies to*/private function getdependencyfiles() {global $PAGE;$preloadeddeps = $this->core->loadContentDependencies($this->content['id'], 'preloaded');$files = $this->core->getDependenciesFiles($preloadeddeps);// Add additional asset files if required.$hvpoutput = $PAGE->get_renderer('mod_hvp');$hvpoutput->hvp_alter_scripts($files['scripts'], $preloadeddeps, $this->embedtype);$hvpoutput->hvp_alter_styles($files['styles'], $preloadeddeps, $this->embedtype);return $files;}/*** Generates assets depending on embed type*/private function generateassets() {if ($this->embedtype === 'div') {$context = \context_system::instance();$hvppath = "/pluginfile.php/{$context->id}/mod_hvp";// Schedule JavaScripts for loading through Moodle.foreach ($this->files['scripts'] as $script) {$url = $script->path . $script->version;// Add URL prefix if not external.$isexternal = strpos($script->path, '://');if ($isexternal === false) {$url = $hvppath . $url;}$this->settings['loadedJs'][] = $url;$this->jsrequires[] = new \moodle_url($isexternal ? $url : self::getsiteroot() . $url);}// Schedule stylesheets for loading through Moodle.foreach ($this->files['styles'] as $style) {$url = $style->path . $style->version;// Add URL prefix if not external.$isexternal = strpos($style->path, '://');if ($isexternal === false) {$url = $hvppath . $url;}$this->settings['loadedCss'][] = $url;$this->cssrequires[] = new \moodle_url($isexternal ? $url : self::getsiteroot() . $url);}} else {// JavaScripts and stylesheets will be loaded through h5p.js.$cid = 'cid-' . $this->content['id'];$this->settings['contents'][ $cid ]['scripts'] = $this->core->getAssetsUrls($this->files['scripts']);$this->settings['contents'][ $cid ]['styles'] = $this->core->getAssetsUrls($this->files['styles']);}}public function getcontent() {return $this->content;}/*** Logs viewed to all handlers*/public function logviewed() {$this->logh5pviewedevent();$this->logcompletioncriteriaviewed();$this->triggermoduleviewedevent();}/*** Logs content viewed to H5P core*/public function logh5pviewedevent() {new event('content', null,$this->content['id'], $this->content['title'],$this->content['library']['name'],$this->content['library']['majorVersion'] . '.' . $this->content['library']['minorVersion']);}/*** Logs activity viewed to completion criterias*/public function logcompletioncriteriaviewed() {$completion = new \completion_info($this->course);$completion->set_module_viewed($this->cm);}/*** Allows observers to act on viewed event*/public function triggermoduleviewedevent() {$event = event\course_module_viewed::create(array('objectid' => $this->cm->instance,'context' => \context_module::instance($this->cm->id)));$event->add_record_snapshot('course_modules', $this->cm);$event->trigger();}/*** Adds js assets to current page*/public function addassetstopage() {global $PAGE;foreach ($this->jsrequires as $script) {$PAGE->requires->js($script, true);}foreach ($this->cssrequires as $css) {$PAGE->requires->css($css);}// Print JavaScript settings to page.$PAGE->requires->data_for_js('H5PIntegration', $this->settings, true);// Add xAPI collector script.$PAGE->requires->js(new \moodle_url(self::getsiteroot() . '/mod/hvp/xapi-collector.js'), true);}/*** Outputs h5p view*/public function outputview() {if ($this->embedtype === 'div') {echo "<div class=\"h5p-content\" data-content-id=\"{$this->content['id']}\"></div>";} else {$title = isset($this->content['metadata']['a11yTitle'])? $this->content['metadata']['a11yTitle']: (isset($this->content['metadata']['title'])? $this->content['metadata']['title']: '');echo "<div class=\"h5p-iframe-wrapper\">" ."<iframe id=\"h5p-iframe-{$this->content['id']}\"" ." class=\"h5p-iframe\"" ." data-content-id=\"{$this->content['id']}\"" ." style=\"height:1px\"" ." src=\"about:blank\"" ." frameBorder=\"0\"" ." scrolling=\"no\"" ." title=\"{$title}\">" ."</iframe>" ."</div>";}}/*** Checks if content is valid, prints an error if not*/public function validatecontent() {if ($this->content === null) {print_error('invalidhvp', 'mod_hvp');}}/*** Gets the site root absolute address** @return string Root address for the site*/public static function getsiteroot() {global $CFG;// In Moodle 3.4 version wwwroot is always the same as httpswwwroot.if ($CFG->version < 2017111300) {return $CFG->httpswwwroot;}return $CFG->wwwroot;}}