MDL-30408 Allow modules the choice to not appear on 'Add a...' lists
authorsam marshall <s.marshall@open.ac.uk>
Tue, 22 Nov 2011 16:16:23 +0000 (16:16 +0000)
committerkordan <kordan@mclink.it>
Thu, 19 Jan 2012 17:35:34 +0000 (18:35 +0100)
This is useful for modules which are created by the system and are not supposed to be created by users. There are various reasons for doing this in third-party modules.

course/edit_form.php
course/lib.php
lib/adminlib.php
lib/moodlelib.php

index a5bad50..d87c9d1 100644 (file)
@@ -270,7 +270,15 @@ class course_edit_form extends moodleform {
                 }
 
                 $mods = array(0=>get_string('allownone'));
-                $mods += $DB->get_records_menu('modules', array('visible'=>1), 'name', 'id, name');
+                $allmods = $DB->get_records_menu('modules', array('visible' => 1),
+                        'name', 'id, name');
+                foreach ($allmods as $key => $value) {
+                    // Add module to list unless it cannot be added by users anyway
+                    if (plugin_supports('mod', $value, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER) !==
+                            MOD_ARCHETYPE_SYSTEM) {
+                        $mods[$key] = get_string('pluginname', $value);
+                    }
+                }
                 $mform->addElement('select', 'allowedmods', get_string('to'), $mods, array('multiple'=>'multiple', 'size'=>'10'));
                 $mform->disabledIf('allowedmods', 'restrictmodules', 'eq', 0);
                 // defaults are already in $course
index d9cbc00..ae6bd99 100644 (file)
@@ -1853,6 +1853,8 @@ function print_section_add_menus($course, $section, $modnames, $vertical=false,
             $archetype = plugin_supports('mod', $modname, FEATURE_MOD_ARCHETYPE, MOD_ARCHETYPE_OTHER);
             if ($archetype == MOD_ARCHETYPE_RESOURCE) {
                 $resources[$urlbase.$modname] = $modnamestr;
+            } else if ($archetype === MOD_ARCHETYPE_SYSTEM) {
+                // System modules cannot be added by user, do not add to dropdown
             } else {
                 // all other archetypes are considered activity
                 $activities[$urlbase.$modname] = $modnamestr;
index 4eaaecb..a071fdf 100644 (file)
@@ -7896,6 +7896,8 @@ class admin_setting_devicedetectregex extends admin_setting {
  * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 class admin_setting_configmultiselect_modules extends admin_setting_configmultiselect {
+    private $excludesystem;
+
     /**
      * Calls parent::__construct - note array $choices is not required
      *
@@ -7903,9 +7905,12 @@ class admin_setting_configmultiselect_modules extends admin_setting_configmultis
      * @param string $visiblename localised setting name
      * @param string $description setting description
      * @param array $defaultsetting a plain array of default module ids
+     * @param bool $excludesystem If true, excludes modules with 'system' archetype
      */
-    public function __construct($name, $visiblename, $description, $defaultsetting = array()) {
+    public function __construct($name, $visiblename, $description, $defaultsetting = array(),
+            $excludesystem = true) {
         parent::__construct($name, $visiblename, $description, $defaultsetting, null);
+        $this->excludesystem = $excludesystem;
     }
 
     /**
@@ -7922,8 +7927,14 @@ class admin_setting_configmultiselect_modules extends admin_setting_configmultis
         global $CFG, $DB;
         $records = $DB->get_records('modules', array('visible'=>1), 'name');
         foreach ($records as $record) {
+            // Exclude modules if the code doesn't exist
             if (file_exists("$CFG->dirroot/mod/$record->name/lib.php")) {
-                $this->choices[$record->id] = $record->name;
+                // Also exclude system modules (if specified)
+                if (!($this->excludesystem &&
+                        plugin_supports('mod', $record->name, FEATURE_MOD_ARCHETYPE) ===
+                        MOD_ARCHETYPE_SYSTEM)) {
+                    $this->choices[$record->id] = $record->name;
+                }
             }
         }
         return true;
index 2914205..2b62236 100644 (file)
@@ -417,6 +417,8 @@ define('MOD_ARCHETYPE_OTHER', 0);
 define('MOD_ARCHETYPE_RESOURCE', 1);
 /** Assignment module archetype */
 define('MOD_ARCHETYPE_ASSIGNMENT', 2);
+/** System (not user-addable) module archetype */
+define('MOD_ARCHETYPE_SYSTEM', 3);
 
 /**
  * Security token used for allowing access