diff --git a/admin/settings/plugins.php b/admin/settings/plugins.php index d1016e3e4e4..e05d3e40e4e 100644 --- a/admin/settings/plugins.php +++ b/admin/settings/plugins.php @@ -482,6 +482,13 @@ foreach (get_plugin_list('tool') as $plugin => $plugindir) { } } +/// Add all admin tools +if ($hassiteconfig) { + $ADMIN->add('modules', new admin_category('tools', get_string('tools', 'admin'))); + $ADMIN->add('tools', new admin_externalpage('managetools', get_string('toolsmanage', 'admin'), + $CFG->wwwroot . '/' . $CFG->admin . '/tools.php')); +} + /// Add all local plugins - must be always last! if ($hassiteconfig) { $ADMIN->add('modules', new admin_category('localplugins', get_string('localplugins'))); diff --git a/admin/tools.php b/admin/tools.php new file mode 100644 index 00000000000..1c4d9158e70 --- /dev/null +++ b/admin/tools.php @@ -0,0 +1,134 @@ +. + +/** + * Provides an overview of installed admin tools + * + * Displays the list of found admin tools, their version (if found) and + * a link to delete the admin tool. + * + * The code is based on admin/localplugins.php by David Mudrak. + * + * @package admin + * @copyright 2011 Petr Skoda {@link http://skodak.org} + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(dirname(__FILE__) . '/../config.php'); +require_once($CFG->libdir.'/adminlib.php'); +require_once($CFG->libdir.'/tablelib.php'); + +admin_externalpage_setup('managetools'); + +$delete = optional_param('delete', '', PARAM_PLUGIN); +$confirm = optional_param('confirm', '', PARAM_BOOL); + +/// If data submitted, then process and store. + +if (!empty($delete) and confirm_sesskey()) { + echo $OUTPUT->header(); + echo $OUTPUT->heading(get_string('tools', 'admin')); + + if (!$confirm) { + if (get_string_manager()->string_exists('pluginname', 'tool_' . $delete)) { + $strpluginname = get_string('pluginname', 'tool_' . $delete); + } else { + $strpluginname = $delete; + } + echo $OUTPUT->confirm(get_string('toolsdeleteconfirm', 'admin', $strpluginname), + new moodle_url($PAGE->url, array('delete' => $delete, 'confirm' => 1)), + $PAGE->url); + echo $OUTPUT->footer(); + die(); + + } else { + uninstall_plugin('tool', $delete); + $a = new stdclass(); + $a->name = $delete; + $pluginlocation = get_plugin_types(); + $a->directory = $pluginlocation['tool'] . '/' . $delete; + echo $OUTPUT->notification(get_string('plugindeletefiles', '', $a), 'notifysuccess'); + echo $OUTPUT->continue_button($PAGE->url); + echo $OUTPUT->footer(); + die(); + } +} + +echo $OUTPUT->header(); +echo $OUTPUT->heading(get_string('tools', 'admin')); + +/// Print the table of all installed tool plugins + +$table = new flexible_table('toolplugins_administration_table'); +$table->define_columns(array('name', 'version', 'delete')); +$table->define_headers(array(get_string('plugin'), get_string('version'), get_string('delete'))); +$table->define_baseurl($PAGE->url); +$table->set_attribute('id', 'toolplugins'); +$table->set_attribute('class', 'generaltable generalbox boxaligncenter boxwidthwide'); +$table->setup(); + +$plugins = array(); +foreach (get_plugin_list('tool') as $plugin => $plugindir) { + if (get_string_manager()->string_exists('pluginname', 'tool_' . $plugin)) { + $strpluginname = get_string('pluginname', 'tool_' . $plugin); + } else { + $strpluginname = $plugin; + } + $plugins[$plugin] = $strpluginname; +} +collatorlib::asort($plugins); + +$like = $DB->sql_like('plugin', '?', true, true, false, '|'); +$params = array('tool|_%'); +$installed = $DB->get_records_select('config_plugins', "$like AND name = 'version'", $params); +$versions = array(); +foreach ($installed as $config) { + $name = preg_replace('/^tool_/', '', $config->plugin); + $versions[$name] = $config->value; + if (!isset($plugins[$name])) { + $plugins[$name] = $name; + } +} + +foreach ($plugins as $plugin => $name) { + $delete = new moodle_url($PAGE->url, array('delete' => $plugin, 'sesskey' => sesskey())); + $delete = html_writer::link($delete, get_string('delete')); + + if (!isset($versions[$plugin])) { + if (file_exists("$CFG->dirroot/$CFG->admin/tool/$plugin/version.php")) { + // not installed yet + $version = '?'; + } else { + // no version info available + $version = '-'; + } + } else { + $version = $versions[$plugin]; + if (file_exists("$CFG->dirroot/$CFG->admin/tool/$plugin")) { + $version = $versions[$plugin]; + } else { + // somebody removed plugin without uninstall + $name = ''.$name.' ('.get_string('missingfromdisk').')'; + $version = $versions[$plugin]; + } + } + + $table->add_data(array($name, $version, $delete)); +} + +$table->print_html(); + +echo $OUTPUT->footer(); diff --git a/lang/en/admin.php b/lang/en/admin.php index 21ab1f47865..683da5c4126 100644 --- a/lang/en/admin.php +++ b/lang/en/admin.php @@ -935,6 +935,9 @@ $string['timezoneforced'] = 'This is forced by the site administrator'; $string['timezoneisforcedto'] = 'Force all users to use'; $string['timezonenotforced'] = 'Users can choose their own timezone'; $string['tokenizerrecommended'] = 'Installing the optional PHP Tokenizer extension is recommended -- it improves Moodle Networking functionality.'; +$string['tools'] = 'Admin tools'; +$string['toolsdeleteconfirm'] = 'You are about to completely delete the admin tool \'{$a}\'. This will completely delete everything in the database associated with this plugin. Are you SURE you want to continue?'; +$string['toolsmanage'] = 'Manage admin tools'; $string['unattendedoperation'] = 'Unattended operation'; $string['unbookmarkthispage'] = 'Unbookmark this page'; $string['unicoderecommended'] = 'Storing all your data in Unicode (UTF-8) is recommended. New installations should be performed into databases that have their default character set as Unicode. If you are upgrading, you should perform the UTF-8 migration process (see the Admin page).'; diff --git a/lib/pluginlib.php b/lib/pluginlib.php index bb61cf92881..adfb85e9949 100644 --- a/lib/pluginlib.php +++ b/lib/pluginlib.php @@ -1503,3 +1503,13 @@ class plugintype_mnetservice extends plugintype_base implements plugintype_inter } } } + +/** + * Class for admin tool plugins + */ +class plugintype_tool extends plugintype_base implements plugintype_interface { + + public function get_uninstall_url() { + return new moodle_url('/admin/tools.php', array('delete' => $this->name, 'sesskey' => sesskey())); + } +}