MDL-75126 core_question: Allow multiple bulk action from qbank plugins

This commit implements the bulk action api to allow multiple bulk
actions from the qbank plugins instead of one. Any qbank plugin
wants to implement bulk action can now define an array of bulk
actions as a plugin feature.
This commit is contained in:
Safat Shahin 2022-08-15 12:33:27 +10:00
parent 5877ae306e
commit c3245f6f52
8 changed files with 57 additions and 23 deletions

View File

@ -30,7 +30,7 @@ class bulk_move_action extends \core_question\local\bank\bulk_action_base {
return get_string('movetobulkaction', 'qbank_bulkmove');
}
public function get_bulk_action_key(): string {
public function get_key(): string {
return 'move';
}

View File

@ -28,7 +28,9 @@ use core_question\local\bank\plugin_features_base;
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class plugin_feature extends plugin_features_base {
public function get_bulk_actions(): ?bulk_action_base {
return new bulk_move_action();
public function get_bulk_actions(): array {
return [
new bulk_move_action(),
];
}
}

View File

@ -30,7 +30,7 @@ class bulk_delete_action extends \core_question\local\bank\bulk_action_base {
return get_string('delete');
}
public function get_bulk_action_key(): string {
public function get_key(): string {
return 'deleteselected';
}

View File

@ -43,7 +43,9 @@ class plugin_feature extends plugin_features_base {
];
}
public function get_bulk_actions(): ?bulk_action_base {
return new bulk_delete_action();
public function get_bulk_actions(): array {
return [
new bulk_delete_action(),
];
}
}

View File

@ -44,7 +44,9 @@ abstract class bulk_action_base {
*
* @return string
*/
abstract public function get_bulk_action_key(): string;
public function get_bulk_action_key(): string {
return '';
}
/**
* URL of the bulk action redirect page.
@ -68,4 +70,22 @@ abstract class bulk_action_base {
public function get_bulk_action_capabilities(): ?array {
return null;
}
/**
* A unique key for the bulk action, this will be used in the api to identify the action data.
* Every bulk must have a unique key to perform the action as a part of the form post in the base view.
* When questions are selected, it will post according to the key its selected from the dropdown.
*
* Note: This method is the first towards moving from get_bulk_action_key() to get_key().
*
* @return string
*/
public function get_key(): string {
if (!empty($this->get_bulk_action_key())) {
return $this->get_bulk_action_key();
}
throw new \coding_exception('Bulk actions must implement the get_key() or get_bulk_action_key() method.
In Moodle 4.1, get_bulk_action_key() is being deprecated and replaced by get_key().');
}
}

View File

@ -59,10 +59,10 @@ class plugin_features_base {
/**
* This method will return the array objects for the bulk actions ui.
*
* @return null|bulk_action_base
* @return bulk_action_base[]
*/
public function get_bulk_actions(): ?bulk_action_base {
return null;
public function get_bulk_actions() {
return [];
}
}

View File

@ -202,22 +202,27 @@ class view {
protected function init_bulk_actions(): void {
$plugins = \core_component::get_plugin_list_with_class('qbank', 'plugin_feature', 'plugin_feature.php');
foreach ($plugins as $componentname => $plugin) {
$pluginentrypoint = new $plugin();
$pluginentrypointobject = $pluginentrypoint->get_bulk_actions();
// Don't need the plugins without bulk actions.
if ($pluginentrypointobject === null) {
unset($plugins[$componentname]);
continue;
}
if (!\core\plugininfo\qbank::is_plugin_enabled($componentname)) {
unset($plugins[$componentname]);
continue;
}
$this->bulkactions[$pluginentrypointobject->get_bulk_action_key()] = [
'title' => $pluginentrypointobject->get_bulk_action_title(),
'url' => $pluginentrypointobject->get_bulk_action_url(),
'capabilities' => $pluginentrypointobject->get_bulk_action_capabilities()
];
$pluginentrypoint = new $plugin();
$bulkactions = $pluginentrypoint->get_bulk_actions();
if (!is_array($bulkactions)) {
debugging("The method {$componentname}::get_bulk_actions() must return an array of bulk actions instead of
a single bulk action. Please update your implementation of get_bulk_actions() to return an array. Check out the
qbank_bulkmove plugin for a working example.", DEBUG_DEVELOPER);
$bulkactions = [$bulkactions];
}
foreach ($bulkactions as $bulkactionobject) {
$this->bulkactions[$bulkactionobject->get_key()] = [
'title' => $bulkactionobject->get_bulk_action_title(),
'url' => $bulkactionobject->get_bulk_action_url(),
'capabilities' => $bulkactionobject->get_bulk_action_capabilities()
];
}
}
}

View File

@ -1,5 +1,10 @@
This files describes API changes for code that uses the question API.
=== 4.0.5 ===
1) Question bank plugins can now define more than one bulk action. Therefore, plugin_features_base::get_bulk_actions has been
changed to return an array, rather than a single bulk action class. Please update the plugin_features class in your plugin if necessary.
=== 4.0 ===
Moodle 4.0 included the results of a major project to re-work the question bank.