From 00a342341c494cf8178756bd338fa42a19e15575 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Wed, 7 Nov 2012 15:13:07 +0800 Subject: [PATCH] MDL-36417 course: Toggling section visibility update module visibility --- course/lib.php | 54 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/course/lib.php b/course/lib.php index a772578334c..fc53eafba86 100644 --- a/course/lib.php +++ b/course/lib.php @@ -1272,7 +1272,16 @@ function set_section_visible($courseid, $sectionnumber, $visibility) { if (!empty($section->sequence)) { $modules = explode(",", $section->sequence); foreach ($modules as $moduleid) { - set_coursemodule_visible($moduleid, $visibility, true); + if ($cm = $DB->get_record('course_modules', array('id' => $moduleid), 'visible, visibleold')) { + if ($visibility) { + // As we unhide the section, we use the previously saved visibility stored in visibleold. + set_coursemodule_visible($moduleid, $cm->visibleold); + } else { + // We hide the section, so we hide the module but we store the original state in visibleold. + set_coursemodule_visible($moduleid, 0); + $DB->set_field('course_modules', 'visibleold', $cm->visible, array('id' => $moduleid)); + } + } } } rebuild_course_cache($courseid, true); @@ -2806,16 +2815,26 @@ function set_coursemodule_idnumber($id, $idnumber) { } /** -* $prevstateoverrides = true will set the visibility of the course module -* to what is defined in visibleold. This enables us to remember the current -* visibility when making a whole section hidden, so that when we toggle -* that section back to visible, we are able to return the visibility of -* the course module back to what it was originally. -*/ -function set_coursemodule_visible($id, $visible, $prevstateoverrides=false) { + * Set the visibility of a module and inherent properties. + * + * From 2.4 the parameter $prevstateoverrides has been removed, the logic it triggered + * has been moved to {@link set_section_visible()} which was the only place from which + * the parameter was used. + * + * @param int $id of the module + * @param int $visible state of the module + * @return bool false when the module was not found, true otherwise + */ +function set_coursemodule_visible($id, $visible) { global $DB, $CFG; require_once($CFG->libdir.'/gradelib.php'); + // Trigger developer's attention when using the previously removed argument. + if (func_num_args() > 2) { + debugging('Wrong number of arguments passed to set_coursemodule_visible(), $prevstateoverrides + has been removed.', DEBUG_DEVELOPER); + } + if (!$cm = $DB->get_record('course_modules', array('id'=>$id))) { return false; } @@ -2840,17 +2859,14 @@ function set_coursemodule_visible($id, $visible, $prevstateoverrides=false) { } } - if ($prevstateoverrides) { - if ($visible == '0') { - // Remember the current visible state so we can toggle this back. - $DB->set_field('course_modules', 'visibleold', $cm->visible, array('id'=>$id)); - } else { - // Get the previous saved visible states. - $DB->set_field('course_modules', 'visible', $cm->visibleold, array('id'=>$id)); - } - } else { - $DB->set_field("course_modules", "visible", $visible, array("id"=>$id)); - } + // Updating visible and visibleold to keep them in sync. Only changing a section visibility will + // affect visibleold to allow for an original visibility restore. See set_section_visible(). + $cminfo = new stdClass(); + $cminfo->id = $id; + $cminfo->visible = $visible; + $cminfo->visibleold = $visible; + $DB->update_record('course_modules', $cminfo); + rebuild_course_cache($cm->course, true); return true; }