Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 401 and 402] [Versions 401 and 403]

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * Defines classes used for plugin info.
  19   *
  20   * @package    core
  21   * @copyright  2011 David Mudrak <david@moodle.com>
  22   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23   */
  24  namespace core\plugininfo;
  25  
  26  use moodle_url, core_plugin_manager;
  27  
  28  defined('MOODLE_INTERNAL') || die();
  29  
  30  /**
  31   * Class for question behaviours.
  32   */
  33  class qbehaviour extends base {
  34      /**
  35       * Finds all enabled plugins, the result may include missing plugins.
  36       * @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown
  37       */
  38      public static function get_enabled_plugins() {
  39          $plugins = core_plugin_manager::instance()->get_installed_plugins('qbehaviour');
  40          if (!$plugins) {
  41              return array();
  42          }
  43          if ($disabled = get_config('question', 'disabledbehaviours')) {
  44              $disabled = explode(',', $disabled);
  45          } else {
  46              $disabled = array();
  47          }
  48  
  49          $enabled = array();
  50          foreach ($plugins as $plugin => $version) {
  51              if (in_array($plugin, $disabled)) {
  52                  continue;
  53              }
  54              $enabled[$plugin] = $plugin;
  55          }
  56  
  57          return $enabled;
  58      }
  59  
  60      public static function enable_plugin(string $pluginname, int $enabled): bool {
  61          $haschanged = false;
  62          $plugins = [];
  63          $oldvalue = get_config('question', 'disabledbehaviours');
  64          if (!empty($oldvalue)) {
  65              $plugins = array_flip(explode(',', $oldvalue));
  66          }
  67          // Only set visibility if it's different from the current value.
  68          if ($enabled && array_key_exists($pluginname, $plugins)) {
  69              unset($plugins[$pluginname]);
  70              $haschanged = true;
  71          } else if (!$enabled && !array_key_exists($pluginname, $plugins)) {
  72              $plugins[$pluginname] = $pluginname;
  73              $haschanged = true;
  74          }
  75  
  76          if ($haschanged) {
  77              $new = implode(',', array_flip($plugins));
  78              add_to_config_log('disabledbehaviours', $oldvalue, $new, 'question');
  79              set_config('disabledbehaviours', $new, 'question');
  80              // Reset caches.
  81              \core_plugin_manager::reset_caches();
  82          }
  83  
  84          return $haschanged;
  85      }
  86  
  87      public function is_uninstall_allowed() {
  88          global $DB;
  89  
  90          if ($this->name === 'missing') {
  91              // qbehaviour_missing is used by the system. It cannot be uninstalled.
  92              return false;
  93          }
  94  
  95          return !$DB->record_exists('question_attempts', array('behaviour' => $this->name));
  96      }
  97  
  98      /**
  99       * Pre-uninstall hook.
 100       *
 101       * This is intended for disabling of plugin, some DB table purging, etc.
 102       *
 103       * NOTE: to be called from uninstall_plugin() only.
 104       * @private
 105       */
 106      public function uninstall_cleanup() {
 107          if ($disabledbehaviours = get_config('question', 'disabledbehaviours')) {
 108              $disabledbehaviours = explode(',', $disabledbehaviours);
 109              $disabledbehaviours = array_unique($disabledbehaviours);
 110          } else {
 111              $disabledbehaviours = array();
 112          }
 113          if (($key = array_search($this->name, $disabledbehaviours)) !== false) {
 114              unset($disabledbehaviours[$key]);
 115              set_config('disabledbehaviours', implode(',', $disabledbehaviours), 'question');
 116          }
 117  
 118          if ($behaviourorder = get_config('question', 'behavioursortorder')) {
 119              $behaviourorder = explode(',', $behaviourorder);
 120              $behaviourorder = array_unique($behaviourorder);
 121          } else {
 122              $behaviourorder = array();
 123          }
 124          if (($key = array_search($this->name, $behaviourorder)) !== false) {
 125              unset($behaviourorder[$key]);
 126              set_config('behavioursortorder', implode(',', $behaviourorder), 'question');
 127          }
 128  
 129          parent::uninstall_cleanup();
 130      }
 131  
 132      /**
 133       * Return URL used for management of plugins of this type.
 134       * @return moodle_url
 135       */
 136      public static function get_manage_url() {
 137          return new moodle_url('/admin/qbehaviours.php');
 138      }
 139  }