MDL-69520 core_h5p: add example and tutorial links
authorSara Arjona <sara@moodle.com>
Thu, 24 Sep 2020 12:03:04 +0000 (14:03 +0200)
committerSara Arjona <sara@moodle.com>
Wed, 14 Oct 2020 15:47:46 +0000 (17:47 +0200)
h5p/classes/core.php
h5p/classes/editor_ajax.php
h5p/classes/editor_framework.php
h5p/classes/framework.php
lib/db/install.xml
lib/db/upgrade.php
version.php

index c3a9a88..3d80611 100644 (file)
@@ -190,6 +190,13 @@ class core extends \H5PCore {
                 'minorVersion' => $type->version->minor,
                 'patchVersion' => $type->version->patch,
             ];
+            // Add example and tutorial to the library, to store this information too.
+            if (isset($type->example)) {
+                $library['example'] = $type->example;
+            }
+            if (isset($type->tutorial)) {
+                $library['tutorial'] = $type->tutorial;
+            }
 
             $shoulddownload = true;
             if ($framework->getLibraryId($type->id, $type->version->major, $type->version->minor)) {
@@ -221,6 +228,8 @@ class core extends \H5PCore {
      * @return int|null Returns the id of the content type library installed, null otherwise.
      */
     public function fetch_content_type(array $library): ?int {
+        global $DB;
+
         $factory = new factory();
 
         // Download the latest content type from the H5P official repository.
@@ -250,6 +259,18 @@ class core extends \H5PCore {
         $librarykey = static::libraryToString($library);
         $libraryid = $factory->get_storage()->h5pC->librariesJsonData[$librarykey]["libraryId"];
 
+        // Update example and tutorial (if any of them are defined in $library).
+        $params = ['id' => $libraryid];
+        if (array_key_exists('example', $library)) {
+            $params['example'] = $library['example'];
+        }
+        if (array_key_exists('tutorial', $library)) {
+            $params['tutorial'] = $library['tutorial'];
+        }
+        if (count($params) > 1) {
+            $DB->update_record('h5p_libraries', $params);
+        }
+
         return $libraryid;
     }
 
index 6f293d0..43e4248 100644 (file)
@@ -76,8 +76,23 @@ class editor_ajax implements H5PEditorAjaxInterface {
      * @return mixed|null Returns results from querying the database
      */
     public function getContentTypeCache($machinename = null) {
-        // This is to be implemented when the Hub client is used.
-        return [];
+        global $DB;
+
+        // Added some extra fields to the result because they are expected by functions calling this. They have been
+        // taken from method getCachedLibsMap() in h5peditor.class.php.
+        $sql = "SELECT l.id, l.machinename AS machine_name, l.majorversion AS major_version,
+                       l.minorversion AS minor_version, l.patchversion AS patch_version, l.coremajor AS h5p_major_version,
+                       l.coreminor AS h5p_minor_version, l.title, l.tutorial, l.example,
+                       '' AS summary, '' AS description, '' AS icon, 0 AS created_at, 0 AS updated_at, 0 AS is_recommended,
+                       0 AS popularity, '' AS screenshots, '' AS license, '' AS owner
+                  FROM {h5p_libraries} l";
+        $params = [];
+        if (!empty($machinename)) {
+            $sql .= ' WHERE l.machinename = :machine_name';
+            $params = ['machine_name' => $machinename];
+        }
+
+        return $DB->get_records_sql($sql, $params);
     }
 
     /**
index 8f97a36..587b834 100644 (file)
@@ -228,7 +228,7 @@ class editor_framework implements H5peditorStorage {
         if ($libraries !== null) {
             // Get details for the specified libraries.
             $librariesin = [];
-            $fields = 'title, runnable, metadatasettings';
+            $fields = 'title, runnable, metadatasettings, example, tutorial';
 
             foreach ($libraries as $library) {
                 $params = [
@@ -243,11 +243,13 @@ class editor_framework implements H5peditorStorage {
                     $library->title = $details->title;
                     $library->runnable = $details->runnable;
                     $library->metadataSettings = json_decode($details->metadatasettings);
+                    $library->example = $details->example;
+                    $library->tutorial = $details->tutorial;
                     $librariesin[] = $library;
                 }
             }
         } else {
-            $fields = 'id, machinename as name, title, majorversion, minorversion, metadatasettings';
+            $fields = 'id, machinename as name, title, majorversion, minorversion, metadatasettings, example, tutorial';
             $librariesin = api::get_contenttype_libraries($fields);
         }
 
index 25d0ad9..d4b0d6a 100644 (file)
@@ -115,7 +115,16 @@ class framework implements \H5PFrameworkInterface {
      * @param string $url
      */
     public function setLibraryTutorialUrl($libraryname, $url) {
-        // Tutorial url is currently not being used or stored in libraries.
+        global $DB;
+
+        $sql = 'UPDATE {h5p_libraries}
+                   SET tutorial = :tutorial
+                 WHERE machinename = :machinename';
+        $params = [
+            'tutorial' => $url,
+            'machinename' => $libraryname,
+        ];
+        $DB->execute($sql, $params);
     }
 
     /**
index bcc3e18..4781461 100644 (file)
         <FIELD NAME="coremajor" TYPE="int" LENGTH="4" NOTNULL="false" SEQUENCE="false" COMMENT="H5P core API major version required"/>
         <FIELD NAME="coreminor" TYPE="int" LENGTH="4" NOTNULL="false" SEQUENCE="false" COMMENT="H5P core API minor version required"/>
         <FIELD NAME="metadatasettings" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Library metadata settings"/>
+        <FIELD NAME="tutorial" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Tutorial URL"/>
+        <FIELD NAME="example" TYPE="text" NOTNULL="false" SEQUENCE="false" COMMENT="Example URL"/>
       </FIELDS>
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
index f7665df..412f94b 100644 (file)
@@ -2762,5 +2762,25 @@ function xmldb_main_upgrade($oldversion) {
         upgrade_main_savepoint(true, 2021052500.20);
     }
 
+    if ($oldversion < 2021052500.24) {
+        // Define fields tutorial and example to be added to h5p_libraries.
+        $table = new xmldb_table('h5p_libraries');
+
+        // Add tutorial field.
+        $field = new xmldb_field('tutorial', XMLDB_TYPE_TEXT, null, null, null, null, null, 'metadatasettings');
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+        // Add example field.
+        $field = new xmldb_field('example', XMLDB_TYPE_TEXT, null, null, null, null, null, 'tutorial');
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+        // Main savepoint reached.
+        upgrade_main_savepoint(true, 2021052500.24);
+    }
+
     return true;
 }
index 803ea6b..0f7c650 100644 (file)
@@ -29,7 +29,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$version  = 2021052500.23;              // YYYYMMDD      = weekly release date of this DEV branch.
+$version  = 2021052500.24;              // YYYYMMDD      = weekly release date of this DEV branch.
                                         //         RR    = release increments - 00 in DEV branches.
                                         //           .XX = incremental changes.
 $release  = '4.0dev (Build: 20201013)'; // Human-friendly version name