// 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.
// 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;
}
$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;