Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 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, part_of_admin_tree, admin_settingpage, core_plugin_manager;
27
 
28
defined('MOODLE_INTERNAL') || die();
29
 
30
/**
31
 * Class for course formats
32
 */
33
class format 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
        global $DB;
40
 
41
        $plugins = core_plugin_manager::instance()->get_installed_plugins('format');
42
        if (!$plugins) {
43
            return array();
44
        }
45
        $installed = array();
46
        foreach ($plugins as $plugin => $version) {
47
            $installed[] = 'format_'.$plugin;
48
        }
49
 
50
        list($installed, $params) = $DB->get_in_or_equal($installed, SQL_PARAMS_NAMED);
51
        $disabled = $DB->get_records_select('config_plugins', "plugin $installed AND name = 'disabled'", $params, 'plugin ASC');
52
        foreach ($disabled as $conf) {
53
            if (empty($conf->value)) {
54
                continue;
55
            }
56
            list($type, $name) = explode('_', $conf->plugin, 2);
57
            unset($plugins[$name]);
58
        }
59
 
60
        $enabled = array();
61
        foreach ($plugins as $plugin => $version) {
62
            $enabled[$plugin] = $plugin;
63
        }
64
 
65
        return $enabled;
66
    }
67
 
68
    public static function enable_plugin(string $pluginname, int $enabled): bool {
69
        $haschanged = false;
70
 
71
        $plugin = 'format_' . $pluginname;
72
        $oldvalue = get_config($plugin, 'disabled');
73
        $disabled = !$enabled;
74
        // Only set value if there is no config setting or if the value is different from the previous one.
75
        if ($oldvalue == false && $disabled) {
76
            if (get_config('moodlecourse', 'format') === $pluginname) {
77
                // The default course format can't be disabled.
78
                throw new \moodle_exception('cannotdisableformat', 'error');
79
            }
80
            set_config('disabled', $disabled, $plugin);
81
            $haschanged = true;
82
        } else if ($oldvalue != false && !$disabled) {
83
            unset_config('disabled', $plugin);
84
            $haschanged = true;
85
        }
86
 
87
        if ($haschanged) {
88
            add_to_config_log('disabled', $oldvalue, $disabled, $plugin);
89
            \core_plugin_manager::reset_caches();
90
        }
91
 
92
        return $haschanged;
93
    }
94
 
95
    /**
96
     * Gathers and returns the information about all plugins of the given type
97
     *
98
     * @param string $type the name of the plugintype, eg. mod, auth or workshopform
99
     * @param string $typerootdir full path to the location of the plugin dir
100
     * @param string $typeclass the name of the actually called class
101
     * @param core_plugin_manager $pluginman the plugin manager calling this method
102
     * @return array of plugintype classes, indexed by the plugin name
103
     */
104
    public static function get_plugins($type, $typerootdir, $typeclass, $pluginman) {
105
        global $CFG;
106
        require_once($CFG->dirroot.'/course/lib.php');
107
 
108
        $formats = parent::get_plugins($type, $typerootdir, $typeclass, $pluginman);
109
        $order = get_sorted_course_formats();
110
        $sortedformats = array();
111
        foreach ($order as $formatname) {
112
            $sortedformats[$formatname] = $formats[$formatname];
113
        }
114
        return $sortedformats;
115
    }
116
 
117
    public function get_settings_section_name() {
118
        return 'formatsetting' . $this->name;
119
    }
120
 
121
    public function load_settings(part_of_admin_tree $adminroot, $parentnodename, $hassiteconfig) {
122
        global $CFG, $USER, $DB, $OUTPUT, $PAGE; // In case settings.php wants to refer to them.
123
        /** @var \admin_root $ADMIN */
124
        $ADMIN = $adminroot; // May be used in settings.php.
125
        $plugininfo = $this; // Also can be used inside settings.php.
126
 
127
        if (!$this->is_installed_and_upgraded()) {
128
            return;
129
        }
130
 
131
        if (!$hassiteconfig or !file_exists($this->full_path('settings.php'))) {
132
            return;
133
        }
134
 
135
        $section = $this->get_settings_section_name();
136
 
137
        $settings = new admin_settingpage($section, $this->displayname, 'moodle/site:config', $this->is_enabled() === false);
138
        include($this->full_path('settings.php')); // This may also set $settings to null.
139
 
140
        if ($settings) {
141
            $ADMIN->add($parentnodename, $settings);
142
        }
143
    }
144
 
145
    public function is_uninstall_allowed() {
146
        if ($this->name !== get_config('moodlecourse', 'format') && $this->name !== 'site') {
147
            return true;
148
        } else {
149
            return false;
150
        }
151
    }
152
 
153
    /**
154
     * Return URL used for management of plugins of this type.
155
     * @return moodle_url
156
     */
157
    public static function get_manage_url() {
158
        return new moodle_url('/admin/settings.php', array('section'=>'manageformats'));
159
    }
160
 
161
    public function get_uninstall_extra_warning() {
162
        global $DB;
163
 
164
        $coursecount = $DB->count_records('course', array('format' => $this->name));
165
 
166
        if (!$coursecount) {
167
            return '';
168
        }
169
 
170
        $defaultformat = $this->pluginman->plugin_name('format_'.get_config('moodlecourse', 'format'));
171
        $message = get_string(
172
            'formatuninstallwithcourses', 'core_admin',
173
            (object)array('count' => $coursecount, 'format' => $this->displayname,
174
                'defaultformat' => $defaultformat));
175
 
176
        return $message;
177
    }
178
 
179
    /**
180
     * Pre-uninstall hook.
181
     *
182
     * This is intended for disabling of plugin, some DB table purging, etc.
183
     *
184
     * NOTE: to be called from uninstall_plugin() only.
185
     * @private
186
     */
187
    public function uninstall_cleanup() {
188
        global $DB;
189
 
190
        if (($defaultformat = get_config('moodlecourse', 'format')) && $defaultformat !== $this->name) {
191
            $courses = $DB->get_records('course', array('format' => $this->name), 'id');
192
            $data = (object)array('id' => null, 'format' => $defaultformat);
193
            foreach ($courses as $record) {
194
                $data->id = $record->id;
195
                update_course($data);
196
            }
197
        }
198
 
199
        $DB->delete_records('course_format_options', array('format' => $this->name));
200
 
201
        parent::uninstall_cleanup();
202
    }
203
}