Skip to content

Commit fd1c232

Browse files
committed
Implement a command to update the user group option values
1 parent 9450351 commit fd1c232

File tree

4 files changed

+109
-44
lines changed

4 files changed

+109
-44
lines changed

wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
namespace wcf\acp\form;
44

5+
use wcf\command\user\group\option\UpdateUserGroupOptionValues;
56
use wcf\data\user\group\option\category\UserGroupOptionCategory;
67
use wcf\data\user\group\option\category\UserGroupOptionCategoryList;
78
use wcf\data\user\group\option\UserGroupOption;
8-
use wcf\data\user\group\option\UserGroupOptionAction;
99
use wcf\data\user\group\UserGroup;
1010
use wcf\form\AbstractForm;
1111
use wcf\system\database\util\PreparedStatementConditionBuilder;
@@ -258,12 +258,7 @@ public function save()
258258
{
259259
parent::save();
260260

261-
$this->objectAction = new UserGroupOptionAction(
262-
[$this->userGroupOption],
263-
'updateValues',
264-
['values' => $this->values]
265-
);
266-
$this->objectAction->executeAction();
261+
(new UpdateUserGroupOptionValues($this->userGroupOption, $this->values))();
267262

268263
// fire saved event
269264
$this->saved();
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
namespace wcf\command\user\group\option;
4+
5+
use wcf\data\user\group\option\UserGroupOption;
6+
use wcf\data\user\group\UserGroupEditor;
7+
use wcf\event\user\group\option\UserGroupOptionValuesUpdated;
8+
use wcf\system\database\util\PreparedStatementConditionBuilder;
9+
use wcf\system\event\EventHandler;
10+
use wcf\system\WCF;
11+
12+
/**
13+
* Updates the values of a user group option.
14+
*
15+
* @author Olaf Braun
16+
* @copyright 2001-2025 WoltLab GmbH
17+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
18+
* @since 6.3
19+
*/
20+
final class UpdateUserGroupOptionValues
21+
{
22+
public function __construct(
23+
private readonly UserGroupOption $option,
24+
/** @var array<int, int|float|string> */
25+
private readonly array $groupIDToValue = []
26+
) {}
27+
28+
public function __invoke(): void
29+
{
30+
$groupIDs = \array_keys($this->groupIDToValue);
31+
32+
$this->deleteOldValues($this->option->optionID, $groupIDs);
33+
34+
$this->insertValues($this->option->optionID, $this->groupIDToValue);
35+
36+
UserGroupEditor::resetCache();
37+
38+
$event = new UserGroupOptionValuesUpdated($this->option, $this->groupIDToValue);
39+
EventHandler::getInstance()->fire($event);
40+
}
41+
42+
/**
43+
* @param list<int> $groupIDs
44+
*/
45+
private function deleteOldValues(int $optionID, array $groupIDs): void
46+
{
47+
$conditions = new PreparedStatementConditionBuilder();
48+
$conditions->add('optionID = ?', [$optionID]);
49+
if ($groupIDs !== []) {
50+
$conditions->add('groupID IN (?)', [$groupIDs]);
51+
}
52+
53+
$sql = "DELETE FROM wcf1_user_group_option_value
54+
" . $conditions;
55+
$statement = WCF::getDB()->prepare($sql);
56+
$statement->execute($conditions->getParameters());
57+
}
58+
59+
/**
60+
* @param array<int, int|float|string> $groupIDToValue
61+
*/
62+
private function insertValues(int $optionID, array $groupIDToValue): void
63+
{
64+
$sql = "INSERT INTO wcf1_user_group_option_value
65+
(optionID, groupID, optionValue)
66+
VALUES (?, ?, ?)";
67+
$statement = WCF::getDB()->prepare($sql);
68+
69+
WCF::getDB()->beginTransaction();
70+
foreach ($groupIDToValue as $groupID => $optionValue) {
71+
$statement->execute([
72+
$optionID,
73+
$groupID,
74+
$optionValue,
75+
]);
76+
}
77+
WCF::getDB()->commitTransaction();
78+
}
79+
}

wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
namespace wcf\data\user\group\option;
44

5+
use wcf\command\user\group\option\UpdateUserGroupOptionValues;
56
use wcf\data\AbstractDatabaseObjectAction;
6-
use wcf\data\user\group\UserGroupEditor;
7-
use wcf\system\database\util\PreparedStatementConditionBuilder;
8-
use wcf\system\WCF;
97

108
/**
119
* Executes user group option-related actions.
@@ -27,43 +25,13 @@ class UserGroupOptionAction extends AbstractDatabaseObjectAction
2725
* Updates option values for given option id.
2826
*
2927
* @return void
28+
*
29+
* @deprecated 6.3 use the `UpdateUserGroupOptionValues` command instead.
3030
*/
3131
public function updateValues()
3232
{
33-
/** @var UserGroupOption $option */
34-
$option = \current($this->objects);
35-
36-
$conditions = new PreparedStatementConditionBuilder();
37-
$conditions->add("optionID = ?", [$option->optionID]);
38-
if (!empty($this->parameters['values'])) {
39-
$groupIDs = \array_keys($this->parameters['values']);
40-
$conditions->add("groupID IN (?)", [$groupIDs]);
41-
}
42-
43-
// remove old values
44-
$sql = "DELETE FROM wcf1_user_group_option_value
45-
" . $conditions;
46-
$statement = WCF::getDB()->prepare($sql);
47-
$statement->execute($conditions->getParameters());
48-
49-
if (!empty($this->parameters['values'])) {
50-
$sql = "INSERT INTO wcf1_user_group_option_value
51-
(optionID, groupID, optionValue)
52-
VALUES (?, ?, ?)";
53-
$statement = WCF::getDB()->prepare($sql);
54-
55-
WCF::getDB()->beginTransaction();
56-
foreach ($this->parameters['values'] as $groupID => $optionValue) {
57-
$statement->execute([
58-
$option->optionID,
59-
$groupID,
60-
$optionValue,
61-
]);
62-
}
63-
WCF::getDB()->commitTransaction();
64-
}
33+
$editor = $this->getSingleObject();
6534

66-
// clear cache
67-
UserGroupEditor::resetCache();
35+
(new UpdateUserGroupOptionValues($editor->getDecoratedObject(), $this->parameters['values'] ?? []))();
6836
}
6937
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace wcf\event\user\group\option;
4+
5+
use wcf\data\user\group\option\UserGroupOption;
6+
use wcf\event\IPsr14Event;
7+
8+
/**
9+
* Indicates that the values of a user group option have been updated.
10+
*
11+
* @author Olaf Braun
12+
* @copyright 2001-2025 WoltLab GmbH
13+
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
14+
* @since 6.3
15+
*/
16+
final class UserGroupOptionValuesUpdated implements IPsr14Event
17+
{
18+
public function __construct(
19+
public readonly UserGroupOption $option,
20+
/** @var array<int, int|float|string> */
21+
public readonly array $groupIDToValue
22+
) {}
23+
}

0 commit comments

Comments
 (0)