diff --git a/h5p/classes/core.php b/h5p/classes/core.php new file mode 100644 index 00000000000..c855c2f822a --- /dev/null +++ b/h5p/classes/core.php @@ -0,0 +1,113 @@ +. + +/** + * H5P player class. + * + * @package core_h5p + * @copyright 2019 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_h5p; + +use H5PCore; +use stdClass; +use moodle_url; + +defined('MOODLE_INTERNAL') || die(); + +/** + * H5P player class, for displaying any local H5P content. + * + * @package core_h5p + * @copyright 2019 Sara Arjona + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class core extends \H5PCore { + + protected $libraries; + + protected function getDependencyPath(array $dependency): string { + $library = $this->find_library($dependency); + + return "libraries/{$library->id}/{$library->machinename}-{$library->majorversion}.{$library->minorversion}"; + } + + public function get_dependency_roots(int $id): array { + $roots = []; + $dependencies = $this->h5pF->loadContentDependencies($id); + $context = \context_system::instance(); + foreach ($dependencies as $dependency) { + $library = $this->find_library($dependency); + $roots[self::libraryToString($dependency, true)] = (moodle_url::make_pluginfile_url( + $context->id, + 'core_h5p', + 'libraries', + $library->id, + "/" . self::libraryToString($dependency, true), + '' + ))->out(false); + } + + return $roots; + } + + protected function find_library($dependency): \stdClass { + global $DB; + if (null === $this->libraries) { + $this->libraries = $DB->get_records('h5p_libraries'); + } + + $major = $dependency['majorVersion']; + $minor = $dependency['minorVersion']; + $patch = $dependency['patchVersion']; + + foreach ($this->libraries as $library) { + if ($library->machinename !== $dependency['machineName']) { + continue; + } + + if ($library->majorversion != $major) { + continue; + } + if ($library->minorversion != $minor) { + continue; + } + if ($library->patchversion != $patch) { + continue; + } + + return $library; + } + + return null; + } + + public static function get_scripts(): array { + global $CFG; + $cachebuster = '?ver='.$CFG->jsrev; + $liburl = $CFG->wwwroot . '/lib/h5p/'; + $urls = []; + + foreach (self::$scripts as $script) { + $urls[] = new moodle_url($liburl . $script . $cachebuster); + } + $urls[] = new moodle_url("/h5p/js/h5p_overrides.js"); + + return $urls; + } +} diff --git a/h5p/classes/file_storage.php b/h5p/classes/file_storage.php index b26c5208b96..4af223480c0 100644 --- a/h5p/classes/file_storage.php +++ b/h5p/classes/file_storage.php @@ -600,11 +600,12 @@ class file_storage implements \H5PFileStorage { } // Get the filearea. $filearea = array_shift($sections); + $itemid = array_shift($sections); // Get the filepath. $filepath = implode('/', $sections); $filepath = '/' . $filepath . '/'; - return ['filearea' => $filearea, 'filepath' => $filepath, 'filename' => $filename]; + return ['filearea' => $filearea, 'filepath' => $filepath, 'filename' => $filename, 'itemid' => $itemid]; } /** @@ -620,4 +621,4 @@ class file_storage implements \H5PFileStorage { return $DB->get_field('files', 'itemid', ['component' => self::COMPONENT, 'filearea' => $filearea, 'filepath' => $filepath, 'filename' => $filename]); } -} \ No newline at end of file +} diff --git a/h5p/classes/framework.php b/h5p/classes/framework.php index 54d15ff1e27..4905ab28a0f 100644 --- a/h5p/classes/framework.php +++ b/h5p/classes/framework.php @@ -1536,7 +1536,8 @@ class framework implements \H5PFrameworkInterface { $context = \context_system::instance(); $url = "{$CFG->wwwroot}/pluginfile.php/{$context->id}/core_h5p"; - $core = new \H5PCore($interface, $fs, $url, $language, true); + require_once("{$CFG->libdir}/h5p/h5p.classes.php"); + $core = new core($interface, $fs, $url, $language, true); $core->aggregateAssets = !(isset($CFG->core_h5p_aggregate_assets) && $CFG->core_h5p_aggregate_assets === '0'); } diff --git a/h5p/classes/player.php b/h5p/classes/player.php index 4cdc495b13d..eee9bff4587 100644 --- a/h5p/classes/player.php +++ b/h5p/classes/player.php @@ -41,7 +41,7 @@ class player { private $url; /** - * @var \H5PCore The H5PCore object. + * @var core The H5PCore object. */ private $core; @@ -96,7 +96,7 @@ class player { $this->content = $this->core->loadContent($this->h5pid); // Get the embedtype to use for displaying the H5P content. - $this->embedtype = \H5PCore::determineEmbedType($this->content['embedType'], $this->content['library']['embedTypes']); + $this->embedtype = core::determineEmbedType($this->content['embedType'], $this->content['library']['embedTypes']); } } @@ -125,18 +125,18 @@ class player { $cid = $this->get_cid(); $systemcontext = \context_system::instance(); - $disable = array_key_exists('disable', $this->content) ? $this->content['disable'] : \H5PCore::DISABLE_NONE; + $disable = array_key_exists('disable', $this->content) ? $this->content['disable'] : core::DISABLE_NONE; $displayoptions = $this->core->getDisplayOptionsForView($disable, $this->h5pid); $contenturl = \moodle_url::make_pluginfile_url($systemcontext->id, \core_h5p\file_storage::COMPONENT, \core_h5p\file_storage::CONTENT_FILEAREA, $this->h5pid, null, null); $contentsettings = [ - 'library' => \H5PCore::libraryToString($this->content['library']), + 'library' => core::libraryToString($this->content['library']), 'fullScreen' => $this->content['library']['fullscreen'], - 'exportUrl' => $this->get_export_settings($displayoptions[ \H5PCore::DISPLAY_OPTION_DOWNLOAD ]), + 'exportUrl' => $this->get_export_settings($displayoptions[ core::DISPLAY_OPTION_DOWNLOAD ]), 'embedCode' => $this->get_embed_code($this->url->out(), - $displayoptions[ \H5PCore::DISPLAY_OPTION_EMBED ]), + $displayoptions[ core::DISPLAY_OPTION_EMBED ]), 'resizeCode' => $this->get_resize_code(), 'title' => $this->content['slug'], 'displayOptions' => $displayoptions, @@ -401,10 +401,10 @@ class player { } $disableoptions = [ - \H5PCore::DISPLAY_OPTION_FRAME => $frame, - \H5PCore::DISPLAY_OPTION_DOWNLOAD => $export, - \H5PCore::DISPLAY_OPTION_EMBED => $embed, - \H5PCore::DISPLAY_OPTION_COPYRIGHT => $copyright, + core::DISPLAY_OPTION_FRAME => $frame, + core::DISPLAY_OPTION_DOWNLOAD => $export, + core::DISPLAY_OPTION_EMBED => $embed, + core::DISPLAY_OPTION_COPYRIGHT => $copyright, ]; return $this->core->getStorableDisplayOptions($disableoptions, 0); @@ -496,14 +496,14 @@ class player { $relpath = '/' . preg_replace('/^[^:]+:\/\/[^\/]+\//', '', $liburl); // Add core stylesheets. - foreach (\H5PCore::$styles as $style) { + foreach (core::$styles as $style) { $settings['core']['styles'][] = $relpath . $style . $cachebuster; $this->cssrequires[] = new \moodle_url($liburl . $style . $cachebuster); } // Add core JavaScript. - foreach (\H5PCore::$scripts as $script) { - $settings['core']['scripts'][] = $relpath . $script . $cachebuster; - $this->jsrequires[] = new \moodle_url($liburl . $script . $cachebuster); + foreach (core::get_scripts() as $script) { + $settings['core']['scripts'][] = $script->out(false); + $this->jsrequires[] = $script; } $cid = $this->get_cid(); @@ -582,6 +582,7 @@ class player { 'libraryConfig' => $this->core->h5pF->getLibraryConfig(), 'pluginCacheBuster' => $this->get_cache_buster(), 'libraryUrl' => $basepath . 'lib/h5p/js', + 'moodleLibraryPaths' => $this->core->get_dependency_roots($this->h5pid), ); return $settings; diff --git a/h5p/js/h5p_overrides.js b/h5p/js/h5p_overrides.js new file mode 100644 index 00000000000..10679e0c61d --- /dev/null +++ b/h5p/js/h5p_overrides.js @@ -0,0 +1,9 @@ +H5P._getLibraryPath = H5P.getLibraryPath; +H5P.getLibraryPath = function (library) { + if (H5PIntegration.moodleLibraryPaths) { + if (H5PIntegration.moodleLibraryPaths[library]) { + return H5PIntegration.moodleLibraryPaths[library]; + } + } + return H5P._getLibraryPath(library); +};