MDL-35339 Deprecate add_mod_to_section(), create new function course_add_cm_to_section()
authorMarina Glancy <marina@moodle.com>
Mon, 24 Sep 2012 09:08:02 +0000 (17:08 +0800)
committerMarina Glancy <marina@moodle.com>
Mon, 15 Oct 2012 06:08:13 +0000 (14:08 +0800)
Function add_mod_to_section() has very confusing arguments when object  looks like record from
table course_modules but field ->section refers to relative section number (course_sections.section).
In table course_modules the field section refers to course_sections.id.
Also add_mod_to_section() does not update table course_modules and does not call rebuild_course_cache()
which developer can forget to do afterwards.

- Added function course_add_cm_to_section()
- In the core code add_mod_to_section() is replaced with course_add_cm_to_section()
- Function add_mod_to_section() is deprecated

admin/tool/generator/locallib.php
course/dnduploadlib.php
course/lib.php
course/modedit.php
lib/deprecatedlib.php
lib/phpunit/classes/module_generator.php
mod/assign/upgradelib.php
mod/forum/lib.php
mod/glossary/import.php

index 169f643..70d544d 100644 (file)
@@ -556,7 +556,7 @@ class generator {
                         $module->name = ucfirst($moduledata->name) . ' ' . $moduledata->count++;
 
                         $module->course = $courseid;
-                        $module->section = $i;
+                        $module->section = 0;
                         $module->module = $moduledata->id;
                         $module->modulename = $moduledata->name;
                         $module->add = $moduledata->name;
@@ -564,10 +564,7 @@ class generator {
                         $module->coursemodule = '';
                         $add_instance_function = $moduledata->name . '_add_instance';
 
-                        $section = get_course_section($i, $courseid);
-                        $module->section = $section->id;
                         $module->coursemodule = add_course_module($module);
-                        $module->section = $i;
 
                         if (function_exists($add_instance_function)) {
                             $this->verbose("Calling module function $add_instance_function");
@@ -580,7 +577,7 @@ class generator {
                             }
                         }
 
-                        add_mod_to_section($module);
+                        $module->section = course_add_cm_to_section($courseid, $module->coursemodule, $i);
 
                         $module->cmidnumber = set_coursemodule_idnumber($module->coursemodule, '');
 
index 038c09b..b749d46 100644 (file)
@@ -613,8 +613,7 @@ class dndupload_ajax_processor {
 
         $DB->set_field('course_modules', 'instance', $instanceid, array('id' => $this->cm->id));
 
-        $sectionid = add_mod_to_section($this->cm);
-        $DB->set_field('course_modules', 'section', $sectionid, array('id' => $this->cm->id));
+        $sectionid = course_add_cm_to_section($this->course, $this->cm->id, $this->section);
 
         set_coursemodule_visible($this->cm->id, true);
 
index f4f67ff..7867376 100644 (file)
@@ -2758,50 +2758,50 @@ function get_course_section($section, $courseid) {
 }
 
 /**
- * Given a full mod object with section and course already defined, adds this module to that section.
+ * Adds an existing module to the section
  *
- * @param object $mod
- * @param int $beforemod An existing ID which we will insert the new module before
- * @return int The course_sections ID where the mod is inserted
+ * Updates both tables {course_sections} and {course_modules}
+ *
+ * @param int|stdClass $courseorid course id or course object
+ * @param int $modid id of the module already existing in course_modules table
+ * @param int $sectionnum relative number of the section (field course_sections.section)
+ *     If section does not exist it will be created
+ * @param int|stdClass $beforemod id or object with field id corresponding to the module
+ *     before which the module needs to be included. Null for inserting in the
+ *     end of the section
+ * @return int The course_sections ID where the module is inserted
  */
-function add_mod_to_section($mod, $beforemod=NULL) {
-    global $DB;
-
-    if ($section = $DB->get_record("course_sections", array("course"=>$mod->course, "section"=>$mod->section))) {
-
-        $section->sequence = trim($section->sequence);
-
-        if (empty($section->sequence)) {
-            $newsequence = "$mod->coursemodule";
-
-        } else if ($beforemod) {
-            $modarray = explode(",", $section->sequence);
-
-            if ($key = array_keys($modarray, $beforemod->id)) {
-                $insertarray = array($mod->id, $beforemod->id);
-                array_splice($modarray, $key[0], 1, $insertarray);
-                $newsequence = implode(",", $modarray);
-
-            } else {  // Just tack it on the end anyway
-                $newsequence = "$section->sequence,$mod->coursemodule";
-            }
-
+function course_add_cm_to_section($courseorid, $modid, $sectionnum, $beforemod = NULL) {
+    global $DB, $COURSE;
+    if (is_object($beforemod)) {
+        $beforemod = $beforemod->id;
+    }
+    if (is_object($courseorid)) {
+        $course = &$courseorid;
+    } else {
+        if (isset($COURSE->id) && $COURSE->id == $courseorid) {
+            $course = &$COURSE;
         } else {
-            $newsequence = "$section->sequence,$mod->coursemodule";
+            $course = $DB->get_record('course', array('id' => $courseorid), '*', MUST_EXIST);
         }
-
-        $DB->set_field("course_sections", "sequence", $newsequence, array("id"=>$section->id));
-        return $section->id;     // Return course_sections ID that was used.
-
-    } else {  // Insert a new record
-        $section = new stdClass();
-        $section->course   = $mod->course;
-        $section->section  = $mod->section;
-        $section->summary  = "";
-        $section->summaryformat = FORMAT_HTML;
-        $section->sequence = $mod->coursemodule;
-        return $DB->insert_record("course_sections", $section);
     }
+    $section = get_course_section($sectionnum, $courseid);
+    $modarray = explode(",", trim($section->sequence));
+    if (empty($modarray)) {
+        $newsequence = "$modid";
+    } else if ($beforemod && ($key = array_keys($modarray, $beforemod))) {
+        $insertarray = array($modid, $beforemod);
+        array_splice($modarray, $key[0], 1, $insertarray);
+        $newsequence = implode(",", $modarray);
+    } else {
+        $newsequence = "$section->sequence,$modid";
+    }
+    $DB->set_field("course_sections", "sequence", $newsequence, array("id" => $section->id));
+    $DB->set_field('course_modules', 'section', $section->id, array('id' => $modid));
+    rebuild_course_cache($course->id, true);
+    $course->modinfo = null;
+    $course->sectioncache = null;
+    return $section->id;     // Return course_sections ID that was used.
 }
 
 function set_coursemodule_groupmode($id, $groupmode) {
@@ -2902,14 +2902,14 @@ function delete_course_module($id) {
     return $DB->delete_records('course_modules', array('id'=>$cm->id));
 }
 
-function delete_mod_from_section($mod, $section) {
+function delete_mod_from_section($modid, $sectionid) {
     global $DB;
 
-    if ($section = $DB->get_record("course_sections", array("id"=>$section)) ) {
+    if ($section = $DB->get_record("course_sections", array("id"=>$sectionid)) ) {
 
         $modarray = explode(",", $section->sequence);
 
-        if ($key = array_keys ($modarray, $mod)) {
+        if ($key = array_keys ($modarray, $modid)) {
             array_splice($modarray, $key[0], 1);
             $newsequence = implode(",", $modarray);
             return $DB->set_field("course_sections", "sequence", $newsequence, array("id"=>$section->id));
@@ -3097,27 +3097,13 @@ function moveto_module($mod, $section, $beforemod=NULL) {
         echo $OUTPUT->notification("Could not delete module from existing section");
     }
 
-/// Update module itself if necessary
-
-    if ($mod->section != $section->id) {
-        $mod->section = $section->id;
-        $DB->update_record("course_modules", $mod);
-        // if moving to a hidden section then hide module
-        if (!$section->visible) {
-            set_coursemodule_visible($mod->id, 0);
-        }
+    // if moving to a hidden section then hide module
+    if (!$section->visible && $mod->visible) {
+        set_coursemodule_visible($mod->id, 0);
     }
 
 /// Add the module into the new section
-
-    $mod->course       = $section->course;
-    $mod->section      = $section->section;  // need relative reference
-    $mod->coursemodule = $mod->id;
-
-    if (! add_mod_to_section($mod, $beforemod)) {
-        return false;
-    }
-
+    course_add_cm_to_section($section->course, $mod->id, $section->section, $beforemod);
     return true;
 }
 
index a5b441c..268f94e 100644 (file)
@@ -474,9 +474,7 @@ if ($mform->is_cancelled()) {
 
         // course_modules and course_sections each contain a reference
         // to each other, so we have to update one of them twice.
-        $sectionid = add_mod_to_section($fromform);
-
-        $DB->set_field('course_modules', 'section', $sectionid, array('id'=>$fromform->coursemodule));
+        $sectionid = course_add_cm_to_section($course, $fromform->coursemodule, $fromform->section);
 
         // make sure visibility is set correctly (in particular in calendar)
         // note: allow them to set it even without moodle/course:activityvisibility
index bafce6c..ed4b9f3 100644 (file)
@@ -2957,3 +2957,23 @@ function get_all_sections($courseid) {
     $course = $DB->get_record('course', array('id' => $courseid));
     return get_fast_modinfo($course)->get_section_info_all();
 }
+
+/**
+ * Given a full mod object with section and course already defined, adds this module to that section.
+ *
+ * This function is deprecated, please use {@link course_add_cm_to_section()}
+ * Note that course_add_cm_to_section() also updates field course_modules.section and
+ * calls rebuild_course_cache()
+ *
+ * @deprecated since 2.4
+ *
+ * @param object $mod
+ * @param int $beforemod An existing ID which we will insert the new module before
+ * @return int The course_sections ID where the mod is inserted
+ */
+function add_mod_to_section($mod, $beforemod=NULL) {
+    debugging('Function add_mod_to_section() is deprecated, please use course_add_cm_to_section()', DEBUG_DEVELOPER);
+    global $DB;
+    $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
+    return course_add_cm_to_section($course, $mod->coursemodule, $mod->section, $beforemod);
+}
index e684657..aae6919 100644 (file)
@@ -82,12 +82,13 @@ abstract class phpunit_module_generator {
         require_once("$CFG->dirroot/course/lib.php");
 
         $modulename = $this->get_modulename();
+        $sectionnum = isset($options['section']) ? $options['section'] : 0;
 
         $cm = new stdClass();
         $cm->course             = $courseid;
         $cm->module             = $DB->get_field('modules', 'id', array('name'=>$modulename));
         $cm->instance           = 0;
-        $cm->section            = isset($options['section']) ? $options['section'] : 0;
+        $cm->section            = 0;
         $cm->idnumber           = isset($options['idnumber']) ? $options['idnumber'] : 0;
         $cm->added              = time();
 
@@ -103,9 +104,8 @@ abstract class phpunit_module_generator {
         }
 
         $cm->id = $DB->insert_record('course_modules', $cm);
-        $cm->coursemodule = $cm->id;
 
-        add_mod_to_section($cm);
+        course_add_cm_to_section($courseid, $cm->id, $sectionnum);
 
         return $cm->id;
     }
index f9872c6..bdb6c99 100644 (file)
@@ -337,12 +337,7 @@ class assign_upgrade_manager {
             return false;
         }
 
-        $mod = new stdClass();
-        $mod->course = $newcm->course;
-        $mod->section = $section->section;
-        $mod->coursemodule = $newcm->id;
-        $mod->id = $newcm->id;
-        $newcm->section = add_mod_to_section($mod, $cm);
+        $newcm->section = course_add_cm_to_section($newcm->course, $newcm->id, $section->section);
 
         // make sure visibility is set correctly (in particular in calendar)
         // note: allow them to set it even without moodle/course:activityvisibility
index 00195ff..1e20aa5 100644 (file)
@@ -3001,19 +3001,12 @@ function forum_get_course_forum($courseid, $type) {
     $mod->module = $module->id;
     $mod->instance = $forum->id;
     $mod->section = 0;
-    if (! $mod->coursemodule = add_course_module($mod) ) {   // assumes course/lib.php is loaded
+    include_once("$CFG->dirroot/course/lib.php");
+    if (! $mod->coursemodule = add_course_module($mod) ) {
         echo $OUTPUT->notification("Could not add a new course module to the course '" . $courseid . "'");
         return false;
     }
-    if (! $sectionid = add_mod_to_section($mod) ) {   // assumes course/lib.php is loaded
-        echo $OUTPUT->notification("Could not add the new course module to that section");
-        return false;
-    }
-    $DB->set_field("course_modules", "section", $sectionid, array("id" => $mod->coursemodule));
-
-    include_once("$CFG->dirroot/course/lib.php");
-    rebuild_course_cache($courseid);
-
+    $sectionid = course_add_cm_to_section($courseid, $mod->coursemodule, 0);
     return $DB->get_record("forum", array("id" => "$forum->id"));
 }
 
@@ -7332,12 +7325,7 @@ function forum_convert_to_roles($forum, $forummodid, $teacherroles=array(),
             if (!$cmid = add_course_module($mod)) {
                 print_error('cannotcreateinstanceforteacher', 'forum');
             } else {
-                $mod->coursemodule = $cmid;
-                if (!$sectionid = add_mod_to_section($mod)) {
-                    print_error('cannotaddteacherforumto', 'forum');
-                } else {
-                    $DB->set_field('course_modules', 'section', $sectionid, array('id' => $cmid));
-                }
+                $sectionid = course_add_cm_to_section($forum->course, $mod->coursemodule, 0);
             }
 
             // Change the forum type to general.
index a509e0e..388616a 100644 (file)
@@ -159,14 +159,11 @@ if ($xml = glossary_read_imported_file($result)) {
                     print_error('cannotaddcoursemodule');
                 }
 
-                if (! $sectionid = add_mod_to_section($mod) ) {
-                    print_error('cannotaddcoursemoduletosection');
-                }
+                $sectionid = course_add_cm_to_section($course, $mod->coursemodule, 0);
                 //We get the section's visible field status
                 $visible = $DB->get_field("course_sections", "visible", array("id"=>$sectionid));
 
                 $DB->set_field("course_modules", "visible", $visible, array("id"=>$mod->coursemodule));
-                $DB->set_field("course_modules", "section", $sectionid, array("id"=>$mod->coursemodule));
 
                 add_to_log($course->id, "course", "add mod",
                            "../mod/$mod->modulename/view.php?id=$mod->coursemodule",