mirror of
https://github.com/moodle/moodle.git
synced 2025-01-17 21:49:15 +01:00
MDL-76867 core_admin: Migrate module management table to dynamic table
This commit is contained in:
parent
e2de093fe8
commit
9f1c596dbd
118
admin/classes/table/activity_management_table.php
Normal file
118
admin/classes/table/activity_management_table.php
Normal file
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_admin\table;
|
||||
|
||||
use core_plugin_manager;
|
||||
use dml_exception;
|
||||
use html_writer;
|
||||
use moodle_url;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
* Activity Module admin settings.
|
||||
*
|
||||
* @package core_admin
|
||||
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class activity_management_table extends plugin_management_table {
|
||||
|
||||
public function setup() {
|
||||
$this->set_attribute('id', 'modules');
|
||||
$this->set_attribute('class', 'admintable generaltable');
|
||||
parent::setup();
|
||||
}
|
||||
|
||||
protected function get_table_id(): string {
|
||||
return 'module-administration-table';
|
||||
}
|
||||
|
||||
protected function get_plugintype(): string {
|
||||
return 'mod';
|
||||
}
|
||||
|
||||
public function guess_base_url(): void {
|
||||
$this->define_baseurl(
|
||||
new moodle_url('/admin/modules.php')
|
||||
);
|
||||
}
|
||||
|
||||
protected function get_action_url(array $params = []): moodle_url {
|
||||
return new moodle_url('/admin/modules.php', $params);
|
||||
}
|
||||
|
||||
protected function get_column_list(): array {
|
||||
$columns = parent::get_column_list();
|
||||
return array_merge(
|
||||
array_slice($columns, 0, 1, true),
|
||||
['activities' => get_string('activities')],
|
||||
array_slice($columns, 1, null, true),
|
||||
);
|
||||
}
|
||||
|
||||
protected function col_name(stdClass $row): string {
|
||||
global $OUTPUT;
|
||||
|
||||
$status = $row->plugininfo->get_status();
|
||||
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
|
||||
return html_writer::span(
|
||||
get_string('missingfromdisk'),
|
||||
'notifyproblem'
|
||||
);
|
||||
}
|
||||
|
||||
return html_writer::span(
|
||||
html_writer::img(
|
||||
$OUTPUT->image_url('monologo', $row->plugininfo->name),
|
||||
'',
|
||||
[
|
||||
'class' => 'icon',
|
||||
],
|
||||
) . get_string('modulename', $row->plugininfo->name)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the number of activities present, with a link to courses containing activity if relevant.
|
||||
*
|
||||
* @param mixed $row
|
||||
* @return string
|
||||
*/
|
||||
protected function col_activities(stdClass $row): string {
|
||||
global $DB, $OUTPUT;
|
||||
try {
|
||||
$count = $DB->count_records_select($row->plugininfo->name, "course <> 0");
|
||||
} catch (dml_exception $e) {
|
||||
$count = -1;
|
||||
}
|
||||
|
||||
if ($count > 0) {
|
||||
return $OUTPUT->action_link(
|
||||
new moodle_url('/course/search.php', [
|
||||
'modulelist' => $row->plugininfo->name,
|
||||
]),
|
||||
$count,
|
||||
null,
|
||||
['title' => get_string('showmodulecourse')]
|
||||
);
|
||||
} else if ($count < 0) {
|
||||
return get_string('error');
|
||||
} else {
|
||||
return $count;
|
||||
}
|
||||
}
|
||||
}
|
@ -31,133 +31,37 @@ define('MODULE_TABLE', 'module_administration_table');
|
||||
|
||||
admin_externalpage_setup('managemodules');
|
||||
|
||||
$show = optional_param('show', '', PARAM_PLUGIN);
|
||||
$hide = optional_param('hide', '', PARAM_PLUGIN);
|
||||
|
||||
// Print headings.
|
||||
$stractivities = get_string("activities");
|
||||
$struninstall = get_string('uninstallplugin', 'core_admin');
|
||||
$strversion = get_string("version");
|
||||
$strhide = get_string("hide");
|
||||
$strshow = get_string("show");
|
||||
$strsettings = get_string("settings");
|
||||
$stractivities = get_string("activities");
|
||||
$stractivitymodule = get_string("activitymodule");
|
||||
$strshowmodulecourse = get_string('showmodulecourse');
|
||||
$plugin = optional_param('plugin', '', PARAM_PLUGIN);
|
||||
$action = optional_param('action', '', PARAM_ALPHA);
|
||||
|
||||
// If data submitted, then process and store.
|
||||
if (!empty($hide) && confirm_sesskey()) {
|
||||
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
|
||||
if ($class::enable_plugin($hide, false)) {
|
||||
// Settings not required - only pages.
|
||||
admin_get_root(true, false);
|
||||
}
|
||||
redirect(new moodle_url('/admin/modules.php'));
|
||||
}
|
||||
if (!empty($action) && !empty($plugin) && confirm_sesskey()) {
|
||||
$manager = \core_plugin_manager::resolve_plugininfo_class('mod');
|
||||
$pluginname = get_string('pluginname', $plugin);
|
||||
|
||||
if ($action === 'disable' && $manager::enable_plugin($plugin, 0)) {
|
||||
\core\notification::add(
|
||||
get_string('plugin_disabled', 'core_admin', $pluginname),
|
||||
\core\notification::SUCCESS
|
||||
);
|
||||
// Settings not required - only pages.
|
||||
admin_get_root(true, false);
|
||||
} else if ($action === 'enable' && $manager::enable_plugin($plugin, 1)) {
|
||||
\core\notification::add(
|
||||
get_string('plugin_enabled', 'core_admin', $pluginname),
|
||||
\core\notification::SUCCESS
|
||||
);
|
||||
|
||||
if (!empty($show) && confirm_sesskey()) {
|
||||
$class = \core_plugin_manager::resolve_plugininfo_class('mod');
|
||||
if ($class::enable_plugin($show, true)) {
|
||||
// Settings not required - only pages.
|
||||
admin_get_root(true, false);
|
||||
}
|
||||
|
||||
// Redirect back to the modules page with out any params.
|
||||
redirect(new moodle_url('/admin/modules.php'));
|
||||
}
|
||||
|
||||
echo $OUTPUT->header();
|
||||
echo $OUTPUT->heading($stractivities);
|
||||
|
||||
// Get and sort the existing modules.
|
||||
if (!$modules = $DB->get_records('modules', [], 'name ASC')) {
|
||||
throw new \moodle_exception('moduledoesnotexist', 'error');
|
||||
}
|
||||
|
||||
// Print the table of all modules.
|
||||
// Construct the flexible table ready to display.
|
||||
$table = new flexible_table(MODULE_TABLE);
|
||||
$table->define_columns(['name', 'instances', 'version', 'hideshow', 'uninstall', 'settings']);
|
||||
$table->define_headers([$stractivitymodule, $stractivities, $strversion, "$strhide/$strshow", $strsettings, $struninstall]);
|
||||
$table->define_baseurl($CFG->wwwroot . '/' . $CFG->admin . '/modules.php');
|
||||
$table->set_attribute('id', 'modules');
|
||||
$table->set_attribute('class', 'admintable generaltable');
|
||||
$table->setup();
|
||||
|
||||
$pluginmanager = core_plugin_manager::instance();
|
||||
|
||||
foreach ($modules as $module) {
|
||||
$plugininfo = $pluginmanager->get_plugin_info('mod_' . $module->name);
|
||||
$status = $plugininfo->get_status();
|
||||
|
||||
if ($status === core_plugin_manager::PLUGIN_STATUS_MISSING) {
|
||||
$strmodulename = '<span class="notifyproblem">' . $module->name . ' (' . get_string('missingfromdisk') . ')</span>';
|
||||
$missing = true;
|
||||
} else {
|
||||
$icon = "<img src=\"" . $OUTPUT->image_url('monologo', $module->name) . "\" class=\"icon\" alt=\"\" />";
|
||||
$strmodulename = $icon . ' ' . get_string('modulename', $module->name);
|
||||
$missing = false;
|
||||
}
|
||||
|
||||
$uninstall = '';
|
||||
if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('mod_' . $module->name, 'manage')) {
|
||||
$uninstall = html_writer::link($uninstallurl, $struninstall);
|
||||
}
|
||||
|
||||
if (
|
||||
file_exists("$CFG->dirroot/mod/$module->name/settings.php") ||
|
||||
file_exists("$CFG->dirroot/mod/$module->name/settingstree.php")
|
||||
) {
|
||||
$settings = "<a href=\"settings.php?section=modsetting$module->name\">$strsettings</a>";
|
||||
} else {
|
||||
$settings = "";
|
||||
}
|
||||
|
||||
try {
|
||||
$count = $DB->count_records_select($module->name, "course<>0");
|
||||
} catch (dml_exception $e) {
|
||||
$count = -1;
|
||||
}
|
||||
if ($count > 0) {
|
||||
$countlink = $OUTPUT->action_link(
|
||||
new moodle_url('/course/search.php', ['modulelist' => $module->name]),
|
||||
$count,
|
||||
null,
|
||||
['title' => $strshowmodulecourse]
|
||||
);
|
||||
} else if ($count < 0) {
|
||||
$countlink = get_string('error');
|
||||
} else {
|
||||
$countlink = "$count";
|
||||
}
|
||||
|
||||
if ($missing) {
|
||||
$visible = '';
|
||||
$class = '';
|
||||
} else if ($module->visible) {
|
||||
$visible = "<a href=\"modules.php?hide=$module->name&sesskey=" . sesskey() . "\" title=\"$strhide\">" .
|
||||
$OUTPUT->pix_icon('t/hide', $strhide) . '</a>';
|
||||
$class = '';
|
||||
} else {
|
||||
$visible = "<a href=\"modules.php?show=$module->name&sesskey=" . sesskey() . "\" title=\"$strshow\">" .
|
||||
$OUTPUT->pix_icon('t/show', $strshow) . '</a>';
|
||||
$class = 'dimmed_text';
|
||||
}
|
||||
if ($module->name == "forum") {
|
||||
$uninstall = "";
|
||||
$visible = "";
|
||||
$class = "";
|
||||
}
|
||||
$version = get_config('mod_' . $module->name, 'version');
|
||||
|
||||
$table->add_data([
|
||||
$strmodulename,
|
||||
$countlink,
|
||||
$version,
|
||||
$visible,
|
||||
$settings,
|
||||
$uninstall,
|
||||
], $class);
|
||||
}
|
||||
|
||||
$table->finish_html();
|
||||
|
||||
echo $OUTPUT->heading(get_string("activities"));
|
||||
$table = new \core_admin\table\activity_management_table();
|
||||
$table->out();
|
||||
echo $OUTPUT->footer();
|
||||
|
@ -14,7 +14,7 @@ Feature: I can apply presets
|
||||
Scenario: Applying Starter Moodle preset changes status and settings
|
||||
# Checking the settings before applying Full Moodle preset (we're only testing one of each type).
|
||||
Given I navigate to "Plugins > Activity modules > Manage activities" in site administration
|
||||
And "Hide" "icon" should exist in the "Chat" "table_row"
|
||||
And "Disable the Chat plugin" "icon" should exist in the "Chat" "table_row"
|
||||
And I navigate to "Plugins > Availability restrictions > Manage restrictions" in site administration
|
||||
And "Hide" "icon" should exist in the "Restriction by grouping" "table_row"
|
||||
And I navigate to "Plugins > Blocks > Manage blocks" in site administration
|
||||
@ -109,7 +109,7 @@ Feature: I can apply presets
|
||||
And the field "Enable badges" matches value "0"
|
||||
And the field "Enable competencies" matches value "0"
|
||||
And I navigate to "Plugins > Activity modules > Manage activities" in site administration
|
||||
And "Hide" "icon" should not exist in the "Chat" "table_row"
|
||||
And "Disable the Chat plugin" "icon" should not exist in the "Chat" "table_row"
|
||||
And I navigate to "Plugins > Availability restrictions > Manage restrictions" in site administration
|
||||
And "Hide" "icon" should not exist in the "Restriction by grouping" "table_row"
|
||||
And I navigate to "Plugins > Blocks > Manage blocks" in site administration
|
||||
|
@ -994,6 +994,8 @@ $string['pleaserefreshregistration'] = 'Your site is registered. Registration la
|
||||
$string['pleaserefreshregistrationunknown'] = 'Your site has been registered but the registration date is unknown. Please update your registration using the \'Update registration\' button or ensure that the \'Site registration\' scheduled task is enabled so your registration is automatically updated.';
|
||||
$string['pleaserefreshregistrationnewdata'] = 'Registration information has been changed. Please confirm it using the \'Update registration\' button.';
|
||||
$string['plugin'] = 'Plugin';
|
||||
$string['plugin_disabled'] = 'The {$a} plugin has been disabled';
|
||||
$string['plugin_enabled'] = 'The {$a} plugin has been enabled';
|
||||
$string['plugins'] = 'Plugins';
|
||||
$string['pluginscheck'] = 'Plugin dependencies check';
|
||||
$string['pluginscheckfailed'] = 'Dependencies check failed for {$a->pluginslist}';
|
||||
|
68
lib/tests/plugininfo/editor_test.php
Normal file
68
lib/tests/plugininfo/editor_test.php
Normal file
@ -0,0 +1,68 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace core\plugininfo;
|
||||
|
||||
use advanced_testcase;
|
||||
|
||||
/**
|
||||
* Unit tests for the editor plugininfo class
|
||||
*
|
||||
* @package core
|
||||
* @covers \core\plugininfo\editor
|
||||
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class editor_test extends advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test that editor::get_enabled_plugins() returns the correct list of enabled plugins.
|
||||
*/
|
||||
public function test_get_enabled_plugins(): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
// All plugins are enabled by default.
|
||||
$plugins = editor::get_enabled_plugins();
|
||||
$this->assertArrayHasKey('tiny', $plugins);
|
||||
$this->assertArrayHasKey('textarea', $plugins);
|
||||
|
||||
// Disable tiny.
|
||||
editor::enable_plugin('textarea', 0);
|
||||
|
||||
$plugins = editor::get_enabled_plugins();
|
||||
$this->assertArrayHasKey('tiny', $plugins);
|
||||
$this->assertArrayNotHasKey('textarea', $plugins);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that editor::enable_plugin set to disable all plugins will leave the textarea enabled.
|
||||
*/
|
||||
public function test_enable_plugin_all(): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
// All plugins are enabled by default.
|
||||
$plugins = editor::get_enabled_plugins();
|
||||
foreach ($plugins as $plugin) {
|
||||
editor::enable_plugin($plugin, 0);
|
||||
}
|
||||
|
||||
$plugins = editor::get_enabled_plugins();
|
||||
$this->assertCount(1, $plugins);
|
||||
$this->assertArrayHasKey('textarea', $plugins);
|
||||
}
|
||||
}
|
52
lib/tests/plugininfo/mod_test.php
Normal file
52
lib/tests/plugininfo/mod_test.php
Normal file
@ -0,0 +1,52 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace core\plugininfo;
|
||||
|
||||
use advanced_testcase;
|
||||
|
||||
/**
|
||||
* Unit tests for the mod plugininfo class
|
||||
*
|
||||
* @package core
|
||||
* @covers \core\plugininfo\mod
|
||||
* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class mod_test extends advanced_testcase {
|
||||
public function test_get_enabled_plugins(): void {
|
||||
$this->resetAfterTest();
|
||||
|
||||
// The bigbluebuttonbn plugin is disabled by default.
|
||||
// Check all default formats.
|
||||
$plugins = mod::get_enabled_plugins();
|
||||
$this->assertArrayHasKey('assign', $plugins);
|
||||
$this->assertArrayHasKey('chat', $plugins);
|
||||
$this->assertArrayHasKey('forum', $plugins);
|
||||
$this->assertArrayNotHasKey('bigbluebuttonbn', $plugins);
|
||||
|
||||
// Disable assignment.
|
||||
mod::enable_plugin('assign', 0);
|
||||
|
||||
$plugins = mod::get_enabled_plugins();
|
||||
$this->assertArrayHasKey('chat', $plugins);
|
||||
$this->assertArrayHasKey('forum', $plugins);
|
||||
$this->assertArrayNotHasKey('assign', $plugins);
|
||||
$this->assertArrayNotHasKey('bigbluebuttonbn', $plugins);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user