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 / ObjectMembership / Type / PostMembershipHandler.php

PostMembershipHandler.php in User Access Manager trunk, at src/ObjectMembership/Type/PostMembershipHandler.php

123 lines 3.9 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\ObjectMembership\Type;
6
7 use Exception;
8 use UserAccessManager\ObjectMembership\ObjectMembershipWithMapHandler;
9 use UserAccessManager\Object\ObjectHandler;
10 use UserAccessManager\Object\ObjectMapHandler;
11 use UserAccessManager\UserGroup\AbstractUserGroup;
12 use UserAccessManager\UserGroup\AssignmentInformation;
13 use UserAccessManager\UserGroup\AssignmentInformationFactory;
14 use UserAccessManager\Wrapper\Wordpress;
15
16 class PostMembershipHandler extends ObjectMembershipWithMapHandler
17 {
18 protected ?string $generalObjectType = ObjectHandler::GENERAL_POST_OBJECT_TYPE;
19
20 public function __construct(
21 AssignmentInformationFactory $assignmentInformationFactory,
22 private Wordpress $wordpress,
23 private ObjectHandler $objectHandler,
24 private ObjectMapHandler $objectMapHandler
25 ) {
26 parent::__construct($assignmentInformationFactory);
27 }
28
29 public function getObjectName(int|string|null $objectId, string &$typeName = ''): int|string
30 {
31 $post = $this->objectHandler->getPost($objectId);
32
33 if ($post !== false) {
34 $postTypeObject = $this->wordpress->getPostTypeObject($post->post_type);
35 $typeName = ($postTypeObject !== null) ? $postTypeObject->labels->name : $typeName;
36 return $post->post_title;
37 }
38
39 return $objectId;
40 }
41
42 public function getHandledObjects(): array
43 {
44 return $this->getHandledObjectsIncluding($this->objectHandler->getPostTypes());
45 }
46
47 protected function getMap(): array
48 {
49 return $this->objectMapHandler->getPostTreeMap();
50 }
51
52 /**
53 * @throws Exception
54 */
55 private function assignRecursiveMembershipByTerm(
56 AbstractUserGroup $userGroup,
57 int|string|null $objectId,
58 array &$recursiveMembership
59 ): void {
60 $termsOfPost = $this->objectMapHandler->getPostTermMap()[$objectId] ?? [];
61
62 foreach (array_keys($termsOfPost) as $termId) {
63 if ($userGroup->isTermMember($termId, $termAssignmentInformation) === true) {
64 $recursiveMembership[ObjectHandler::GENERAL_TERM_OBJECT_TYPE][$termId] = $termAssignmentInformation;
65 }
66 }
67 }
68
69 /**
70 * @throws Exception
71 */
72 public function isMember(
73 AbstractUserGroup $userGroup,
74 bool $lockRecursive,
75 int|string|null $objectId,
76 ?AssignmentInformation &$assignmentInformation = null
77 ): bool {
78 $isMember = $this->getMembershipByMap($userGroup, $lockRecursive, $objectId, $assignmentInformation);
79
80 if ($lockRecursive === true) {
81 $recursiveMembership = ($assignmentInformation !== null) ?
82 $assignmentInformation->getRecursiveMembership() : [];
83
84 $this->assignRecursiveMembershipByTerm($userGroup, $objectId, $recursiveMembership);
85 $this->assignRecursiveMembership($assignmentInformation, $recursiveMembership);
86 $isMember = $isMember || count($recursiveMembership) > 0;
87 }
88
89 return $isMember;
90 }
91
92 /**
93 * @throws Exception
94 */
95 public function getFullObjects(AbstractUserGroup $userGroup, bool $lockRecursive, ?string $objectType = null): array
96 {
97 $objectType ??= $this->generalObjectType;
98 $posts = $this->getFullObjectsByMap($userGroup, $lockRecursive, $objectType);
99
100 if ($lockRecursive === false) {
101 return $posts;
102 }
103
104 $termsPostMap = $this->objectMapHandler->getTermPostMap();
105
106 foreach (array_keys($userGroup->getFullTerms()) as $termId) {
107 $postsOfTerm = $termsPostMap[$termId] ?? null;
108
109 if ($postsOfTerm === null) {
110 continue;
111 }
112
113 if ($objectType !== $this->generalObjectType) {
114 $postsOfTerm = array_filter($postsOfTerm, fn($type) => $type === $objectType);
115 }
116
117 $posts += $postsOfTerm;
118 }
119
120 return $posts;
121 }
122 }
123