diff --git a/wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php b/wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php index 0493a7e10fb..c824a7949d4 100644 --- a/wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php +++ b/wcfsetup/install/files/lib/acp/form/UserGroupOptionForm.class.php @@ -2,10 +2,10 @@ namespace wcf\acp\form; +use wcf\command\user\group\option\UpdateUserGroupOptionValues; use wcf\data\user\group\option\category\UserGroupOptionCategory; use wcf\data\user\group\option\category\UserGroupOptionCategoryList; use wcf\data\user\group\option\UserGroupOption; -use wcf\data\user\group\option\UserGroupOptionAction; use wcf\data\user\group\UserGroup; use wcf\form\AbstractForm; use wcf\system\database\util\PreparedStatementConditionBuilder; @@ -258,12 +258,7 @@ public function save() { parent::save(); - $this->objectAction = new UserGroupOptionAction( - [$this->userGroupOption], - 'updateValues', - ['values' => $this->values] - ); - $this->objectAction->executeAction(); + (new UpdateUserGroupOptionValues($this->userGroupOption, $this->values))(); // fire saved event $this->saved(); diff --git a/wcfsetup/install/files/lib/command/user/group/option/UpdateUserGroupOptionValues.class.php b/wcfsetup/install/files/lib/command/user/group/option/UpdateUserGroupOptionValues.class.php new file mode 100644 index 00000000000..0465eab7648 --- /dev/null +++ b/wcfsetup/install/files/lib/command/user/group/option/UpdateUserGroupOptionValues.class.php @@ -0,0 +1,79 @@ + + * @since 6.3 + */ +final class UpdateUserGroupOptionValues +{ + public function __construct( + private readonly UserGroupOption $option, + /** @var array */ + private readonly array $groupIDToValue = [] + ) {} + + public function __invoke(): void + { + $groupIDs = \array_keys($this->groupIDToValue); + + $this->deleteOldValues($this->option->optionID, $groupIDs); + + $this->insertValues($this->option->optionID, $this->groupIDToValue); + + UserGroupEditor::resetCache(); + + $event = new UserGroupOptionValuesUpdated($this->option, $this->groupIDToValue); + EventHandler::getInstance()->fire($event); + } + + /** + * @param list $groupIDs + */ + private function deleteOldValues(int $optionID, array $groupIDs): void + { + $conditions = new PreparedStatementConditionBuilder(); + $conditions->add('optionID = ?', [$optionID]); + if ($groupIDs !== []) { + $conditions->add('groupID IN (?)', [$groupIDs]); + } + + $sql = "DELETE FROM wcf1_user_group_option_value + " . $conditions; + $statement = WCF::getDB()->prepare($sql); + $statement->execute($conditions->getParameters()); + } + + /** + * @param array $groupIDToValue + */ + private function insertValues(int $optionID, array $groupIDToValue): void + { + $sql = "INSERT INTO wcf1_user_group_option_value + (optionID, groupID, optionValue) + VALUES (?, ?, ?)"; + $statement = WCF::getDB()->prepare($sql); + + WCF::getDB()->beginTransaction(); + foreach ($groupIDToValue as $groupID => $optionValue) { + $statement->execute([ + $optionID, + $groupID, + $optionValue, + ]); + } + WCF::getDB()->commitTransaction(); + } +} diff --git a/wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php b/wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php index cf09d6009e6..2cb8660bda8 100644 --- a/wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php +++ b/wcfsetup/install/files/lib/data/user/group/option/UserGroupOptionAction.class.php @@ -2,10 +2,8 @@ namespace wcf\data\user\group\option; +use wcf\command\user\group\option\UpdateUserGroupOptionValues; use wcf\data\AbstractDatabaseObjectAction; -use wcf\data\user\group\UserGroupEditor; -use wcf\system\database\util\PreparedStatementConditionBuilder; -use wcf\system\WCF; /** * Executes user group option-related actions. @@ -27,43 +25,13 @@ class UserGroupOptionAction extends AbstractDatabaseObjectAction * Updates option values for given option id. * * @return void + * + * @deprecated 6.3 use the `UpdateUserGroupOptionValues` command instead. */ public function updateValues() { - /** @var UserGroupOption $option */ - $option = \current($this->objects); - - $conditions = new PreparedStatementConditionBuilder(); - $conditions->add("optionID = ?", [$option->optionID]); - if (!empty($this->parameters['values'])) { - $groupIDs = \array_keys($this->parameters['values']); - $conditions->add("groupID IN (?)", [$groupIDs]); - } - - // remove old values - $sql = "DELETE FROM wcf1_user_group_option_value - " . $conditions; - $statement = WCF::getDB()->prepare($sql); - $statement->execute($conditions->getParameters()); - - if (!empty($this->parameters['values'])) { - $sql = "INSERT INTO wcf1_user_group_option_value - (optionID, groupID, optionValue) - VALUES (?, ?, ?)"; - $statement = WCF::getDB()->prepare($sql); - - WCF::getDB()->beginTransaction(); - foreach ($this->parameters['values'] as $groupID => $optionValue) { - $statement->execute([ - $option->optionID, - $groupID, - $optionValue, - ]); - } - WCF::getDB()->commitTransaction(); - } + $editor = $this->getSingleObject(); - // clear cache - UserGroupEditor::resetCache(); + (new UpdateUserGroupOptionValues($editor->getDecoratedObject(), $this->parameters['values'] ?? []))(); } } diff --git a/wcfsetup/install/files/lib/event/user/group/option/UserGroupOptionValuesUpdated.class.php b/wcfsetup/install/files/lib/event/user/group/option/UserGroupOptionValuesUpdated.class.php new file mode 100644 index 00000000000..d6d6ae57589 --- /dev/null +++ b/wcfsetup/install/files/lib/event/user/group/option/UserGroupOptionValuesUpdated.class.php @@ -0,0 +1,23 @@ + + * @since 6.3 + */ +final class UserGroupOptionValuesUpdated implements IPsr14Event +{ + public function __construct( + public readonly UserGroupOption $option, + /** @var array */ + public readonly array $groupIDToValue + ) {} +}