These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | /** |
||
4 | * @copyright Copyright (c) Flipbox Digital Limited |
||
5 | * @license https://flipboxfactory.com/software/organization/license |
||
6 | * @link https://www.flipboxfactory.com/software/organization/ |
||
7 | */ |
||
8 | |||
9 | namespace flipbox\organizations\relationships; |
||
10 | |||
11 | use Craft; |
||
12 | use craft\elements\User; |
||
13 | use craft\helpers\ArrayHelper; |
||
14 | use craft\helpers\Json; |
||
15 | use flipbox\craft\ember\helpers\QueryHelper; |
||
16 | use flipbox\organizations\elements\Organization; |
||
17 | use flipbox\organizations\Organizations; |
||
18 | use flipbox\organizations\queries\UserAssociationQuery; |
||
19 | use flipbox\organizations\records\UserAssociation; |
||
20 | use Tightenco\Collect\Support\Collection; |
||
21 | |||
22 | /** |
||
23 | * Manages Organizations associated to Users |
||
24 | * |
||
25 | * @author Flipbox Factory <[email protected]> |
||
26 | * @since 2.0.0 |
||
27 | * * |
||
28 | * @method UserAssociation findOrCreate($object) |
||
29 | * @method UserAssociation findOne($object = null) |
||
30 | * @method UserAssociation findOrFail($object) |
||
31 | */ |
||
32 | class OrganizationRelationship implements RelationshipInterface |
||
33 | { |
||
34 | use RelationshipTrait; |
||
35 | |||
36 | /** |
||
37 | * @var User |
||
38 | */ |
||
39 | private $user; |
||
40 | |||
41 | /** |
||
42 | * @param User $user |
||
43 | */ |
||
44 | public function __construct(User $user) |
||
45 | { |
||
46 | $this->user = $user; |
||
47 | } |
||
48 | |||
49 | |||
50 | /************************************************************ |
||
51 | * COLLECTION |
||
52 | ************************************************************/ |
||
53 | |||
54 | /** |
||
55 | * Get a collection of associated organizations |
||
56 | * |
||
57 | * @return Organization[]|Collection |
||
58 | */ |
||
59 | public function getCollection(): Collection |
||
60 | { |
||
61 | $query = Organization::find() |
||
62 | ->user($this->user) |
||
63 | ->orderBy([ |
||
64 | 'organizationOrder' => SORT_ASC |
||
65 | ]); |
||
66 | |||
67 | if (null === $this->collection) { |
||
68 | return Collection::make( |
||
69 | $query->all() |
||
70 | ); |
||
71 | }; |
||
72 | |||
73 | return Collection::make( |
||
74 | $query |
||
75 | ->id($this->collection->sortBy('organizationOrder')->pluck('organizationId')) |
||
76 | ->fixedOrder(true) |
||
77 | ->limit(null) |
||
78 | ->all() |
||
79 | ); |
||
80 | } |
||
81 | |||
82 | |||
83 | /************************************************************ |
||
84 | * QUERY |
||
85 | ************************************************************/ |
||
86 | |||
87 | /** |
||
88 | * @param array $criteria |
||
89 | * @return UserAssociationQuery |
||
90 | */ |
||
91 | protected function query(array $criteria = []): UserAssociationQuery |
||
92 | { |
||
93 | /** @noinspection PhpUndefinedMethodInspection */ |
||
94 | $query = UserAssociation::find() |
||
95 | ->setUserId($this->user->getId() ?: false) |
||
96 | ->orderBy([ |
||
97 | 'organizationOrder' => SORT_ASC |
||
98 | ]); |
||
99 | |||
100 | if (!empty($criteria)) { |
||
101 | QueryHelper::configure( |
||
102 | $query, |
||
103 | $criteria |
||
104 | ); |
||
105 | } |
||
106 | |||
107 | return $query; |
||
108 | } |
||
109 | |||
110 | /** |
||
111 | * @param $object |
||
112 | * @return UserAssociation |
||
113 | */ |
||
114 | protected function create($object): UserAssociation |
||
115 | { |
||
116 | return (new UserAssociation()) |
||
117 | ->setOrganization($this->resolveOrganization($object)) |
||
118 | ->setUser($this->user); |
||
119 | } |
||
120 | |||
121 | /** |
||
122 | * @inheritDoc |
||
123 | * |
||
124 | * @param bool $addToOrganization |
||
125 | */ |
||
126 | public function addOne( |
||
127 | $object, |
||
128 | array $attributes = [], |
||
129 | bool $addToOrganization = false |
||
130 | ): RelationshipInterface { |
||
131 | if (null === ($association = $this->findOne($object))) { |
||
132 | $association = $this->create($object); |
||
133 | $this->addToCollection($association); |
||
134 | } |
||
135 | |||
136 | if (!empty($attributes)) { |
||
137 | Craft::configure( |
||
138 | $association, |
||
139 | $attributes |
||
140 | ); |
||
141 | } |
||
142 | |||
143 | // Add user to organization as well? |
||
144 | if ($addToOrganization && $association->getOrganization()->getId() !== null) { |
||
145 | $association->getOrganization()->getUsers()->add($this->user); |
||
146 | } |
||
147 | |||
148 | return $this; |
||
149 | } |
||
150 | |||
151 | /******************************************* |
||
152 | * SAVE |
||
153 | *******************************************/ |
||
154 | |||
155 | /** |
||
156 | * @inheritDoc |
||
157 | */ |
||
158 | protected function associationDelta(): array |
||
159 | { |
||
160 | $existingAssociations = $this->query() |
||
161 | ->indexBy('organizationId') |
||
162 | ->all(); |
||
163 | |||
164 | $associations = []; |
||
165 | $order = 1; |
||
166 | |||
167 | /** @var UserAssociation $newAssociation */ |
||
168 | foreach ($this->getRelationships()->sortBy('organizationOrder') as $newAssociation) { |
||
169 | if (null === ($association = ArrayHelper::remove( |
||
170 | $existingAssociations, |
||
171 | $newAssociation->getOrganizationId() |
||
172 | ))) { |
||
173 | $association = $newAssociation; |
||
174 | } elseif ($newAssociation->getTypes()->isMutated()) { |
||
175 | /** @var UserAssociation $association */ |
||
176 | $association->getTypes()->clear()->add( |
||
177 | $newAssociation->getTypes()->getCollection() |
||
178 | ); |
||
179 | } |
||
180 | |||
181 | $association->userOrder = $newAssociation->userOrder; |
||
182 | $association->organizationOrder = $order++; |
||
183 | $association->state = $newAssociation->state; |
||
184 | |||
185 | $associations[] = $association; |
||
186 | } |
||
187 | |||
188 | return [$associations, $existingAssociations]; |
||
189 | } |
||
190 | |||
191 | /** |
||
192 | * @inheritDoc |
||
193 | */ |
||
194 | protected function handleAssociationError() |
||
195 | { |
||
196 | $this->user->addError('organizations', 'Unable to save user organizations.'); |
||
197 | } |
||
198 | |||
199 | |||
200 | /******************************************* |
||
201 | * UTILS |
||
202 | *******************************************/ |
||
203 | |||
204 | /** |
||
205 | * @param UserAssociation|Organization|int|array|null $object |
||
206 | * @return int|null |
||
207 | */ |
||
208 | protected function findKey($object = null) |
||
209 | { |
||
210 | if (null === ($element = $this->resolveOrganization($object))) { |
||
211 | Organizations::info(sprintf( |
||
212 | "Unable to resolve organization: %s", |
||
213 | (string)Json::encode($object) |
||
214 | )); |
||
215 | return null; |
||
216 | } |
||
217 | |||
218 | foreach ($this->findAll() as $key => $association) { |
||
0 ignored issues
–
show
|
|||
219 | if ($association->getOrganizationId() == $element->getId()) { |
||
220 | return $key; |
||
221 | } |
||
222 | } |
||
223 | |||
224 | return null; |
||
225 | } |
||
226 | |||
227 | /** |
||
228 | * @param UserAssociation|Organization|int|array|null $organization |
||
229 | * @return Organization|null |
||
230 | */ |
||
231 | protected function resolveOrganization($organization = null) |
||
232 | { |
||
233 | if (null === $organization) { |
||
234 | return null; |
||
235 | } |
||
236 | |||
237 | if ($organization instanceof UserAssociation) { |
||
238 | return $organization->getOrganization(); |
||
239 | } |
||
240 | |||
241 | if ($organization instanceof Organization) { |
||
242 | return $organization; |
||
243 | } |
||
244 | |||
245 | if (is_array($organization) && |
||
246 | null !== ($id = ArrayHelper::getValue($organization, 'id')) |
||
247 | ) { |
||
248 | $organization = ['id' => $id]; |
||
249 | } |
||
250 | |||
251 | return Organization::findOne($organization); |
||
252 | } |
||
253 | } |
||
254 |
This method has been deprecated. The supplier of the class has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the method will be removed from the class and what other method or class to use instead.