3 namespace wcf\acp\form
;
5 use wcf\data\user\group\option\category\UserGroupOptionCategory
;
6 use wcf\data\user\group\option\category\UserGroupOptionCategoryList
;
7 use wcf\data\user\group\option\UserGroupOption
;
8 use wcf\data\user\group\option\UserGroupOptionAction
;
9 use wcf\data\user\group\UserGroup
;
10 use wcf\form\AbstractForm
;
11 use wcf\system\database\util\PreparedStatementConditionBuilder
;
12 use wcf\system\exception\IllegalLinkException
;
13 use wcf\system\exception\PermissionDeniedException
;
14 use wcf\system\exception\SystemException
;
15 use wcf\system\exception\UserInputException
;
16 use wcf\system\option\user\group\IUserGroupGroupOptionType
;
17 use wcf\system\option\user\group\IUserGroupOptionType
;
21 * Shows the user group option form to edit a single option.
23 * @author Alexander Ebert
24 * @copyright 2001-2020 WoltLab GmbH
25 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
27 class UserGroupOptionForm
extends AbstractForm
32 public $activeMenuItem = 'wcf.acp.menu.link.group';
35 * list of parsed form elements per group
38 public $formElements = [];
41 * list of accessible groups
49 public $neededPermissions = ['admin.user.canEditGroup'];
52 * user group option type object
53 * @var IUserGroupOptionType
58 * list of parent categories
59 * @var UserGroupOptionCategory[]
61 public $parentCategories = [];
64 * list of values per user group
70 * user group option object
71 * @var UserGroupOption
73 public $userGroupOption;
76 * user group option id
79 public $userGroupOptionID = 0;
84 public function readParameters()
86 parent
::readParameters();
88 if (isset($_REQUEST['id'])) {
89 $this->userGroupOptionID
= \
intval($_REQUEST['id']);
91 $this->userGroupOption
= new UserGroupOption($this->userGroupOptionID
);
92 if (!$this->userGroupOption
->optionID
) {
93 throw new IllegalLinkException();
96 // verify options and permissions for current option
97 if ($this->userGroupOption
->validateOptions() && $this->userGroupOption
->validatePermissions()) {
98 // read all categories
99 $categoryList = new UserGroupOptionCategoryList();
100 $categoryList->readObjects();
103 foreach ($categoryList as $category) {
104 $categories[$category->categoryName
] = $category;
108 $category = $categories[$this->userGroupOption
->categoryName
];
109 while ($category != null) {
110 if (!$category->validateOptions() ||
!$category->validatePermissions()) {
111 throw new PermissionDeniedException();
114 \array_unshift
($this->parentCategories
, $category);
115 $category = ($category->parentCategoryName
!= '') ?
$categories[$category->parentCategoryName
] : null;
118 throw new PermissionDeniedException();
121 // read accessible groups
122 $this->groups
= UserGroup
::getSortedAccessibleGroups();
123 if ($this->userGroupOption
->usersOnly
) {
124 $guestGroup = UserGroup
::getGroupByType(UserGroup
::GUESTS
);
125 if (isset($this->groups
[$guestGroup->groupID
])) {
126 unset($this->groups
[$guestGroup->groupID
]);
129 if (empty($this->groups
)) {
130 throw new PermissionDeniedException();
134 $className = 'wcf\system\option\user\group\\' . \
ucfirst($this->userGroupOption
->optionType
) . 'UserGroupOptionType';
135 if (!\
class_exists($className)) {
136 throw new SystemException("Unable to find option type for '" . $this->userGroupOption
->optionType
. "'");
138 $this->optionType
= new $className();
144 public function readFormParameters()
146 parent
::readFormParameters();
148 if (isset($_POST['values']) && \
is_array($_POST['values'])) {
149 $this->values
= $_POST['values'];
156 public function validate()
160 $this->errorType
= [];
162 // validate option values
163 foreach ($this->values
as $groupID => &$optionValue) {
164 if (!isset($this->groups
[$groupID])) {
165 throw new PermissionDeniedException();
168 $optionValue = $this->optionType
->getData($this->userGroupOption
, $optionValue);
171 $this->optionType
->validate($this->userGroupOption
, $optionValue);
172 } catch (UserInputException
$e) {
173 $this->errorType
[$groupID] = $e->getType();
176 if (WCF
::getUser()->hasOwnerAccess()) {
181 WCF
::getUser()->hasAdministrativeAccess() && (!ENABLE_ENTERPRISE_MODE ||
!\
in_array(
182 $this->userGroupOption
->optionName
,
183 UserGroupOption
::ENTERPRISE_BLACKLIST
190 $this->optionType
->compare(
192 WCF
::getSession()->getPermission($this->userGroupOption
->optionName
)
195 $this->errorType
[$groupID] = 'exceedsOwnPermission';
199 // add missing values for option type 'boolean'
200 if ($this->userGroupOption
->optionType
== 'boolean') {
201 foreach ($this->groups
as $groupID => $group) {
202 if (!isset($this->values
[$groupID])) {
203 $this->values
[$groupID] = 0;
206 } elseif ($this->userGroupOption
->optionType
== 'BBCodeSelect') {
207 foreach ($this->groups
as $groupID => $group) {
208 if (!isset($this->values
[$groupID])) {
209 $this->values
[$groupID] = '';
214 if (!empty($this->errorType
)) {
215 throw new UserInputException('optionValues', $this->errorType
);
222 public function readData()
227 // read values of accessible user groups
228 $conditions = new PreparedStatementConditionBuilder();
229 $conditions->add("groupID IN (?)", [\array_keys
($this->groups
)]);
230 $conditions->add("optionID = ?", [$this->userGroupOption
->optionID
]);
232 $sql = "SELECT groupID, optionValue
233 FROM wcf" . WCF_N
. "_user_group_option_value
235 $statement = WCF
::getDB()->prepareStatement($sql);
236 $statement->execute($conditions->getParameters());
237 $this->values
= $statement->fetchMap('groupID', 'optionValue');
240 // create form elements for each group
241 foreach ($this->groups
as $group) {
242 $optionValue = $this->values
[$group->groupID
] ??
$this->userGroupOption
->defaultValue
;
243 if ($this->optionType
instanceof IUserGroupGroupOptionType
) {
244 $this->optionType
->setUserGroup($group);
247 $this->formElements
[$group->groupID
] = $this->optionType
->getFormElement(
248 $this->userGroupOption
,
257 public function save()
261 $this->objectAction
= new UserGroupOptionAction(
262 [$this->userGroupOption
],
264 ['values' => $this->values
]
266 $this->objectAction
->executeAction();
271 WCF
::getTPL()->assign('success', true);
277 public function assignVariables()
279 parent
::assignVariables();
281 $everyoneGroupID = $guestGroupID = $ownerGroupID = $userGroupID = 0;
282 foreach ($this->groups
as $group) {
283 if ($group->groupType
== UserGroup
::EVERYONE
) {
284 $everyoneGroupID = $group->groupID
;
285 } elseif ($group->groupType
== UserGroup
::GUESTS
) {
286 $guestGroupID = $group->groupID
;
287 } elseif ($group->groupType
== UserGroup
::OWNER
) {
288 $ownerGroupID = $group->groupID
;
289 } elseif ($group->groupType
== UserGroup
::USERS
) {
290 $userGroupID = $group->groupID
;
294 $ownerGroupPermissions = [];
296 $ownerGroupPermissions = UserGroup
::getOwnerPermissions();
297 $ownerGroupPermissions[] = 'admin.user.accessibleGroups';
300 WCF
::getTPL()->assign([
301 'formElements' => $this->formElements
,
302 'groups' => $this->groups
,
303 'parentCategories' => $this->parentCategories
,
304 'userGroupOption' => $this->userGroupOption
,
305 'values' => $this->values
,
306 'everyoneGroupID' => $everyoneGroupID,
307 'guestGroupID' => $guestGroupID,
308 'userGroupID' => $userGroupID,
309 'ownerGroupID' => $ownerGroupID,
310 'ownerGroupPermissions' => $ownerGroupPermissions,