Files
moodle/admin/user/user_bulk_forms.php
T
Andrew Nicols 2b49ad42f5 MDL-81456 core: Use DI for all hook access
Using DI for all hook access means that it becomes significantly easier
to mock hooks and callbacks for unit testing without fundamentally
altering the structure of the code purely for the purposes of unit
testing.
2024-04-08 09:35:41 +08:00

272 lines
10 KiB
PHP

<?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/>.
/**
* Bulk user action forms
*
* @package core
* @copyright Moodle
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
require_once($CFG->libdir.'/formslib.php');
require_once($CFG->libdir.'/datalib.php');
/**
* Bulk user action form
*
* @copyright Moodle
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_bulk_action_form extends moodleform {
/** @var bool */
protected $hasbulkactions = false;
/** @var array|null */
protected $actions = null;
/**
* Returns an array of action_link's of all bulk actions available for this user.
*
* @param bool $flatlist whether to return a flat list (for easier searching) or a list with
* option groups that can be used to build a select element
* @return array of action_link objects
*/
public function get_actions(bool $flatlist = true): array {
if ($this->actions === null) {
$this->actions = $this->build_actions();
$this->hasbulkactions = !empty($this->actions);
}
if ($flatlist) {
return array_reduce($this->actions, fn($carry, $item) => $carry + $item, []);
}
return $this->actions;
}
/**
* Builds the list of bulk user actions available for this user.
*
* @return array
*/
protected function build_actions(): array {
global $CFG;
$canaccessbulkactions = has_any_capability(['moodle/user:update', 'moodle/user:delete'], context_system::instance());
$syscontext = context_system::instance();
$actions = [];
if (has_capability('moodle/user:update', $syscontext)) {
$actions['confirm'] = new action_link(
new moodle_url('/admin/user/user_bulk_confirm.php'),
get_string('confirm'));
}
if ($canaccessbulkactions && has_capability('moodle/site:readallmessages', $syscontext) && !empty($CFG->messaging)) {
$actions['message'] = new action_link(
new moodle_url('/admin/user/user_bulk_message.php'),
get_string('messageselectadd'));
}
if (has_capability('moodle/user:delete', $syscontext)) {
$actions['delete'] = new action_link(
new moodle_url('/admin/user/user_bulk_delete.php'),
get_string('delete'));
}
if ($canaccessbulkactions) {
$actions['displayonpage'] = new action_link(
new moodle_url('/admin/user/user_bulk_display.php'),
get_string('displayonpage'));
}
if (has_capability('moodle/user:update', $syscontext)) {
$actions['download'] = new action_link(
new moodle_url('/admin/user/user_bulk_download.php'),
get_string('download', 'admin'));
}
if (has_capability('moodle/user:update', $syscontext)) {
$actions['forcepasswordchange'] = new action_link(
new moodle_url('/admin/user/user_bulk_forcepasswordchange.php'),
get_string('forcepasswordchange'));
}
if ($canaccessbulkactions && has_capability('moodle/cohort:assign', $syscontext)) {
$actions['addtocohort'] = new action_link(
new moodle_url('/admin/user/user_bulk_cohortadd.php'),
get_string('bulkadd', 'core_cohort'));
}
// Collect all bulk user actions.
$hook = new \core_user\hook\extend_bulk_user_actions();
// Add actions from core.
foreach ($actions as $identifier => $action) {
$hook->add_action($identifier, $action);
}
// Add actions from the legacy callback 'bulk_user_actions'.
$moreactions = get_plugins_with_function('bulk_user_actions', 'lib.php', true, true);
foreach ($moreactions as $plugintype => $plugins) {
foreach ($plugins as $pluginfunction) {
$pluginactions = $pluginfunction();
foreach ($pluginactions as $identifier => $action) {
$hook->add_action($identifier, $action);
}
}
}
// Any plugin can append user bulk actions to this list by implementing a hook callback.
\core\di::get(\core\hook\manager::class)->dispatch($hook);
// This method may be called from 'Bulk actions' and 'Browse user list' pages. Some actions
// may be irrelevant in one of the contexts and they can be excluded by specifying the
// 'excludeactions' customdata.
$excludeactions = $this->_customdata['excludeactions'] ?? [];
foreach ($excludeactions as $excludeaction) {
$hook->add_action($excludeaction, null);
}
return $hook->get_actions();
}
/**
* Form definition
*/
public function definition() {
$mform =& $this->_form;
$mform->addElement('hidden', 'returnurl');
$mform->setType('returnurl', PARAM_LOCALURL);
// When 'passuserids' is specified in the customdata, the user ids are expected in the form
// data rather than in the $SESSION->bulk_users .
$passuserids = !empty($this->_customdata['passuserids']);
$mform->addElement('hidden', 'passuserids', $passuserids);
$mform->setType('passuserids', PARAM_BOOL);
$mform->addElement('hidden', 'userids');
$mform->setType('userids', PARAM_SEQUENCE);
$actions = ['' => [0 => get_string('choose') . '...']];
$bulkactions = $this->get_actions(false);
foreach ($bulkactions as $category => $categoryactions) {
$actions[$category] = array_map(fn($action) => $action->text, $categoryactions);
}
$objs = array();
$objs[] = $selectel = $mform->createElement('selectgroups', 'action', get_string('userbulk', 'admin'), $actions);
$selectel->setHiddenLabel(true);
if (empty($this->_customdata['hidesubmit'])) {
$objs[] =& $mform->createElement('submit', 'doaction', get_string('go'));
}
$mform->addElement('group', 'actionsgrp', get_string('withselectedusers'), $objs, ' ', false);
}
/**
* Is there at least one available bulk action in this form
*
* @return bool
*/
public function has_bulk_actions(): bool {
return $this->hasbulkactions;
}
}
/**
* Bulk user form
*
* @copyright Moodle
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class user_bulk_form extends moodleform {
/**
* Form definition
*/
public function definition() {
$mform =& $this->_form;
$acount =& $this->_customdata['acount'];
$scount =& $this->_customdata['scount'];
$ausers =& $this->_customdata['ausers'];
$susers =& $this->_customdata['susers'];
$total =& $this->_customdata['total'];
$achoices = array();
$schoices = array();
if (is_array($ausers)) {
if ($total == $acount) {
$achoices[0] = get_string('allusers', 'bulkusers', $total);
} else {
$a = new stdClass();
$a->total = $total;
$a->count = $acount;
$achoices[0] = get_string('allfilteredusers', 'bulkusers', $a);
}
$achoices = $achoices + $ausers;
if ($acount > MAX_BULK_USERS) {
$achoices[-1] = '...';
}
} else {
$achoices[-1] = get_string('nofilteredusers', 'bulkusers', $total);
}
if (is_array($susers)) {
$a = new stdClass();
$a->total = $total;
$a->count = $scount;
$schoices[0] = get_string('allselectedusers', 'bulkusers', $a);
$schoices = $schoices + $susers;
if ($scount > MAX_BULK_USERS) {
$schoices[-1] = '...';
}
} else {
$schoices[-1] = get_string('noselectedusers', 'bulkusers');
}
$mform->addElement('header', 'users', get_string('usersinlist', 'bulkusers'));
$objs = array();
$objs[0] =& $mform->createElement('select', 'ausers', get_string('available', 'bulkusers'), $achoices, 'size="15"');
$objs[0]->setMultiple(true);
$objs[1] =& $mform->createElement('select', 'susers', get_string('selected', 'bulkusers'), $schoices, 'size="15"');
$objs[1]->setMultiple(true);
$grp =& $mform->addElement('group', 'usersgrp', get_string('users', 'bulkusers'), $objs, ' ', false);
$mform->addHelpButton('usersgrp', 'users', 'bulkusers');
$mform->addElement('static', 'comment');
$objs = array();
$objs[] =& $mform->createElement('submit', 'addsel', get_string('addsel', 'bulkusers'));
$objs[] =& $mform->createElement('submit', 'removesel', get_string('removesel', 'bulkusers'));
$grp =& $mform->addElement('group', 'buttonsgrp', get_string('selectedlist', 'bulkusers'), $objs, null, false);
$mform->addHelpButton('buttonsgrp', 'selectedlist', 'bulkusers');
$objs = array();
$objs[] =& $mform->createElement('submit', 'addall', get_string('addall', 'bulkusers'));
$objs[] =& $mform->createElement('submit', 'removeall', get_string('removeall', 'bulkusers'));
$grp =& $mform->addElement('group', 'buttonsgrp2', '', $objs, null, false);
$renderer =& $mform->defaultRenderer();
$template = '<label class="qflabel" style="vertical-align:top">{label}</label> {element}';
$renderer->setGroupElementTemplate($template, 'usersgrp');
}
}