PluginProbe
User Access Manager / trunk
User Access Manager vtrunk
2.3.20 2.3.19 2.3.18 2.3.17 2.3.16 2.3.15 2.3.14 2.3.13 trunk 0.6 0.6.1 0.6.2 0.7 0.7 Beta 0.7.0.1 0.8 0.8.0.1 0.8.0.2 0.9 0.9.1 0.9.1.1 0.9.1.2 0.9.1.3 0.9.1.4 1.0 All 136 releases
user-access-manager / src / Controller / Backend / Administration / UserGroupController.php

UserGroupController.php in User Access Manager trunk, at src/Controller/Backend/Administration/UserGroupController.php

252 lines 8.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 declare(strict_types=1);
4
5 namespace UserAccessManager\Controller\Backend\Administration;
6
7 use Exception;
8 use UserAccessManager\Config\WordpressConfig;
9 use UserAccessManager\Controller\Backend\ControllerTabNavigationTrait;
10 use UserAccessManager\Controller\Controller;
11 use UserAccessManager\Form\FormHelper;
12 use UserAccessManager\Object\ObjectHandler;
13 use UserAccessManager\UserGroup\UserGroup;
14 use UserAccessManager\UserGroup\UserGroupFactory;
15 use UserAccessManager\UserGroup\UserGroupHandler;
16 use UserAccessManager\UserGroup\UserGroupTypeException;
17 use UserAccessManager\Wrapper\Php;
18 use UserAccessManager\Wrapper\Wordpress;
19 use WP_Post_Type;
20 use WP_Taxonomy;
21
22 class UserGroupController extends Controller
23 {
24 use ControllerTabNavigationTrait;
25
26 public const INSERT_UPDATE_GROUP_NONCE = 'uamInsertUpdateGroup';
27 public const DELETE_GROUP_NONCE = 'uamDeleteGroup';
28 public const SET_DEFAULT_USER_GROUPS_NONCE = 'uamSetDefaultUserGroups';
29 public const GROUP_USER_GROUPS = 'user_groups';
30 public const GROUP_DEFAULT_USER_GROUPS = 'default_user_groups';
31 public const DEFAULT_USER_GROUPS_FORM_FIELD = 'default_user_groups';
32
33 protected ?string $template = 'AdminUserGroup.php';
34 private ?UserGroup $userGroup = null;
35
36 public function __construct(
37 Php $php,
38 Wordpress $wordpress,
39 WordpressConfig $wordpressConfig,
40 private UserGroupHandler $userGroupHandler,
41 private UserGroupFactory $userGroupFactory,
42 private FormHelper $formHelper
43 ) {
44 parent::__construct($php, $wordpress, $wordpressConfig);
45 }
46
47 public function getTabGroups(): array
48 {
49 return [
50 self::GROUP_USER_GROUPS => ['user_groups'],
51 self::GROUP_DEFAULT_USER_GROUPS => array_merge(
52 array_keys($this->wordpress->getPostTypes(['public' => true], 'objects')),
53 array_keys($this->wordpress->getTaxonomies(['public' => true], 'objects')),
54 [ObjectHandler::GENERAL_USER_OBJECT_TYPE]
55 )
56 ];
57 }
58
59 public function getGroupText(string $key, bool $description = false): string
60 {
61 return $this->formHelper->getText($key, $description);
62 }
63
64 public function getGroupSectionText(string $key): string
65 {
66 $objects = $this->wordpress->getPostTypes(['public' => true], 'objects')
67 + $this->wordpress->getTaxonomies(['public' => true], 'objects');
68
69 $objectName = $key;
70
71 if ($objectName === ObjectHandler::GENERAL_USER_OBJECT_TYPE) {
72 $objectName = TXT_UAM_USER;
73 } elseif (isset($objects[$key]) === true) {
74 $objectName = $objects[$key]->labels->name;
75
76 if ($objects[$key] instanceof WP_Post_Type) {
77 $objectName .= ' (' . TXT_UAM_POST_TYPE . ')';
78 } elseif ($objects[$key] instanceof WP_Taxonomy) {
79 $objectName .= ' (' . TXT_UAM_TAXONOMY_TYPE . ')';
80 }
81 }
82
83 return $objectName;
84 }
85
86 /**
87 * @throws UserGroupTypeException
88 */
89 public function getUserGroup(): UserGroup
90 {
91 if ($this->userGroup === null) {
92 $userGroupId = $this->getRequestParameter('userGroupId');
93 $this->userGroup = $this->userGroupFactory->createUserGroup($userGroupId);
94 }
95
96 return $this->userGroup;
97 }
98
99 public function getSortUrl(string $sort): string
100 {
101 $requestUrl = $this->getRequestUrl();
102 $requestUrl = preg_replace('/&amp;orderby[^&]*/i', '', $requestUrl);
103 $requestUrl = preg_replace('/&amp;order[^&]*/i', '', $requestUrl);
104 $divider = !str_contains($requestUrl, '?') ? '?' : '&amp;';
105 $order = (string) $this->getRequestParameter('order') === 'asc' ? 'desc' : 'asc';
106 return "$requestUrl{$divider}orderby=$sort&amp;order=$order";
107 }
108
109 /**
110 * @return UserGroup[]
111 * @throws UserGroupTypeException
112 */
113 public function getUserGroups(): array
114 {
115 $userGroups = $this->userGroupHandler->getUserGroups();
116
117 $sort = $this->getRequestParameter('orderby');
118
119 if ($sort !== null) {
120 $reverse = (string) $this->getRequestParameter('order') === 'desc';
121
122 uasort(
123 $userGroups,
124 function (UserGroup $userGroupOne, UserGroup $userGroupTwo) use ($sort, $reverse) {
125 $values = ['', ''];
126 $method = 'get' . ucfirst($sort);
127
128 if (method_exists($userGroupOne, $method) === true) {
129 $values = [(string) $userGroupOne->{$method}(), (string) $userGroupTwo->{$method}()];
130 $values = ($reverse === true) ? array_reverse($values) : $values;
131 }
132
133 return strnatcasecmp($values[0], $values[1]);
134 }
135 );
136 }
137
138 return $userGroups;
139 }
140
141 public function getRoleNames(): array
142 {
143 $roles = $this->wordpress->getRoles();
144 return $roles->role_names;
145 }
146
147 /**
148 * @throws UserGroupTypeException
149 * @throws Exception
150 */
151 public function insertUpdateUserGroupAction(): void
152 {
153 $this->verifyNonce(self::INSERT_UPDATE_GROUP_NONCE);
154
155 $userGroupId = $this->getRequestParameter('userGroupId');
156
157 $userGroup = $this->userGroupFactory->createUserGroup($userGroupId);
158
159 $groupName = (string) $this->getRequestParameter('userGroupName');
160
161 if (trim($groupName) === '') {
162 $this->setUpdateMessage(TXT_UAM_GROUP_NAME_ERROR);
163 return;
164 }
165
166 $userGroup->setName($groupName);
167 $userGroup->setDescription($this->getRequestParameter('userGroupDescription'));
168 $userGroup->setReadAccess($this->getRequestParameter('readAccess'));
169 $userGroup->setWriteAccess($this->getRequestParameter('writeAccess'));
170 $userGroup->setIpRange($this->getRequestParameter('ipRange'));
171
172 if ($userGroup->save() === false) {
173 return;
174 }
175
176 $this->assignRolesFromRequest($userGroup);
177
178 $this->setUpdateMessage(
179 $userGroupId === null ? TXT_UAM_GROUP_ADDED : TXT_UAM_USER_GROUP_EDIT_SUCCESS
180 );
181
182 $this->userGroupHandler->addUserGroup($userGroup);
183 }
184
185 private function assignRolesFromRequest(UserGroup $userGroup): void
186 {
187 $roles = $this->getRequestParameter('roles', []);
188
189 $userGroup->removeObject(ObjectHandler::GENERAL_ROLE_OBJECT_TYPE);
190
191 foreach ($roles as $role) {
192 $userGroup->addObject(ObjectHandler::GENERAL_ROLE_OBJECT_TYPE, htmlentities($role));
193 }
194 }
195
196 /**
197 * @throws UserGroupTypeException
198 */
199 public function deleteUserGroupAction(): void
200 {
201 $this->verifyNonce(self::DELETE_GROUP_NONCE);
202 $userGroups = $this->getRequestParameter('delete', []);
203
204 foreach ($userGroups as $id) {
205 $this->userGroupHandler->deleteUserGroup($id);
206 }
207
208 $this->setUpdateMessage(TXT_UAM_DELETE_GROUP);
209 }
210
211 private function isDefaultTypeAdd(
212 array $defaultUserGroups,
213 string $userGroupId,
214 ?string &$fromTime = null,
215 ?string &$toTime = null
216 ): bool {
217 $userGroupInfo = $defaultUserGroups[$userGroupId] ?? [];
218
219 if (isset($userGroupInfo['id']) === false || (string) $userGroupInfo['id'] !== $userGroupId) {
220 return false;
221 }
222
223 $fromTime = empty($userGroupInfo['fromTime']) ? null : $userGroupInfo['fromTime'];
224 $toTime = empty($userGroupInfo['toTime']) ? null : $userGroupInfo['toTime'];
225
226 return true;
227 }
228
229 /**
230 * @throws UserGroupTypeException
231 * @throws Exception
232 */
233 public function setDefaultUserGroupsAction(): void
234 {
235 $this->verifyNonce(self::SET_DEFAULT_USER_GROUPS_NONCE);
236 $objectType = $this->getCurrentTabGroupSection();
237 $defaultUserGroups = $this->getRequestParameter(self::DEFAULT_USER_GROUPS_FORM_FIELD, []);
238 $userGroups = $this->getUserGroups();
239
240 foreach ($userGroups as $userGroup) {
241 $userGroupId = $userGroup->getId();
242 $userGroup->removeDefaultType($objectType);
243
244 if ($this->isDefaultTypeAdd($defaultUserGroups, $userGroupId, $fromTime, $toTime) === true) {
245 $userGroup->addDefaultType($objectType, $fromTime, $toTime);
246 }
247 }
248
249 $this->setUpdateMessage(TXT_UAM_SET_DEFAULT_USER_GROUP_SUCCESS);
250 }
251 }
252