2 namespace wcf\system\bulk\processing\user;
3 use wcf\data\user\group\UserGroup;
4 use wcf\data\user\UserEditor;
5 use wcf\data\user\UserList;
6 use wcf\data\DatabaseObject;
7 use wcf\data\DatabaseObjectList;
8 use wcf\system\exception\UserInputException;
9 use wcf\system\user\storage\UserStorageHandler;
11 use wcf\util\ArrayUtil;
14 * Abstract implementation of a user bulk processing action related to selecting
17 * @author Matthias Schmidt
18 * @copyright 2001-2019 WoltLab GmbH
19 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
20 * @package WoltLabSuite\Core\System\Bulk\Processing\User
23 abstract class AbstractUserGroupsUserBulkProcessingAction extends AbstractUserBulkProcessingAction {
25 * list of available user groups
28 public $availableUserGroups = [];
31 * name of the inputs used to store the selected user group ids
34 public $inputName = '';
37 * ids of selected user groups
40 public $userGroupIDs = [];
45 public function __construct(DatabaseObject $object) {
46 parent::__construct($object);
48 $this->availableUserGroups = UserGroup::getSortedAccessibleGroups([], [UserGroup::GUESTS, UserGroup::EVERYONE, UserGroup::OWNER, UserGroup::USERS]);
54 public function executeAction(DatabaseObjectList $objectList) {
55 if (!($objectList instanceof UserList)) {
56 throw new \InvalidArgumentException("Object list is no instance of '".UserList::class."', instance of '".get_class($objectList)."' given.");
59 $users = $this->getAccessibleUsers($objectList);
62 WCF::getDB()->beginTransaction();
63 foreach ($users as $user) {
64 $user = new UserEditor($user);
65 $this->executeUserAction($user);
67 WCF::getDB()->commitTransaction();
69 UserStorageHandler::getInstance()->reset(array_keys($users), 'groupIDs');
74 * Execute the action for the given user.
76 * @param UserEditor $user
78 abstract protected function executeUserAction(UserEditor $user);
83 public function getHTML() {
84 return WCF::getTPL()->fetch('userGroupListUserBulkProcessing', 'wcf', [
85 'availableUserGroups' => $this->availableUserGroups,
86 'inputName' => $this->inputName,
87 'selectedUserGroupIDs' => $this->userGroupIDs
94 public function isAvailable() {
95 return !empty($this->availableUserGroups);
101 public function readFormParameters() {
102 if (isset($_POST[$this->inputName])) $this->userGroupIDs = ArrayUtil::toIntegerArray($_POST[$this->inputName]);
108 public function reset() {
109 $this->userGroupIDs = [];
115 public function validate() {
116 if (empty($this->userGroupIDs)) {
117 throw new UserInputException($this->inputName);
120 foreach ($this->userGroupIDs as $groupID) {
121 if (!isset($this->availableUserGroups[$groupID])) {
122 throw new UserInputException($this->inputName, 'noValidSelection');