MDL-33937 Paged course view: Allows view of sections that are not visible
authorsam marshall <s.marshall@open.ac.uk>
Thu, 21 Jun 2012 15:24:40 +0000 (16:24 +0100)
committerDan Poltawski <dan@moodle.com>
Tue, 3 Jul 2012 04:30:10 +0000 (12:30 +0800)
course/view.php
lib/modinfolib.php

index e4a18cd..ad495dd 100644 (file)
     $infoid = $course->id;
     if(!empty($section)) {
         $loglabel = 'view section';
-        $sectionparams = array('course' => $course->id, 'section' => $section);
-        $coursesections = $DB->get_record('course_sections', $sectionparams, 'id', MUST_EXIST);
+
+        // Get section details and check it exists.
+        $modinfo = get_fast_modinfo($course);
+        $coursesections = $modinfo->get_section_info($section, MUST_EXIST);
+
+        // Check user is allowed to see it.
+        if (!$coursesections->uservisible) {
+            // Note: We actually already know they don't have this capability
+            // or uservisible would have been true; this is just to get the
+            // correct error message shown.
+            require_capability('moodle/course:viewhiddensections', $context);
+        }
         $infoid = $coursesections->id;
         $logparam .= '&sectionid='. $infoid;
     }
index bcbb7ec..f22f697 100644 (file)
@@ -202,9 +202,17 @@ class course_modinfo extends stdClass {
     /**
      * Gets data about specific numbered section.
      * @param int $sectionnumber Number (not id) of section
-     * @return section_info Information for numbered section
+     * @param int $strictness Use MUST_EXIST to throw exception if it doesn't
+     * @return section_info Information for numbered section or null if not found
      */
-    public function get_section_info($sectionnumber) {
+    public function get_section_info($sectionnumber, $strictness = IGNORE_MISSING) {
+        if (!array_key_exists($sectionnumber, $this->sectioninfo)) {
+            if ($strictness === MUST_EXIST) {
+                throw new moodle_exception('sectionnotexist');
+            } else {
+                return null;
+            }
+        }
         return $this->sectioninfo[$sectionnumber];
     }