1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
calendar_event_handlers.php
См. документацию.
1<?
2
4
6
7/*
8RegisterModuleDependences('intranet', 'OnPlannerInit', 'calendar', 'CCalendarEventHandlers', 'OnPlannerInit');
9RegisterModuleDependences('intranet', 'OnPlannerAction', 'calendar', 'CCalendarEventHandlers', 'OnPlannerAction');
10*/
11
13{
14 public static function OnPlannerInit($params)
15 {
16 global $USER, $DB, $CACHE_MANAGER;
17
18 if (!isset($params['USER_ID']) || (int)$params['USER_ID'] <= 0)
19 {
20 if (!is_object($USER))
21 {
22 return false;
23 }
24 $userId = $USER->GetID();
25 }
26 else
27 {
28 $userId = $params['USER_ID'];
29 }
30
31 if ($userId <= 0)
32 {
33 return false;
34 }
35
36 $arEvents = [];
37 $eventTime = -1;
38
39 $now = time() + CCalendar::GetOffset($userId);
40
41 if (($params['FULL'] ?? null) !== true)
42 {
43 $eventTimeCalculated = self::calculateEventTime($userId);
44
45 CJSCore::RegisterExt('calendar_planner_handler', array(
46 'js' => '/bitrix/js/calendar/core_planner_handler.js',
47 'css' => '/bitrix/js/calendar/core_planner_handler.css',
48 'lang' => BX_ROOT.'/modules/calendar/lang/'.LANGUAGE_ID.'/core_planner_handler.php',
49 'rel' => array('date', 'timer')
50 ));
51
52 return [
53 'DATA' => [
54 'CALENDAR_ENABLED' => true,
55 'EVENTS' => $arEvents,
56 'EVENT_TIME' => $eventTimeCalculated < 0
57 ? ''
58 : (FormatDate(IsAmPmMode() ? "g:i a" : "H:i", $eventTimeCalculated))
59 ,
60 ],
61 'SCRIPTS' => ['calendar_planner_handler']
62 ];
63 }
64
65 $CACHE_MANAGER->RegisterTag('calendar_user_'.$userId);
66 $pathToCalendar = CHTTP::urlDeleteParams(CCalendar::GetPathForCalendarEx($userId), [
67 'action',
68 'sessid',
69 'bx_event_calendar_request',
70 'EVENT_ID'
71 ]);
72
73 $date_from = CCalendar::Date(time() - date('Z') + CCalendar::GetCurrentOffsetUTC($userId), false);
74 $ts_date_from = CCalendar::Timestamp($date_from) - CCalendar::GetCurrentOffsetUTC($userId);
75 $date_from = CCalendar::Date($ts_date_from);
76 $ts_date_to = $ts_date_from + CCalendar::GetDayLen() - 1;
77 $date_to = $date_from;
78
79 $arNewEvents = CCalendarEvent::GetList([
80 'arFilter' => [
81 'CAL_TYPE' => 'user',
82 'OWNER_ID' => $userId,
83 'FROM_LIMIT' => $date_from,
84 'TO_LIMIT' => $date_to,
85 'ACTIVE_SECTION' => 'Y'
86 ],
87 'arSelect' => \CCalendarEvent::$defaultSelectEvent,
88 'parseRecursion' => true,
89 'preciseLimits' => true,
90 'userId' => $userId,
91 'skipDeclined' => true,
92 'fetchAttendees' => false,
93 'fetchMeetings' => true,
94 'getUserfields' => false,
95 ]);
96
97 if (!empty($arNewEvents))
98 {
99 $today = ConvertTimeStamp($now, 'SHORT');
100
101 $format = $DB::dateFormatToPHP(IsAmPmMode() ? 'H:MI T' : 'HH:MI');
102
103 foreach ($arNewEvents as $arEvent)
104 {
105 if ($arEvent['IS_MEETING'] && $arEvent['MEETING_STATUS'] === 'N')
106 {
107 continue;
108 }
109
110 $fromTo = CCalendarEvent::GetEventFromToForUser($arEvent, $userId);
111
112 $ts_from = $fromTo['TS_FROM'];
113
114 $ts_from_utc = $arEvent['DATE_FROM_TS_UTC'];
115 $ts_to_utc = $arEvent['DATE_TO_TS_UTC'];
116
117 if ($arEvent['RRULE'])
118 {
119 $ts_from_utc = $fromTo['TS_FROM'] - CCalendar::GetCurrentOffsetUTC($userId);
120 $ts_to_utc = $ts_from_utc + $arEvent['DT_LENGTH'];
121 }
122
123 if ($arEvent['RRULE'] && ($ts_to_utc <= $ts_date_from || $ts_from_utc >= $ts_date_to))
124 {
125 continue;
126 }
127
128 if(($eventTime < 0 || $eventTime > $ts_from) && $ts_from >= $now)
129 {
130 $eventTime = $ts_from;
131 }
132
133 if($params['FULL'])
134 {
135 $eventPath = CHTTP::urlAddParams($pathToCalendar, [
136 'EVENT_ID' => $arEvent['ID'],
137 'EVENT_DATE' => $today
138 ]);
139 $arEvents[] = [
140 'ID' => $arEvent['ID'],
141 'CAL_TYPE' => 'user',
142 'OWNER_ID' => $userId,
143 'CREATED_BY' => $arEvent['CREATED_BY'],
144 'NAME' => $arEvent['NAME'],
145 'DATE_FROM' => $fromTo['DATE_FROM'],
146 'DATE_TO' => $fromTo['DATE_TO'],
147 'TIME_FROM' => FormatDate($format, $fromTo['TS_FROM']),
148 'TIME_TO' => FormatDate($format, $fromTo['TS_TO']),
149 'IMPORTANCE' => $arEvent['IMPORTANCE'],
150 'ACCESSIBILITY' => $arEvent['ACCESSIBILITY'],
151 'DATE_FROM_TODAY' => $today === ConvertTimeStamp($fromTo['TS_FROM'], 'SHORT'),
152 'DATE_TO_TODAY' => $today === ConvertTimeStamp($fromTo['TS_TO'], 'SHORT'),
153 'SORT' => $fromTo['TS_FROM'],
154 'EVENT_PATH' => $eventPath
155 ];
156 }
157 }
158 }
159
160 // Sort
161 usort($arEvents, array('CCalendarEventHandlers', 'DateSort'));
162
163 CJSCore::RegisterExt('calendar_planner_handler', array(
164 'js' => '/bitrix/js/calendar/core_planner_handler.js',
165 'css' => '/bitrix/js/calendar/core_planner_handler.css',
166 'lang' => BX_ROOT.'/modules/calendar/lang/'.LANGUAGE_ID.'/core_planner_handler.php',
167 'rel' => array('date', 'timer')
168 ));
169
170 return [
171 'DATA' => [
172 'CALENDAR_ENABLED' => true,
173 'EVENTS' => $arEvents,
174 'EVENT_TIME' => $eventTime < 0 ? '' : (FormatDate(IsAmPmMode() ? "g:i a" : "H:i", $eventTime)),
175 ],
176 'SCRIPTS' => ['calendar_planner_handler']
177 ];
178 }
179
180 private static function calculateEventTime($userId)
181 {
182 $now = time() + CCalendar::GetOffset($userId);
183 $eventTime = -1;
184
185 $date_from = CCalendar::Date(time() - date('Z') + CCalendar::GetCurrentOffsetUTC($userId), false);
186 $ts_date_from = CCalendar::Timestamp($date_from) - CCalendar::GetCurrentOffsetUTC($userId);
187 $date_from = CCalendar::Date($ts_date_from);
188 $ts_date_to = $ts_date_from + CCalendar::GetDayLen() - 1;
189 $date_to = $date_from;
190
191 $arNewEvents = CCalendarEvent::GetList([
192 'arFilter' => [
193 'CAL_TYPE' => 'user',
194 'OWNER_ID' => $userId,
195 'FROM_LIMIT' => $date_from,
196 'TO_LIMIT' => $date_to,
197 'ACTIVE_SECTION' => 'Y'
198 ],
199 'arSelect' => [
200 'ID',
201 'PARENT_ID',
202 'OWNER_ID',
203 'SECTION_ID',
204 'DATE_FROM',
205 'DATE_TO',
206 'TZ_FROM',
207 'TZ_TO',
208 'TZ_OFFSET_FROM',
209 'TZ_OFFSET_TO',
210 'DATE_FROM_TS_UTC',
211 'DATE_TO_TS_UTC',
212 'DT_SKIP_TIME',
213 'DT_LENGTH',
214 'CAL_TYPE',
215 'MEETING_STATUS',
216 'IS_MEETING',
217 'RRULE',
218 'EXDATE',
219 ],
220 'parseRecursion' => true,
221 'preciseLimits' => true,
222 'userId' => $userId,
223 'skipDeclined' => true,
224 'fetchAttendees' => false,
225 'getUserfields' => false,
226 'checkPermissions' => false,
227 ]);
228
229 if (!empty($arNewEvents))
230 {
231 foreach ($arNewEvents as $arEvent)
232 {
233 if ($arEvent['IS_MEETING'] && $arEvent['MEETING_STATUS'] === 'N')
234 {
235 continue;
236 }
237
239 $ts_from = $fromTo['TS_FROM'];
240
241 $ts_from_utc = $arEvent['DATE_FROM_TS_UTC'];
242 $ts_to_utc = $arEvent['DATE_TO_TS_UTC'];
243
244 if ($arEvent['RRULE'])
245 {
246 $ts_from_utc = $fromTo['TS_FROM'] - CCalendar::GetCurrentOffsetUTC($userId);
247 $ts_to_utc = $ts_from_utc + $arEvent['DT_LENGTH'];
248 }
249
250 if ($arEvent['RRULE'] && ($ts_to_utc <= $ts_date_from || $ts_from_utc >= $ts_date_to))
251 {
252 continue;
253 }
254
255 if(($eventTime < 0 || $eventTime > $ts_from) && $ts_from >= $now)
256 {
257 $eventTime = $ts_from;
258 }
259 }
260 }
261
262 return $eventTime;
263 }
264
265 public static function OnPlannerAction($action, $params)
266 {
267 switch($action)
268 {
269 case 'calendar_add':
270
272 'NAME' => $_REQUEST['name'],
273 'FROM' => $_REQUEST['from'],
274 'TO' => $_REQUEST['to'],
275 'ABSENCE' => $_REQUEST['absence']
276 ));
277 break;
278
279 case 'calendar_show':
280
282 'ID' => (int)$_REQUEST['id'],
283 'SITE_ID' => $params['SITE_ID']
284 ));
285 }
286 return null;
287 }
288
289 protected static function getEvent($arParams)
290 {
291 global $USER;
292
293 $userId = $USER->GetID();
294 $date_from = CCalendar::Date(time() - date('Z') + CCalendar::GetCurrentOffsetUTC(), false);
295 $ts_date_from = CCalendar::Timestamp($date_from) - CCalendar::GetCurrentOffsetUTC();
296 $date_from = CCalendar::Date($ts_date_from);
297 $date_to = $date_from;
298 $ts_date_to = $ts_date_from + CCalendar::GetDayLen() - 1;
299
300 $res = CCalendarEvent::GetList(
301 array(
302 'arFilter' => array(
303 "ID" => $arParams['ID'],
304 "FROM_LIMIT" => $date_from,
305 "TO_LIMIT" => $date_to
306 ),
307 'parseRecursion' => true,
308 'fetchAttendees' => true,
309 'checkPermissions' => true,
310 'skipDeclined' => true
311 )
312 );
313
314 $arEvents = array();
315 foreach ($res as $arEvent)
316 {
317 if ($arEvent['IS_MEETING'] && $arEvent['MEETING_STATUS'] === 'N')
318 {
319 continue;
320 }
321 $fromTo = CCalendarEvent::GetEventFromToForUser($arEvent, $userId);
322
323 if ($arEvent['RRULE'])
324 {
325 $ts_from_utc = $fromTo['TS_FROM'] - CCalendar::GetCurrentOffsetUTC();
326 $ts_to_utc = $ts_from_utc + $arEvent['DT_LENGTH'];
327 if ($ts_to_utc <= $ts_date_from || $ts_from_utc >= $ts_date_to)
328 {
329 continue;
330 }
331 }
332
333 $arEvents[] = $arEvent;
334 }
335
336
337 if (is_array($arEvents) && !empty($arEvents))
338 {
339 $arEvent = $arEvents[0];
340
341 $arEvent['GUESTS'] = array();
342 if ($arEvent['IS_MEETING'] && is_array($arEvent['ATTENDEE_LIST']))
343 {
344 $userIndex = CCalendarEvent::getUserIndex();
345 foreach ($arEvent['ATTENDEE_LIST'] as $attendee)
346 {
347 if (isset($userIndex[$attendee["id"]]))
348 {
349 $arEvent['GUESTS'][] = array(
350 'id' => $attendee['id'],
351 'name' => $userIndex[$attendee["id"]]['DISPLAY_NAME'],
352 'status' => $attendee['status'],
353 'accessibility' => $arEvent['ACCESSIBILITY'],
354 'bHost' => (int)$attendee['id'] === (int)$arEvent['MEETING_HOST'],
355 );
356
357 if ((int)$attendee['id'] === (int)$USER->GetID())
358 {
359 $arEvent['STATUS'] = $attendee['status'];
360 }
361 }
362 }
363 }
364
365 $set = CCalendar::GetSettings();
366 $url = str_replace(
367 '#user_id#', $arEvent['CREATED_BY'], $set['path_to_user_calendar']
368 ).'?EVENT_ID='.$arEvent['ID'];
369
370 $fromTo = CCalendarEvent::GetEventFromToForUser($arEvent, $USER->GetID());
371
372 return [
373 'ID' => $arEvent['ID'],
374 'NAME' => $arEvent['NAME'],
375 'DETAIL_TEXT' => $arEvent['DESCRIPTION'],
376 'DATE_FROM' => $fromTo['DATE_FROM'],
377 'DATE_TO' => $fromTo['DATE_TO'],
378 'ACCESSIBILITY' => $arEvent['ACCESSIBILITY'],
379 'IMPORTANCE' => $arEvent['IMPORTANCE'],
380 'STATUS' => $arEvent['STATUS'],
381 'IS_MEETING' => $arEvent['IS_MEETING'] ? 'Y' : 'N',
382 'GUESTS' => $arEvent['GUESTS'],
383 'UF_WEBDAV_CAL_EVENT' => $arEvent['UF_WEBDAV_CAL_EVENT'],
384 'URL' => $url,
385 ];
386 }
387 }
388
389 protected static function MakeDateTime($date, $time)
390 {
391 global $DB;
392
393 if (!IsAmPmMode())
394 {
395 $date_start = FormatDate(
396 $DB::DateFormatToPhp(FORMAT_DATETIME),
398 $date.' '.$time,
399 FORMAT_DATE.' HH:MI'
400 )
401 );
402 }
403 else
404 {
405 $date_start = FormatDate(
406 $DB::DateFormatToPhp(FORMAT_DATETIME),
408 $date.' '.$time,
409 FORMAT_DATE.' H:MI T'
410 )
411 );
412 }
413
414 return $date_start;
415 }
416
417 protected static function plannerActionAdd($arParams)
418 {
419 global $USER;
420 $today = ConvertTimeStamp(time() + CCalendar::GetOffset(), 'SHORT');
421 $userId = $USER->GetID();
422 $userSettings = UserSettings::get($userId);
423 $reminderList = $userSettings['defaultReminders']['withTime'];
424 $data = [
425 'CAL_TYPE' => 'user',
426 'OWNER_ID' => $USER->GetID(),
427 'NAME' => $arParams['NAME'],
428 'DT_FROM' => self::MakeDateTime($today, $arParams['FROM']),
429 'DT_TO' => self::MakeDateTime($today, $arParams['TO']),
430 'SECTIONS' => CCalendar::GetMeetingSection($userId, true),
431 'ATTENDEES_CODES' => ['U' . $userId],
432 'ATTENDEES' => [$userId],
433 'MEETING_HOST' => $userId,
434 'REMIND' => $reminderList,
435 ];
436
437 if ($arParams['ABSENCE'] === 'Y')
438 {
439 $data['ACCESSIBILITY'] = 'absent';
440 }
441
442 CCalendar::SaveEvent(array(
443 'arFields' => $data,
444 'userId' => $userId
445 ));
446 }
447
448 protected static function plannerActionShow($arParams)
449 {
450 global $DB, $USER;
451
452 $res = false;
453
454 if($arParams['ID'] > 0)
455 {
457 'ID' => $arParams['ID'],
458 'SITE_ID' => $arParams['SITE_ID']
459 ));
460
461 if ($event)
462 {
463 $today = ConvertTimeStamp(time() + \CCalendar::GetOffset(), 'SHORT');
464 $now = time();
465
466 $res = array(
467 'ID' => $event['ID'],
468 'NAME' => $event['NAME'],
469 'DESCRIPTION' => CCalendarEvent::ParseText($event['DETAIL_TEXT'], $event['ID'], $event['UF_WEBDAV_CAL_EVENT']),
470 'URL' => '/company/personal/user/'.$USER->GetID().'/calendar/?EVENT_ID=' .$event['ID'],
471 'DATE_FROM' => MakeTimeStamp($event['DATE_FROM']),
472 'DATE_TO' => MakeTimeStamp($event['DATE_TO']),
473 'STATUS' => $event['STATUS'],
474 );
475
476 $res['DATE_FROM_TODAY'] = ConvertTimeStamp($res['DATE_FROM'],'SHORT') == $today;
477 $res['DATE_TO_TODAY'] = ConvertTimeStamp($res['DATE_TO'], 'SHORT') == $today;
478
479 if ($res['DATE_FROM_TODAY'])
480 {
481 if (IsAmPmMode())
482 {
483 $res['DATE_F'] = FormatDate("today g:i a", $res['DATE_FROM']);
484 $res['DATE_T'] = FormatDate("g:i a", $res['DATE_TO']);
485 }
486 else
487 {
488 $res['DATE_F'] = FormatDate("today H:i", $res['DATE_FROM']);
489 $res['DATE_T'] = FormatDate("H:i", $res['DATE_TO']);
490 }
491
492 if ($res['DATE_TO_TODAY'])
493 $res['DATE_F'] .= ' - '.$res['DATE_T'];
494
495 if ($res['DATE_FROM'] > $now)
496 {
497
498 $res['DATE_F_TO'] = GetMessage('TM_IN').' '.FormatDate('Hdiff', time()*2-($res['DATE_FROM'] - \CCalendar::GetOffset()));
499 }
500 }
501 else if ($res['DATE_TO_TODAY'])
502 {
503 $res['DATE_F'] = FormatDate(str_replace(
504 array('#today#', '#time#'),
505 array('today', 'H:i'),
506 GetMessage('TM_TILL')
507 ), $res['DATE_TO']);
508 }
509 else
510 {
511 $fmt = preg_replace('/:s$/', '', $DB::DateFormatToPHP(CSite::GetDateFormat("FULL")));
512 $res['DATE_F'] = FormatDate($fmt, $res['DATE_FROM']);
513 $res['DATE_F_TO'] = FormatDate($fmt, $res['DATE_TO']);
514 }
515
516 if ($event['IS_MEETING'] === 'Y')
517 {
518 $arGuests = array('Y' => array(), 'N' => array(), 'Q' => array());
519 foreach ($event['GUESTS'] as $key => $guest)
520 {
521 $guest['url'] = str_replace(
522 array('#ID#', '#USER_ID#'),
523 $guest['id'],
524 \COption::GetOptionString('intranet', 'path_user', '/company/personal/user/#USER_ID#/', $arParams['SITE_ID'])
525 );
526
527 if ($guest['bHost'])
528 {
529 $res['HOST'] = $guest;
530 }
531 else
532 {
533 $arGuests[$guest['status']][] = $guest;
534 }
535 }
536
537 $res['GUESTS'] = array_merge($arGuests['Y'], $arGuests['N'], $arGuests['Q']);
538 }
539
540 if (mb_strlen($res['DESCRIPTION']) > 150)
541 {
542 $res['DESCRIPTION'] = CUtil::closetags(mb_substr($res['DESCRIPTION'], 0, 150)).'...';
543 }
544
545 $res = array('EVENT' => $res);
546 }
547 }
548 else
549 {
550 $res = array('error' => 'event not found');
551 }
552
553 return $res;
554 }
555
556 private static function DateSort($a, $b)
557 {
558 if ($a['SORT'] == $b['SORT'])
559 {
560 return 0;
561 }
562 if ($a['SORT'] < $b['SORT'])
563 {
564 return -1;
565 }
566 return 1;
567 }
568}
569?>
$arParams
Определения access_dialog.php:21
const BX_ROOT
Определения bx_root.php:3
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
Определения check_mail.php:18
static plannerActionShow($arParams)
Определения calendar_event_handlers.php:448
static OnPlannerAction($action, $params)
Определения calendar_event_handlers.php:265
static OnPlannerInit($params)
Определения calendar_event_handlers.php:14
static plannerActionAdd($arParams)
Определения calendar_event_handlers.php:417
static MakeDateTime($date, $time)
Определения calendar_event_handlers.php:389
static getEvent($arParams)
Определения calendar_event_handlers.php:289
static GetEventFromToForUser($params, $userId)
Определения calendar_event.php:3870
static GetCurrentOffsetUTC($userId=false)
Определения calendar.php:5398
static urlDeleteParams($url, $delete_params, $options=array())
Определения http.php:568
static urlAddParams($url, $add_params, $options=[])
Определения http.php:521
static RegisterExt($name, $arPaths)
Определения jscore.php:28
global $CACHE_MANAGER
Определения clear_component_cache.php:7
$data['IS_AVAILABLE']
Определения .description.php:13
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
global $DB
Определения cron_frame.php:29
global $USER
Определения csv_new_run.php:40
const FORMAT_DATETIME
Определения include.php:64
const FORMAT_DATE
Определения include.php:63
IsAmPmMode($returnConst=false)
Определения tools.php:803
FormatDate($format="", $timestamp=false, $now=false, ?string $languageId=null)
Определения tools.php:871
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
GetMessage($name, $aReplace=null)
Определения tools.php:3397
MakeTimeStamp($datetime, $format=false)
Определения tools.php:538
$time
Определения payment.php:61
$event
Определения prolog_after.php:141
if(empty($signedUserToken)) $key
Определения quickway.php:257
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
else $a
Определения template.php:137
$action
Определения file_dialog.php:21
$url
Определения iframe.php:7