1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
calendareventviewform.php
См. документацию.
1<?php
2
3namespace Bitrix\Calendar\Controller;
4
5use Bitrix\Calendar\Integration\AI;
6use Bitrix\Calendar\Integration\Bitrix24Manager;
7use Bitrix\Calendar\UserSettings;
8use Bitrix\Calendar\Util;
9use Bitrix\Intranet\Settings\Tools\ToolsManager;
10use Bitrix\Main\Engine\Controller;
11use Bitrix\Main\Engine\Response\Component;
12use Bitrix\Main\Error;
13use Bitrix\Main\Loader;
14use Bitrix\Main\Localization\Loc;
15use Bitrix\Main\Web\Json;
16use Bitrix\Main\Security\Sign\Signer;
17
19{
20
21 public function getCalendarViewSliderParamsAction(int $entryId, string $dateFrom, int $timezoneOffset = 0): array
22 {
23 $responseParams = [];
24 $userId = \CCalendar::GetCurUserId();
25
26 if (
27 Loader::includeModule('intranet')
28 && !ToolsManager::getInstance()->checkAvailabilityByToolId('calendar')
29 )
30 {
31 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND')));
32
33 return [
34 'isAvailable' => false,
35 ];
36 }
37
38 if ($entryId)
39 {
40 $entry = \CCalendarEvent::getEventForViewInterface($entryId, [
41 'eventDate' => $dateFrom,
42 'timezoneOffset' => $timezoneOffset,
43 'userId' => $userId
44 ]);
45 }
46 else
47 {
48 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'EVENT_NOT_FOUND_01'));
49 return [];
50 }
51
52 if (!$entry || !$entry['ID'])
53 {
54 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'EVENT_NOT_FOUND_02'));
55 return [];
56 }
57
58 $isExternalUser = Loader::includeModule('intranet') && !\Bitrix\Intranet\Util::isIntranetUser();
59 $isCollabUser = Util::isCollabUser($userId);
60
61 $responseParams['userId'] = $userId;
62 $responseParams['userTimezone'] = \CCalendar::GetUserTimezoneName($userId);
63 $responseParams['entry'] = $entry;
64 $responseParams['userIndex'] = \CCalendarEvent::getUserIndex();
65 $responseParams['userSettings'] = UserSettings::get($userId);
66 $responseParams['plannerFeatureEnabled'] = Bitrix24Manager::isPlannerFeatureEnabled();
67 $responseParams['entryUrl'] = \CCalendar::getEntryUrl(
68 $entry['CAL_TYPE'],
69 $entry['OWNER_ID'],
70 $entry['ID'],
71 $entry['DATE_FROM']
72 );
73 $responseParams['dayOfWeekMonthFormat'] = (
74 \Bitrix\Main\Context::getCurrent()
75 ->getCulture()
76 ->getDayOfWeekMonthFormat()
77 );
78
79 $sections = \CCalendarSect::GetList([
80 'arFilter' => [
81 'ID' => $entry['SECTION_ID'],
82 'ACTIVE' => 'Y',
83 ],
84 'checkPermissions' => false,
85 'getPermissions' => true
86 ]);
87 $responseParams['section'] = $sections[0] ?? null;
88
89 if (!$responseParams['section'])
90 {
91 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'SECTION_NOT_FOUND'));
92 return [];
93 }
94
95 $params = array_merge([
96 'event' => $entry,
97 'type' => \CCalendar::GetType(),
98 'bIntranet' => \CCalendar::IsIntranetEnabled(),
99 'bSocNet' => \CCalendar::IsSocNet(),
100 'AVATAR_SIZE' => 21,
101 ], $responseParams);
102
103 $userId = \CCalendar::GetCurUserId();
104 $event = $params['event'];
105
106 $timezoneHint = Util::getTimezoneHint($userId, $event);
107
108 $UF = \CCalendarEvent::GetEventUserFields($event);
109
110 if (isset($event['UF_CRM_CAL_EVENT']))
111 {
112 $event['UF_CRM_CAL_EVENT'] = $UF['UF_CRM_CAL_EVENT'];
113 if (empty($event['UF_CRM_CAL_EVENT']['VALUE']))
114 {
115 $event['UF_CRM_CAL_EVENT'] = false;
116 }
117 }
118
119 if (isset($event['UF_WEBDAV_CAL_EVENT']))
120 {
121 $event['UF_WEBDAV_CAL_EVENT'] = $UF['UF_WEBDAV_CAL_EVENT'];
122 if(empty($event['UF_WEBDAV_CAL_EVENT']['VALUE']))
123 {
124 $event['UF_WEBDAV_CAL_EVENT'] = false;
125 }
126 }
127
128 $event['REMIND'] = \CCalendarReminder::GetTextReminders($event['REMIND'] ?? []);
129
130 $event['permissions'] = \CCalendarEvent::getEventPermissions($event, $userId);
131
132 $curUserStatus = '';
133 $userId = \CCalendar::GetCurUserId();
134
135 $viewComments = $event['permissions']['view_comments'];
136
137 //get meeting host and attendees
138 $meetingHost = false;
139 if ($event['IS_MEETING'])
140 {
141 $userIndex = \CCalendarEvent::getUserIndex();
142 $attendees = ['y' => [], 'n' => [], 'q' => [], 'i' => []];
143
144 if (isset($event['ATTENDEE_LIST']) && is_array($event['ATTENDEE_LIST']))
145 {
146 foreach ($event['ATTENDEE_LIST'] as $attendee)
147 {
148 if ($userId === (int)$attendee['id'])
149 {
150 $curUserStatus = $attendee['status'];
151 $viewComments = true;
152 }
153
154 $status = (mb_strtolower($attendee['status']) === 'h' || empty($attendee['status']))
155 ? 'y'
156 : $attendee['status']
157 ;
158 $attendees[mb_strtolower($status)][] = $userIndex[$attendee['id']];
159 if ($attendee['status'] === 'H')
160 {
161 $meetingHost = $userIndex[$attendee['id']];
162 $meetingHost['ID'] = $attendee['id'];
163 }
164 }
165 }
166 }
167
168 if (!$meetingHost && isset($event['MEETING_HOST']))
169 {
170 $meetingHost = \CCalendar::GetUser($event['MEETING_HOST'], true);
171 }
172
173 if ($meetingHost && is_array($meetingHost))
174 {
175 $meetingHost['DISPLAY_NAME'] = \CCalendar::GetUserName($meetingHost);
176 if (!isset($meetingHost['AVATAR']))
177 {
178 $meetingHost['AVATAR'] = \CCalendar::GetUserAvatarSrc($meetingHost);
179 }
180 $meetingHost['URL'] = \CCalendar::GetUserUrl($meetingHost["ID"], ($params["PATH_TO_USER"] ?? ''));
181 }
182
183 $params['id'] = 'calendar_view_slider_'.mt_rand();
184 $params['event'] = $event;
185 $params['eventId'] = $event['ID'];
186 $params['parentId'] = $event['PARENT_ID'];
187 $params['name'] = $event['NAME'];
188 $params['fromToHtml'] = $this->getFromToHtml($event);
189 $params['timezoneHint'] = $timezoneHint;
190 $params['isMeeting'] = $event['IS_MEETING'];
191 $params['isRemind'] = $event['REMIND'];
192 $params['isRrule'] = $event['RRULE'];
193 $params['rruleDescription'] = \CCalendarEvent::GetRRULEDescription($event, false);
194
195 $params['avatarSize'] = 34;
196 $params['attendees'] = $attendees ?? [];
197
198 $params['curUserStatus'] = $curUserStatus;
199 $params['meetingHost'] = $meetingHost;
200 $params['meetingHostDisplayName'] = $meetingHost['DISPLAY_NAME'] ?? null;
201 $params['meetingHostWorkPosition'] = htmlspecialcharsbx($meetingHost['WORK_POSITION'] ?? null);
202
203 $meetingCreator = $this->getMeetingCreator($event);
204 $params['meetingCreatorUrl'] = $meetingCreator['URL'] ?? null;
205 $params['meetingCreatorDisplayName'] = $meetingCreator['DISPLAY_NAME'] ?? null;
206 $params['meetingCreatorCollabUser'] = $meetingCreator['COLLAB_USER'] ?? false;
207
208 $params['isHighImportance'] = $event['IMPORTANCE'] === 'high';
209 $params['description'] = $event['~DESCRIPTION'] ?? null;
210
211 $params['isWebdavEvent'] = $event['UF_WEBDAV_CAL_EVENT'] ?? null;
212 $params['isCrmEvent'] = ($event['UF_CRM_CAL_EVENT'] ?? null) && !$isExternalUser;
213
214 $params['accessibility'] = $event['ACCESSIBILITY'];
215 $params['isIntranetEnabled'] = \CCalendar::IsIntranetEnabled();
216 $params['isPrivate'] = $event['PRIVATE_EVENT'];
217
218 $params['location'] = htmlspecialcharsbx(\CCalendar::GetTextLocation($event['LOCATION'] ?? null));
219
220 $params['canEditCalendar'] = $event['permissions']['edit'];
221 $params['canAttendeeEditCalendar'] = $event['permissions']['editLocation'] || $event['permissions']['editAttendees'];
222 $params['canDeleteEvent'] = $event['permissions']['delete'];
223
224 $params['showComments'] = $viewComments;
225
226 //views
227 if (!empty($params['isWebdavEvent']))
228 {
229 $params['filesView'] = $this->getFilesView($event)->getContent();
230 }
231 if (!empty($params['isCrmEvent']))
232 {
233 $params['crmView'] = $this->getCrmView($event)->getContent();
234 }
235
236 $signedEvent = [
237 'UF_CRM_CAL_EVENT' => $params['event']['UF_CRM_CAL_EVENT'] ?? null,
238 'UF_WEBDAV_CAL_EVENT' => $params['event']['UF_WEBDAV_CAL_EVENT'] ?? null,
239 'PARENT_ID' => $params['event']['PARENT_ID'],
240 'ID' => $params['event']['ID'],
241 'CREATED_BY' => $params['event']['CREATED_BY'],
242 ];
243
244 $params['event'] = \CCalendarEvent::FixCommentsIfEventIsBroken($params['event']); //TODO: remove 30.06.2025
245
246 if (
247 isset($params['event']['RELATIONS']['COMMENT_XML_ID'])
248 && $params['event']['RELATIONS']['COMMENT_XML_ID']
249 )
250 {
251 $signedEvent['ENTITY_XML_ID'] = $params['event']['RELATIONS']['COMMENT_XML_ID'];
252 }
253 else
254 {
255 $signedEvent['ENTITY_XML_ID'] = \CCalendarEvent::GetEventCommentXmlId($params['event']);
256 }
257
258 $params['signedEvent'] = (new Signer())->sign(Json::encode($signedEvent));
259
260 $params['isCollabUser'] = $isCollabUser;
261 $params['downloadIcsEnabled'] = ($event['permissions']['view_full'] ?? null) && $isCollabUser;
262
263 return $params;
264 }
265
266 //get components actions
267 public function getCrmViewAction(string $signedEvent): ?Component
268 {
269 try
270 {
271 $event = Json::decode((new Signer())->unsign($signedEvent));
272 }
273 catch (\Exception $e)
274 {
275 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'EVENT_NOT_FOUND_01'));
276 return null;
277 }
278
279 return $this->getCrmView($event);
280 }
281
282 public function getFilesViewAction(string $signedEvent): ?Component
283 {
284 try
285 {
286 $event = Json::decode((new Signer())->unsign($signedEvent));
287 }
288 catch (\Exception $e)
289 {
290 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'EVENT_NOT_FOUND_01'));
291 return null;
292 }
293
294 return $this->getFilesView($event);
295 }
296
297 public function getCommentsViewAction(string $signedEvent): ?Component
298 {
299 try
300 {
301 $event = Json::decode((new Signer())->unsign($signedEvent));
302 }
303 catch (\Exception $e)
304 {
305 $this->addError(new Error(Loc::getMessage('EC_EVENT_NOT_FOUND'), 'EVENT_NOT_FOUND_01'));
306 return null;
307 }
308
309 return $this->getCommentsView($event);
310 }
311
312 private function getFromToHtml(array $event): string
313 {
314 $skipTime = $event['DT_SKIP_TIME'] === "Y";
315 $fromTs = \CCalendar::Timestamp($event['DATE_FROM']);
316 $toTs = \CCalendar::Timestamp($event['DATE_TO']);
317 if ($skipTime)
318 {
319 $toTs += \CCalendar::DAY_LENGTH;
320 }
321 else
322 {
323 $fromTs -= $event['~USER_OFFSET_FROM'];
324 $toTs -= $event['~USER_OFFSET_TO'];
325 }
326
327 return \CCalendar::GetFromToHtml($fromTs, $toTs, $skipTime, $event['DT_LENGTH']);
328 }
329
330 private function getMeetingCreator(array $event): array
331 {
332 $meetingCreator = [];
333 if (
334 $event['IS_MEETING']
335 && $event['MEETING']['MEETING_CREATOR']
336 && $event['MEETING']['MEETING_CREATOR'] !== $event['MEETING_HOST']
337 )
338 {
339 $meetingCreator = \CCalendar::GetUser($event['MEETING']['MEETING_CREATOR'], true);
340 $meetingCreator['DISPLAY_NAME'] = \CCalendar::GetUserName($meetingCreator);
341 $meetingCreator['URL'] = \CCalendar::GetUserUrl(
342 $meetingCreator["ID"],
343 $meetingCreator["PATH_TO_USER"] ?? null
344 );
345 $meetingCreator['COLLAB_USER'] = $meetingCreator['COLLAB_USER'] ?? null;
346 }
347 return $meetingCreator;
348 }
349
350 private function getCrmView(array $event): Component
351 {
352 return new Component(
353 "bitrix:system.field.view",
354 $event['UF_CRM_CAL_EVENT']["USER_TYPE"]["USER_TYPE_ID"],
355 array("arUserField" => $event['UF_CRM_CAL_EVENT']),
356 array("HIDE_ICONS"=>"Y")
357 );
358 }
359
360 private function getFilesView(array $event): Component
361 {
362 return new Component(
363 "bitrix:system.field.view",
364 $event['UF_WEBDAV_CAL_EVENT']["USER_TYPE"]["USER_TYPE_ID"],
365 array("arUserField" => $event['UF_WEBDAV_CAL_EVENT']),
366 array("HIDE_ICONS"=>"Y")
367 );
368 }
369
370 private function getCommentsView(array $event): Component
371 {
372 $userId = \CCalendar::GetCurUserId();
373 if (
374 $userId === (int)$event['CREATED_BY']
375 && ((int)$event['PARENT_ID'] === (int)$event['ID'] || !$event['PARENT_ID'])
376 )
377 {
378 $permission = "Y";
379 }
380 else
381 {
382 $permission = 'M';
383 }
384 $set = \CCalendar::GetSettings();
385 $eventCommentId = $event['PARENT_ID'] ?: $event['ID'];
386
387 return new Component(
388 "bitrix:forum.comments", "bitrix24", [
389 "FORUM_ID" => $set['forum_id'],
390 "ENTITY_TYPE" => "EV",
391 "ENTITY_ID" => $eventCommentId,
392 "ENTITY_XML_ID" => $event['ENTITY_XML_ID'],
393 "PERMISSION" => $permission,
394 "URL_TEMPLATES_PROFILE_VIEW" => $set['path_to_user'],
395 "SHOW_RATING" => \COption::GetOptionString('main', 'rating_vote_show', 'N'),
396 "SHOW_LINK_TO_MESSAGE" => "N",
397 "BIND_VIEWER" => "Y",
398 'LHE' => [
399 'isCopilotImageEnabledBySettings' => AI\Settings::isImageCommentAvailable(),
400 'isCopilotTextEnabledBySettings' => AI\Settings::isTextCommentAvailable(),
401 'copilotParams' => [
402 'moduleId' => 'calendar',
403 'contextId' => 'calendar_comments_' . $event['ENTITY_XML_ID'],
404 'category' => 'calendar_comments',
405 ],
406 ],
407 ],
408 ['HIDE_ICONS' => 'Y']
409 );
410 }
411
412}
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
getCalendarViewSliderParamsAction(int $entryId, string $dateFrom, int $timezoneOffset=0)
Определения calendareventviewform.php:21
static isTextCommentAvailable()
Определения settings.php:33
static isImageCommentAvailable()
Определения settings.php:57
static get($userId=null)
Определения usersettings.php:86
static getTimezoneHint(int $userId, array $event)
Определения util.php:795
static isCollabUser(int $userId)
Определения util.php:337
addError(Error $error)
Определения controller.php:1070
Определения error.php:15
static GetTextReminders($valueList=array())
Определения calendar_reminder.php:500
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$status
Определения session.php:10
htmlspecialcharsbx($string, $flags=ENT_COMPAT, $doubleEncode=true)
Определения tools.php:2701
$event
Определения prolog_after.php:141
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799