diff --git a/h5p.classes.php b/h5p.classes.php index c5b93c1..e77258c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -11,9 +11,26 @@ interface H5PFrameworkInterface { * An associative array containing: * - name: The name of the plattform, for instance "Wordpress" * - version: The version of the pattform, for instance "4.0" + * - h5pVersion: The version of the H5P plugin/module */ public function getPlatformInfo(); + /** + * Fetches a file from a remote server using HTTP GET + * + * @param $url + * @return string The content (response body). NULL if something went wrong + */ + public function fetchExternalData($url); + + /** + * Set the tutorial URL for a library. All versions of the library is set + * + * @param string $machineName + * @param string $tutorialUrl + */ + public function setLibraryTutorialUrl($machineName, $tutorialUrl); + /** * Show the user an error message * @@ -1509,7 +1526,7 @@ class H5PCore { public static $coreApi = array( 'majorVersion' => 1, - 'minorVersion' => 3 + 'minorVersion' => 4 ); public static $styles = array( 'styles/h5p.css', @@ -1631,19 +1648,23 @@ class H5PCore { // Update content dependencies. $content['dependencies'] = $validator->getDependencies(); - $this->h5pF->deleteLibraryUsage($content['id']); - $this->h5pF->saveLibraryUsage($content['id'], $content['dependencies']); - if ($this->exportEnabled) { - // Recreate export file - $exporter = new H5PExport($this->h5pF, $this); - $exporter->createExportFile($content); + // Sometimes the parameters are filtered before content has been created + if ($content['id']) { + $this->h5pF->deleteLibraryUsage($content['id']); + $this->h5pF->saveLibraryUsage($content['id'], $content['dependencies']); - // TODO: Should we rather create the file once first accessed, like imagecache? + if ($this->exportEnabled) { + // Recreate export file + $exporter = new H5PExport($this->h5pF, $this); + $exporter->createExportFile($content); + + // TODO: Should we rather create the file once first accessed, like imagecache? + } + + // Cache. + $this->h5pF->setFilteredParameters($content['id'], $params); } - - // Cache. - $this->h5pF->setFilteredParameters($content['id'], $params); return $params; } @@ -2157,27 +2178,28 @@ class H5PCore { } /** - * Get a list of libraries' metadata from h5p.org. Cache it, and refetch once a week. - * - * @return mixed An object of objects keyed by machineName + * Fetch a list of libraries' metadata from h5p.org. + * Save URL tutorial to database. Each platform implementation + * is responsible for invoking this, eg using cron */ - public function getLibrariesMetadata() { - // Fetch from cache: -// $metadata = $this->h5pF->cacheGet('libraries','metadata'); - - // If not available in cache, or older than a week => refetch! - if ($metadata === NULL || $metadata->lastTimeFetched < (time() - self::SECONDS_IN_WEEK)) { - $platformInfo = $this->h5pF->getPlatformInfo(); - $json = file_get_contents('http://h5p.org/libraries-metadata.json?platform=' . json_encode($platformInfo)); - - $metadata = new stdClass(); - $metadata->json = ($json === FALSE ? NULL : json_decode($json)); - $metadata->lastTimeFetched = time(); - - // $this->h5pF->cacheSet('libraries','metadata', $metadata); + public function fetchLibrariesMetadata($fetchingDisabled = FALSE) { + $platformInfo = $this->h5pF->getPlatformInfo(); + $platformInfo['autoFetchingDisabled'] = $fetchingDisabled; + $platformInfo['uuid'] = $this->h5pF->getOption('h5p_site_uuid', ''); + // Adding random string to GET to be sure nothing is cached + $random = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 5); + $json = $this->h5pF->fetchExternalData('http://h5p.lvh.me/h5p.org/libraries-metadata.json?api=1&platform=' . urlencode(json_encode($platformInfo)) . '&x=' . urlencode($random)); + if ($json !== NULL) { + $json = json_decode($json); + if (isset($json->libraries)) { + foreach ($json->libraries as $machineName => $libInfo) { + $this->h5pF->setLibraryTutorialUrl($machineName, $libInfo->tutorialUrl); + } + } + if($platformInfo['uuid'] === '' && isset($json->uuid)) { + $this->h5pF->setOption('h5p_site_uuid', $json->uuid); + } } - - return $metadata->json; } } diff --git a/js/h5p.js b/js/h5p.js index a32b965..1ce6024 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1261,3 +1261,10 @@ if (H5P.jQuery) { } }); } + + /** + * Mimics how php's htmlspecialchars works (the way we use it) + */ +H5P.htmlSpecialChars = function(string) { + return string.toString().replace(//g, '>').replace(/'/g, ''').replace(/"/g, '"'); +};