Merge branch 'MDL-68576-master' of git://github.com/mihailges/moodle
[moodle.git] / h5p / classes / local / library / autoloader.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  * H5P autoloader management class.
19  *
20  * @package    core_h5p
21  * @copyright  2019 Sara Arjona <sara@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core_h5p\local\library;
27 /**
28  * H5P autoloader management class.
29  *
30  * @package    core_h5p
31  * @copyright  2019 Sara Arjona <sara@moodle.com>
32  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33  */
34 class autoloader {
36     /**
37      * Returns the list of plugins that can work as H5P library handlers (have class PLUGINNAME\local\library\handler)
38      * @return array with the format: pluginname => class
39      */
40     public static function get_all_handlers(): array {
41         $handlers = [];
42         $plugins = \core_component::get_plugin_list_with_class('h5plib', 'local\library\handler') +
43             \core_component::get_plugin_list_with_class('h5plib', 'local_library_handler');
44         // Allow plugins to have the class either with namespace or without (useful for unittest).
45         foreach ($plugins as $pname => $class) {
46             $handlers[$pname] = $class;
47         }
49         return $handlers;
50     }
52     /**
53      * Returns the default H5P library handler.
54      * @return string|null H5P library handler class
55      */
56     public static function get_default_handler(): ?string {
57         $default = null;
58         $handlers = self::get_all_handlers();
59         if (!empty($handlers)) {
60             // The default handler will be the first in the list.
61             $keys = array_keys($handlers);
62             $default = array_shift($keys);
63         }
65         return $default;
66     }
68     /**
69      * Returns the current H5P library handler class.
70      *
71      * @return string H5P library handler class
72      * @throws \moodle_exception
73      */
74     public static function get_handler_classname(): string {
75         global $CFG;
77         $handlers = self::get_all_handlers();
78         if (!empty($CFG->h5plibraryhandler)) {
79             if (isset($handlers[$CFG->h5plibraryhandler])) {
80                 return $handlers[$CFG->h5plibraryhandler];
81             }
82         }
84         // If no handler has been defined or it doesn't exist, return the default one.
85         $defaulthandler = self::get_default_handler();
86         if (empty($defaulthandler)) {
87             // If there is no default handler, throw an exception.
88             throw new \moodle_exception('noh5plibhandlerdefined', 'core_h5p');
89         }
91         return $defaulthandler;
92     }
94     /**
95      * Get the current version of the H5P core library.
96      *
97      * @return string
98      */
99     public static function get_h5p_version(): string {
100         return component_class_callback(self::get_handler_classname(), 'get_h5p_version', []);
101     }
103     /**
104      * Get a URL for the current H5P Core Library.
105      *
106      * @param string $filepath The path within the h5p root
107      * @param array $params these params override current params or add new
108      * @return null|moodle_url
109      */
110     public static function get_h5p_core_library_url(?string $filepath = null, ?array $params = null): ?\moodle_url {
111         return component_class_callback(self::get_handler_classname(), 'get_h5p_core_library_url', [$filepath, $params]);
112     }
114     /**
115      * Get a URL for the current H5P Editor Library.
116      *
117      * @param string $filepath The path within the h5p root.
118      * @param array $params These params override current params or add new.
119      * @return null|\moodle_url The moodle_url instance to a file in the H5P Editor library.
120      */
121     public static function get_h5p_editor_library_url(?string $filepath = null, ?array $params = null): ?\moodle_url {
122         return component_class_callback(self::get_handler_classname(), 'get_h5p_editor_library_url', [$filepath, $params]);
123     }
125     /**
126      * Get the base path for the current H5P Editor Library.
127      *
128      * @param string $filepath The path within the h5p root.
129      * @return string  Path to a file in the H5P Editor library.
130      */
131     public static function get_h5p_editor_library_base(?string $filepath = null): string {
132         return component_class_callback(self::get_handler_classname(), 'get_h5p_editor_library_base', [$filepath]);
133     }
135     /**
136      * Register the H5P autoloader.
137      */
138     public static function register(): void {
139         component_class_callback(self::get_handler_classname(), 'register', []);
140     }