MDL-61932 mod_glossary: Display site-level glossaries on section 1
authorJun Pataleta <jun@moodle.com>
Wed, 11 Apr 2018 08:39:04 +0000 (16:39 +0800)
committerJun Pataleta <jun@moodle.com>
Thu, 17 May 2018 08:02:36 +0000 (16:02 +0800)
* Glossary activities created on the front page by importing
entries are being added to section 0, but the front page only shows
activities on section 1.

mod/glossary/db/upgrade.php
mod/glossary/import.php
mod/glossary/version.php

index a4a055a..ba43faa 100644 (file)
@@ -20,7 +20,7 @@
 // before any action that may take longer time to finish.
 
 function xmldb_glossary_upgrade($oldversion) {
-    global $CFG;
+    global $CFG, $DB;
 
     // Automatically generated Moodle v3.2.0 release upgrade line.
     // Put any upgrade step following this.
@@ -31,5 +31,61 @@ function xmldb_glossary_upgrade($oldversion) {
     // Automatically generated Moodle v3.4.0 release upgrade line.
     // Put any upgrade step following this.
 
+    if ($oldversion < 2018051401) {
+
+        // Fetch the module ID for the glossary module.
+        $glossarymoduleid = $DB->get_field('modules', 'id', ['name' => 'glossary']);
+
+        // Fetch sections for the frontpage not matching 1.
+        $sectionselect = 'course = :course AND section <> 1';
+        $sitesections = $DB->get_recordset_select('course_sections', $sectionselect, ['course' => SITEID]);
+        $newsection1cmids = [];
+        foreach ($sitesections as $section) {
+            // Fetch the course module IDs of the course modules in the section.
+            $cmids = explode(',', $section->sequence);
+            $newcmids = [];
+            // Update the section in the course_modules table for glossary instances if necessary.
+            foreach ($cmids as $cmid) {
+                $params = [
+                    'id' => $cmid,
+                    'module' => $glossarymoduleid
+                ];
+                // Check if the record in the course_modules tables is that of a glossary activity.
+                if ($DB->record_exists('course_modules', $params)) {
+                    // If so, move it to section 1.
+                    $DB->set_field('course_modules', 'section', 1, $params);
+                    $newsection1cmids[] = $cmid;
+                } else {
+                    // Otherwise, ignore this course module as we only want to update glossary items.
+                    $newcmids[] = $cmid;
+                }
+            }
+            // Check if we need to update the section record or we can delete it.
+            if (!empty($newcmids)) {
+                // Update the section record with a sequence that now excludes the glossary instance(s).
+                $sequence = implode(',', $newcmids);
+                $DB->set_field('course_sections', 'section', $sequence, ['id' => $section->id]);
+            } else {
+                // This section doesn't contain any items anymore, we can remove this.
+                $DB->delete_records('course_sections', ['id' => $section->id]);
+            }
+        }
+        $sitesections->close();
+
+        // Update the sequence field for the site's section 1 if necessary.
+        if (!empty($newsection1cmids)) {
+            $section1params = [
+                'course' => 1,
+                'section' => 1
+            ];
+            $section1sequence = $DB->get_field('course_sections', 'sequence', $section1params);
+            $newsection1sequence = implode(',', array_merge([$section1sequence], $newsection1cmids));
+            // Update the sequence field of the first section for the front page.
+            $DB->set_field('course_sections', 'sequence', $newsection1sequence, $section1params);
+        }
+
+        upgrade_mod_savepoint(true, 2018051401, 'glossary');
+    }
+
     return true;
 }
index 902455c..783864e 100644 (file)
@@ -141,8 +141,15 @@ if ($xml = glossary_read_imported_file($result)) {
             $glossary->assessed = 0;
             $glossary->availability = null;
 
-            // New glossary is to be inserted in section 0, it is always visible.
-            $glossary->section = 0;
+            // Check if we're creating the new glossary on the front page or inside a course.
+            if ($cm->course == SITEID) {
+                // On the front page, activities are in section 1.
+                $glossary->section = 1;
+            } else {
+                // Inside a course, add to the general section (0).
+                $glossary->section = 0;
+            }
+            // New glossary is always visible.
             $glossary->visible = 1;
             $glossary->visibleoncoursepage = 1;
 
index b26ebf7..6d219fd 100644 (file)
@@ -24,7 +24,7 @@
 
 defined('MOODLE_INTERNAL') || die();
 
-$plugin->version   = 2018051400;       // The current module version (Date: YYYYMMDDXX)
+$plugin->version   = 2018051401;       // The current module version (Date: YYYYMMDDXX)
 $plugin->requires  = 2018050800;    // Requires this Moodle version
 $plugin->component = 'mod_glossary';   // Full name of the plugin (used for diagnostics)
 $plugin->cron      = 0;