MDL-35339 Deprecate get_all_mods() add get_module_types_names()
authorMarina Glancy <marina@moodle.com>
Tue, 25 Sep 2012 02:34:18 +0000 (10:34 +0800)
committerMarina Glancy <marina@moodle.com>
Mon, 15 Oct 2012 06:08:13 +0000 (14:08 +0800)
- added function get_module_types_names() returning the list of localised strings used for module names;
- added function cm_info::get_used_module_names();
- added magic properties cm_info:: and cm_info:: returning human readable module name;
- replaced usage of function get_all_mods() with get_fast_modinfo() and get_module_types_names();
- function print_section_add_menus() may now retrieve the modules names list itself;
- deprecated function get_all_mods()

blocks/site_main_menu/block_site_main_menu.php
blocks/social_activities/block_social_activities.php
course/format/renderer.php
course/lib.php
course/recent.php
course/view.php
index.php
lib/deprecatedlib.php
lib/modinfolib.php
lib/navigationlib.php

index 38c2db3..37731a4 100644 (file)
@@ -63,7 +63,6 @@ class block_site_main_menu extends block_list {
         $ismoving = ismoving($course->id);
         $section  = get_course_section(0, $course->id);
         $modinfo = get_fast_modinfo($course);
-        get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
 
         $groupbuttons = $course->groupmode;
         $groupbuttonslink = (!$course->groupmodeforce);
@@ -134,11 +133,7 @@ class block_site_main_menu extends block_list {
             $this->content->icons[] = '';
         }
 
-        if (!empty($modnames)) {
-            $this->content->footer = print_section_add_menus($course, 0, $modnames, true, true);
-        } else {
-            $this->content->footer = '';
-        }
+        $this->content->footer = print_section_add_menus($course, 0, null, true, true);
 
         return $this->content;
     }
index f87ae7f..b98f44f 100644 (file)
@@ -67,10 +67,6 @@ class block_social_activities extends block_list {
         $modinfo = get_fast_modinfo($course);
         $section = $modinfo->get_section_info(0);
 
-        if (!empty($section)) {
-            get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
-        }
-
         $groupbuttons = $course->groupmode;
         $groupbuttonslink = (!$course->groupmodeforce);
 
@@ -141,11 +137,7 @@ class block_social_activities extends block_list {
             $this->content->icons[] = '';
         }
 
-        if ($modnames) {
-            $this->content->footer = print_section_add_menus($course, 0, $modnames, true, true);
-        } else {
-            $this->content->footer = '';
-        }
+        $this->content->footer = print_section_add_menus($course, 0, null, true, true);
 
         return $this->content;
     }
index fc8ac72..74baa08 100644 (file)
@@ -271,7 +271,7 @@ abstract class format_section_renderer_base extends plugin_renderer_base {
      *
      * @param stdClass $section The course_section entry from DB
      * @param stdClass $course The course entry from DB
-     * @param array    $mods course modules indexed by id (from get_all_mods)
+     * @param array    $mods course modules indexed by id (from get_fast_modinfo()->get_cms())
      * @return string HTML to output.
      */
     protected function section_summary($section, $course, $mods) {
@@ -318,7 +318,7 @@ abstract class format_section_renderer_base extends plugin_renderer_base {
      *
      * @param stdClass $section The course_section entry from DB
      * @param stdClass $course the course record from DB
-     * @param array    $mods course modules indexed by id (from get_all_mods)
+     * @param array    $mods course modules indexed by id (from get_fast_modinfo()->get_cms())
      * @return string HTML to output.
      */
     private function section_activity_summary($section, $course, $mods) {
index 7867376..1a246a2 100644 (file)
@@ -1209,56 +1209,30 @@ function get_array_of_activities($courseid) {
     return $mod;
 }
 
-
 /**
- * Returns a number of useful structures for course displays
+ * Returns the localised human-readable names of all used modules
+ *
+ * @param bool $plural if true returns the plural forms of the names
+ * @return array where key is the module name (component name without 'mod_') and
+ *     the value is the human-readable string. Array sorted alphabetically by value
  */
-function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
-    global $CFG, $DB, $COURSE;
-
-    $mods          = array();    // course modules indexed by id
-    $modnames      = array();    // all course module names (except resource!)
-    $modnamesplural= array();    // all course module names (plural form)
-    $modnamesused  = array();    // course module names used
-
-    if ($allmods = $DB->get_records("modules")) {
-        foreach ($allmods as $mod) {
-            if (!file_exists("$CFG->dirroot/mod/$mod->name/lib.php")) {
-                continue;
-            }
-            if ($mod->visible) {
-                $modnames[$mod->name] = get_string("modulename", "$mod->name");
-                $modnamesplural[$mod->name] = get_string("modulenameplural", "$mod->name");
-            }
-        }
-        collatorlib::asort($modnames);
-    } else {
-        print_error("nomodules", 'debug');
-    }
-
-    $course = ($courseid==$COURSE->id) ? $COURSE : $DB->get_record('course',array('id'=>$courseid));
-    $modinfo = get_fast_modinfo($course);
-
-    if ($rawmods=$modinfo->cms) {
-        foreach($rawmods as $mod) {    // Index the mods
-            if (empty($modnames[$mod->modname])) {
-                continue;
-            }
-            $mods[$mod->id] = $mod;
-            $mods[$mod->id]->modfullname = $modnames[$mod->modname];
-            if (!$mod->visible and !has_capability('moodle/course:viewhiddenactivities', context_course::instance($courseid))) {
-                continue;
-            }
-            // Check groupings
-            if (!groups_course_module_visible($mod)) {
-                continue;
+function get_module_types_names($plural = false) {
+    static $modnames = null;
+    global $DB, $CFG;
+    if ($modnames === null) {
+        $modnames = array(0 => array(), 1 => array());
+        if ($allmods = $DB->get_records("modules")) {
+            foreach ($allmods as $mod) {
+                if (file_exists("$CFG->dirroot/mod/$mod->name/lib.php") && $mod->visible) {
+                    $modnames[0][$mod->name] = get_string("modulename", "$mod->name");
+                    $modnames[1][$mod->name] = get_string("modulenameplural", "$mod->name");
+                }
             }
-            $modnamesused[$mod->modname] = $modnames[$mod->modname];
-        }
-        if ($modnamesused) {
-            collatorlib::asort($modnamesused);
+            collatorlib::asort($modnames[0]);
+            collatorlib::asort($modnames[1]);
         }
     }
+    return $modnames[(int)$plural];
 }
 
 /**
@@ -1746,18 +1720,28 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false,
  *
  * @param stdClass $course The course
  * @param int $section relative section number (field course_sections.section)
- * @param array $modnames An array containing the list of modules and their names
+ * @param null|array $modnames An array containing the list of modules and their names
+ *     if omitted will be taken from get_module_types_names()
  * @param bool $vertical Vertical orientation
  * @param bool $return Return the menus or send them to output
  * @param int $sectionreturn The section to link back to
  * @return void|string depending on $return
  */
-function print_section_add_menus($course, $section, $modnames, $vertical=false, $return=false, $sectionreturn=null) {
+function print_section_add_menus($course, $section, $modnames = null, $vertical=false, $return=false, $sectionreturn=null) {
     global $CFG, $OUTPUT;
 
-    // check to see if user can add menus
-    if (!has_capability('moodle/course:manageactivities', context_course::instance($course->id))) {
-        return false;
+    if ($modnames === null) {
+        $modnames = get_module_types_names();
+    }
+
+    // check to see if user can add menus and there are modules to add
+    if (!has_capability('moodle/course:manageactivities', context_course::instance($course->id))
+            || empty($modnames)) {
+        if ($return) {
+            return '';
+        } else {
+            return false;
+        }
     }
 
     // Retrieve all modules with associated metadata
index a7deb36..c6f6306 100644 (file)
@@ -83,7 +83,7 @@ echo $OUTPUT->heading(format_string($course->fullname) . ": $userinfo", 2);
 $mform->display();
 
 $modinfo = get_fast_modinfo($course);
-get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
+$modnames = get_module_types_names();
 
 if (has_capability('moodle/course:viewhiddensections', $context)) {
     $hiddenfilter = "";
index f0c3079..3b18420 100644 (file)
     // Course wrapper start.
     echo html_writer::start_tag('div', array('class'=>'course-content'));
 
-    $modinfo = get_fast_modinfo($COURSE);
-    get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
-    foreach($mods as $modid=>$unused) {
-        if (!isset($modinfo->cms[$modid])) {
-            rebuild_course_cache($course->id);
-            $modinfo = get_fast_modinfo($COURSE);
-            debugging('Rebuilding course cache', DEBUG_DEVELOPER);
-            break;
-        }
-    }
-
-    if (!$sections = $modinfo->get_section_info_all()) {   // No sections found
-        $section = new stdClass;
-        $section->course = $course->id;   // Create a default section.
-        $section->section = 0;
-        $section->visible = 1;
-        $section->summaryformat = FORMAT_HTML;
-        $section->id = $DB->insert_record('course_sections', $section);
-        rebuild_course_cache($course->id);
-        $modinfo = get_fast_modinfo($COURSE);
-        if (!$sections = $modinfo->get_section_info_all()) {      // Try again
-            print_error('cannotcreateorfindstructs', 'error');
-        }
-    }
+    // make sure that section 0 exists (this function will create one if it is missing)
+    $section0 = get_course_section(0, $course->id);
+
+    // get information about course modules and existing module types
+    // format.php in course formats may rely on presence of these variables
+    $modinfo = get_fast_modinfo($course);
+    $modnames = get_module_types_names();
+    $modnamesplural = get_module_types_names(true);
+    $modnamesused = $modinfo->get_used_module_names();
+    $mods = $modinfo->get_cms();
+    $sections = $modinfo->get_section_info_all();
 
     // CAUTION, hacky fundamental variable defintion to follow!
     // Note that because of the way course fromats are constructed though
index dd35032..34418d7 100644 (file)
--- a/index.php
+++ b/index.php
     echo $OUTPUT->header();
 
 /// Print Section or custom info
-    get_all_mods($SITE->id, $mods, $modnames, $modnamesplural, $modnamesused);
+    $modinfo = get_fast_modinfo($SITE);
+    $modnames = get_module_types_names();
+    $modnamesplural = get_module_types_names(true);
+    $modnamesused = $modinfo->get_used_module_names();
+    $mods = $modinfo->get_cms();
+
     if (!empty($CFG->customfrontpageinclude)) {
         include($CFG->customfrontpageinclude);
 
-    } else if ($SITE->numsections > 0) {
-
-        if (!$section = $DB->get_record('course_sections', array('course'=>$SITE->id, 'section'=>1))) {
-            $DB->delete_records('course_sections', array('course'=>$SITE->id, 'section'=>1)); // Just in case
-            $section = new stdClass();
-            $section->course = $SITE->id;
-            $section->section = 1;
-            $section->summary = '';
-            $section->summaryformat = FORMAT_HTML;
-            $section->sequence = '';
-            $section->visible = 1;
-            $section->id = $DB->insert_record('course_sections', $section);
-            rebuild_course_cache($SITE->id, true);
+    } else {
+        if ($editing) {
+            // make sure section with number 1 exists, this function will create section
+            get_course_section(1, $SITE->id);
+            // re-request modinfo in case section was created
+            $modinfo = get_fast_modinfo($SITE);
         }
-
-        if (!empty($section->sequence) or !empty($section->summary) or $editing) {
+        $section = $modinfo->get_section_info(1);
+        if (($section && (!empty($modinfo->sections[1]) or !empty($section->summary))) or $editing) {
             echo $OUTPUT->box_start('generalbox sitetopic');
 
             /// If currently moving a file then show the current clipboard
index ed4b9f3..3615124 100644 (file)
@@ -2977,3 +2977,39 @@ function add_mod_to_section($mod, $beforemod=NULL) {
     $course = $DB->get_record('course', array('id' => $courseid), '*', MUST_EXIST);
     return course_add_cm_to_section($course, $mod->coursemodule, $mod->section, $beforemod);
 }
+
+/**
+ * Returns a number of useful structures for course displays
+ *
+ * Function get_all_mods() is deprecated in 2.4
+ * Instead of:
+ * <code>
+ * get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
+ * </code>
+ * please use:
+ * <code>
+ * $mods = get_fast_modinfo($course)->get_cms();
+ * $modnames = get_module_types_names();
+ * $modnamesplural = get_module_types_names(true);
+ * $modnamesused = get_fast_modinfo($course)->get_used_module_names();
+ * </code>
+ *
+ * @deprecated since 2.4
+ *
+ * @param int $courseid id of the course to get info about
+ * @param array $mods (return) list of course modules
+ * @param array $modnames (return) list of names of all module types installed and available
+ * @param array $modnamesplural (return) list of names of all module types installed and available in the plural form
+ * @param array $modnamesused (return) list of names of all module types used in the course
+ */
+function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
+    debugging('Function get_all_mods() is deprecated. Use get_fast_modinfo() and get_module_types_names() instead. See phpdocs for details', DEBUG_DEVELOPER);
+
+    global $COURSE;
+    $modnames      = get_module_types_names();
+    $modnamesplural= get_module_types_names(true);
+    $course = ($courseid==$COURSE->id) ? $COURSE : $DB->get_record('course',array('id'=>$courseid));
+    $modinfo = get_fast_modinfo($course);
+    $mods = $modinfo->get_cms();
+    $modnamesused = $modinfo->get_used_module_names();
+}
index b2c69fb..d24ec6d 100644 (file)
@@ -158,6 +158,24 @@ class course_modinfo extends stdClass {
         return $this->instances;
     }
 
+    /**
+     * Returns array of localised human-readable module names used in this course
+     *
+     * @param bool $plural if true returns the plural form of modules names
+     * @return array
+     */
+    public function get_used_module_names($plural = false) {
+        $modnames = get_module_types_names($plural);
+        $modnamesused = array();
+        foreach ($this->get_cms() as $cmid => $mod) {
+            if (isset($modnames[$mod->modname]) && $mod->uservisible) {
+                $modnamesused[$mod->modname] = $modnames[$mod->modname];
+            }
+        }
+        collatorlib::asort($modnamesused);
+        return $modnamesused;
+    }
+
     /**
      * Obtains all instances of a particular module on this course.
      * @param $modname Name of module (not full frankenstyle) e.g. 'label'
@@ -610,14 +628,6 @@ class cm_info extends stdClass {
      */
     public $conditionsfield;
 
-    /**
-     * Plural name of module type, e.g. 'Forums' - from lang file
-     * @deprecated Do not use this value (you can obtain it by calling get_string instead); it
-     *   will be removed in a future version (see later TODO in this file)
-     * @var string
-     */
-    public $modplural;
-
     /**
      * True if this course-module is available to students i.e. if all availability conditions
      * are met - obtained dynamically
@@ -692,6 +702,24 @@ class cm_info extends stdClass {
      */
     private $afterediticons;
 
+    /**
+     * Magic method getter
+     *
+     * @param string $name
+     * @return mixed
+     */
+    public function __get($name) {
+        switch ($name) {
+            case 'modplural':
+                return $this->get_module_type_name(true);
+            case 'modfullname':
+                return $this->get_module_type_name();
+            default:
+                debugging('Invalid cm_info property accessed: '.$name);
+                return null;
+        }
+    }
+
     /**
      * @return bool True if this module has a 'view' page that should be linked to in navigation
      *   etc (note: modules may still have a view.php file, but return false if this is not
@@ -793,6 +821,21 @@ class cm_info extends stdClass {
         return $icon;
     }
 
+    /**
+     * Returns a localised human-readable name of the module type
+     *
+     * @param bool $plural return plural form
+     * @return string
+     */
+    public function get_module_type_name($plural = false) {
+        $modnames = get_module_types_names($plural);
+        if (isset($modnames[$this->modname])) {
+            return $modnames[$this->modname];
+        } else {
+            return null;
+        }
+    }
+
     /**
      * @return course_modinfo Modinfo object that this came from
      */
@@ -1013,16 +1056,6 @@ class cm_info extends stdClass {
         $this->conditionsfield = isset($mod->conditionsfield)
                 ? $mod->conditionsfield : array();
 
-        // Get module plural name.
-        // TODO This was a very old performance hack and should now be removed as the information
-        // certainly doesn't belong in modinfo. On a 'normal' page this is only used in the
-        // activity_modules block, so if it needs caching, it should be cached there.
-        static $modplurals;
-        if (!isset($modplurals[$this->modname])) {
-            $modplurals[$this->modname] = get_string('modulenameplural', $this->modname);
-        }
-        $this->modplural = $modplurals[$this->modname];
-
         static $modviews;
         if (!isset($modviews[$this->modname])) {
             $modviews[$this->modname] = !plugin_supports('mod', $this->modname,
index e5dc06f..1a5a932 100644 (file)
@@ -3427,10 +3427,9 @@ class settings_navigation extends navigation_node {
      */
     protected function get_course_modules($course) {
         global $CFG;
-        $mods = $modnames = $modnamesplural = $modnamesused = array();
         // This function is included when we include course/lib.php at the top
         // of this file
-        get_all_mods($course->id, $mods, $modnames, $modnamesplural, $modnamesused);
+        $modnames = get_module_types_names();
         $resources = array();
         $activities = array();
         foreach($modnames as $modname=>$modnamestr) {