1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
workgroupeventprocessor.php
См. документацию.
1<?php
2
3namespace Bitrix\Socialnetwork\Internals\EventService\Processors;
4
5use Bitrix\Socialnetwork\Internals\EventService\Event;
6use Bitrix\Socialnetwork\Internals\EventService\EventCollection;
7use Bitrix\Socialnetwork\Internals\EventService\EventDictionary;
8use Bitrix\Socialnetwork\Internals\EventService\Push\WorkgroupSender;
9use Bitrix\Socialnetwork\UserToGroupTable;
10
12{
13 private array $groupOldFields = [];
14 private array $groupNewFields = [];
15
16 public function process(): void
17 {
18 $workgroupsPushList = [];
19
20 $workgroupEventsList = [
29 ];
30
31 $addedEventTypes = [
33 ];
34 $changedEventTypes = [
37 ];
38 $deletedEventTypes = [
40 ];
41 $userChangedEventTypes = [
45 ];
46 $userAddedAndDeletedEventTypes = [
49 ];
50
51 $added = [];
52 $changed = [];
53 $deleted = [];
54 $userChanged = [];
55
56 $events = (EventCollection::getInstance())->list();
57 foreach ($events as $event)
58 {
59 /* @var Event $event */
60 $event->collectNewData();
61 $eventType = $event->getType();
62 $groupId = $event->getGroupId();
63
64 if (!in_array($eventType, $workgroupEventsList, true))
65 {
66 continue;
67 }
68
69 $this->groupOldFields[$groupId] = $event->getOldFields();
70 $this->groupNewFields[$groupId] = $event->getNewFields();
71
72 if (in_array($eventType, $addedEventTypes, true))
73 {
74 $added[] = $groupId;
75 }
76 elseif (in_array($eventType, $changedEventTypes, true))
77 {
78 $changed[] = $groupId;
79 }
80 elseif (in_array($eventType, $deletedEventTypes, true))
81 {
82 $deleted[] = $groupId;
83 }
84 elseif (in_array($eventType, $userChangedEventTypes, true))
85 {
86 $userChanged[] = $groupId;
87 }
88 }
89
90 $added = array_diff($added, $deleted);
91 $changed = array_diff($changed, $added, $deleted);
92 $changed = $this->clearNotRealChanges($changed);
93 $userChanged = array_diff($userChanged, $added, $changed, $deleted);
94
95 $notVisibleGroupsUsers = $this->getNotVisibleGroupsUsers([
96 $added,
97 $changed,
98 $deleted,
99 $userChanged
100 ]);
101
102 foreach ($events as $event)
103 {
104 /* @var Event $event */
105 $eventType = $event->getType();
106 $groupId = $event->getGroupId();
107 $userId = $event->getUserId();
108
109 if (
110 in_array($eventType, $userAddedAndDeletedEventTypes, true)
111 && in_array($groupId, $userChanged, true)
112 )
113 {
114 (new WorkgroupSender())->sendForUserAddedAndRemoved($event, $notVisibleGroupsUsers);
115 unset($userChanged[$groupId]);
116 }
117
118 if (
119 (
120 in_array($eventType, $addedEventTypes, true)
121 && !in_array($groupId, $added, true)
122 )
123 || (
124 in_array($eventType, $changedEventTypes, true)
125 && !in_array($groupId, $changed, true)
126 )
127 || (
128 in_array($eventType, $userChangedEventTypes, true)
129 && !in_array($groupId, $userChanged, true)
130 )
131 )
132 {
133 continue;
134 }
135
136 $workgroupsPushList[] = [
137 'EVENT' => $eventType,
138 'GROUP_ID' => $groupId,
139 'USER_ID' => $userId,
140 ];
141 }
142
143 if (!empty($workgroupsPushList))
144 {
145 (new WorkgroupSender())->send($workgroupsPushList, $notVisibleGroupsUsers);
146 }
147 }
148
149 private function clearNotRealChanges(array $changed): array
150 {
151 $realChanges = [
152 'NAME',
153 'PROJECT_DATE_START',
154 'PROJECT_DATE_FINISH',
155 'IMAGE_ID',
156 'AVATAR_TYPE',
157 'OPENED',
158 'CLOSED',
159 'VISIBLE',
160 'PROJECT',
161 'KEYWORDS',
162 ];
163
164 foreach ($changed as $key => $groupId)
165 {
166 $changes = $this->getChanges($groupId);
167 if (!array_intersect_key($changes, array_flip($realChanges)))
168 {
169 unset($changed[$key]);
170 }
171 }
172
173 return $changed;
174 }
175
176 private function getNotVisibleGroupsUsers(array $groupIds): array
177 {
178 $userList = [];
179
180 if (empty($groupIds = $this->getNotVisibleGroupIds($groupIds)))
181 {
182 return $userList;
183 }
184
185 $relations = UserToGroupTable::getList([
186 'select' => [ 'GROUP_ID', 'USER_ID' ],
187 'filter' => [
188 '@GROUP_ID' => $groupIds,
190 ],
191 ])->fetchCollection();
192
193 foreach ($relations as $relation)
194 {
195 $groupId = $relation->getGroupId();
196 $userId = $relation->getUserId();
197
198 if (!isset($userList[$groupId]))
199 {
200 $userList[$groupId] = [];
201 }
202
203 $userList[$groupId][] = $userId;
204 }
205
206 return $userList;
207 }
208
209 private function getNotVisibleGroupIds($groups): array
210 {
211 [ $added, $changed, $deleted, $userChanged ] = $groups;
212
213 $oldFields = $this->groupOldFields;
214 $newFields = $this->groupNewFields;
215
216 $filter = function($groupId) use ($newFields) {
217 return (($newFields[$groupId]['VISIBLE'] ?? null) === 'N');
218 };
219 $changedFilter = function($groupId) use ($oldFields, $newFields) {
220 return (
221 $newFields[$groupId]['VISIBLE'] === 'N'
222 && $oldFields[$groupId]['VISIBLE'] === 'N'
223 );
224 };
225 $deletedFilter = function($groupId) use ($oldFields) {
226 return ($oldFields[$groupId]['VISIBLE'] === 'N');
227 };
228
229 return array_merge(
230 array_filter($added, $filter),
231 array_filter($changed, $changedFilter),
232 array_filter($deleted, $deletedFilter),
233 array_filter($userChanged, $filter)
234 );
235 }
236
237 private function getChanges(int $groupId): array
238 {
239 $oldFields = $this->groupOldFields[$groupId] ?? [];
240 $newFields = $this->groupNewFields[$groupId] ?? [];
241
242 $changes = [];
243
244 foreach ($newFields as $key => $value)
245 {
246 if (mb_strpos($key, '~') === 0)
247 {
248 continue;
249 }
250
251 if (isset($oldFields[$key]) && $oldFields[$key] !== $value)
252 {
253 $changes[$key] = $value;
254 }
255 }
256
257 return $changes;
258 }
259}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
$userList
Определения discount_coupon_list.php:276
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$filter
Определения iblock_catalog_list.php:54
$groups
Определения options.php:30
$value
Определения Param.php:39
$event
Определения prolog_after.php:141
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257