• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event_handlers.php
  • Класс: CCalendarEventHandlers
  • Вызов: CCalendarEventHandlers::OnPlannerInit
static function OnPlannerInit($params)
{
	global $USER, $DB, $CACHE_MANAGER;

	if (!isset($params['USER_ID']) || (int)$params['USER_ID'] <= 0)
	{
		if (!is_object($USER))
		{
			return false;
		}
		$userId = $USER->GetID();
	}
	else
	{
		$userId = $params['USER_ID'];
	}

	if ($userId <= 0)
	{
		return false;
	}

	$CACHE_MANAGER->RegisterTag('calendar_user_'.$userId);
	$pathToCalendar = CHTTP::urlDeleteParams(CCalendar::GetPathForCalendarEx($userId), [
		'action',
		'sessid',
		'bx_event_calendar_request',
		'EVENT_ID'
	]);

	$date_from = CCalendar::Date(time() - date('Z') + CCalendar::GetCurrentOffsetUTC($userId), false);
	$ts_date_from = CCalendar::Timestamp($date_from) - CCalendar::GetCurrentOffsetUTC($userId);
	$date_from = CCalendar::Date($ts_date_from);
	$ts_date_to = $ts_date_from + CCalendar::GetDayLen() - 1;
	$date_to = $date_from;

	$arEvents = [];
	$eventTime = -1;

	$arNewEvents = CCalendarEvent::GetList([
		'arFilter' => [
			'CAL_TYPE' => 'user',
			'OWNER_ID' => $userId,
			'FROM_LIMIT' => $date_from,
			'TO_LIMIT' => $date_to,
			'ACTIVE_SECTION' => 'Y'
		],
		'arOrder' => ['DATE_FROM_TS_UTC' => 'asc'],
		'parseRecursion' => true,
		'preciseLimits' => true,
		'userId' => $userId,
		'skipDeclined' => true,
		'fetchAttendees' => false,
		'fetchMeetings' => true
	]);

	if (!empty($arNewEvents))
	{
		$now = time() + CTimeZone::GetOffset($userId);
		$today = ConvertTimeStamp($now, 'SHORT');

		$format = $DB::dateFormatToPHP(IsAmPmMode() ? 'H:MI T' : 'HH:MI');

		foreach ($arNewEvents as $arEvent)
		{
			if ($arEvent['IS_MEETING'] && $arEvent['MEETING_STATUS'] === 'N')
			{
				continue;
			}

			$fromTo = CCalendarEvent::GetEventFromToForUser($arEvent, $userId);

			$ts_from = $fromTo['TS_FROM'];
			//$ts_to = $fromTo['TS_TO'];

			$ts_from_utc = $arEvent['DATE_FROM_TS_UTC'];
			$ts_to_utc = $arEvent['DATE_TO_TS_UTC'];

			if ($arEvent['RRULE'])
			{
				$ts_from_utc = $fromTo['TS_FROM'] - CCalendar::GetCurrentOffsetUTC($userId);
				$ts_to_utc = $ts_from_utc + $arEvent['DT_LENGTH'];
			}

			if ($arEvent['RRULE'] && ($ts_to_utc <= $ts_date_from || $ts_from_utc >= $ts_date_to))
			{
				continue;
			}

			if(($eventTime < 0 || $eventTime > $ts_from) && $ts_from >= $now)
			{
				$eventTime = $ts_from;
			}

			if($params['FULL'])
			{
				$eventPath = CHTTP::urlAddParams($pathToCalendar, [
					'EVENT_ID' => $arEvent['ID'],
					'EVENT_DATE' => $today
				]);
				$arEvents[] = [
					'ID' => $arEvent['ID'],
					'CAL_TYPE' => 'user',
					'OWNER_ID' => $userId,
					'CREATED_BY' => $arEvent['CREATED_BY'],
					'NAME' => $arEvent['NAME'],
					'DATE_FROM' => $fromTo['DATE_FROM'],
					'DATE_TO' => $fromTo['DATE_TO'],
					'TIME_FROM' => FormatDate($format, $fromTo['TS_FROM']),
					'TIME_TO' => FormatDate($format, $fromTo['TS_TO']),
					'IMPORTANCE' => $arEvent['IMPORTANCE'],
					'ACCESSIBILITY' => $arEvent['ACCESSIBILITY'],
					'DATE_FROM_TODAY' => $today == ConvertTimeStamp($fromTo['TS_FROM'], 'SHORT'),
					'DATE_TO_TODAY' => $today == ConvertTimeStamp($fromTo['TS_TO'], 'SHORT'),
					'SORT' => $fromTo['TS_FROM'],
					'EVENT_PATH' => $eventPath
				];
			}
		}
	}

	// Sort
	usort($arEvents, array('CCalendarEventHandlers', 'DateSort'));

	CJSCore::RegisterExt('calendar_planner_handler', array(
		'js' => '/bitrix/js/calendar/core_planner_handler.js',
		'css' => '/bitrix/js/calendar/core_planner_handler.css',
		'lang' => BX_ROOT.'/modules/calendar/lang/'.LANGUAGE_ID.'/core_planner_handler.php',
		'rel' => array('date', 'timer')
	));

	return [
		'DATA' => [
			'CALENDAR_ENABLED' => true,
			'EVENTS' => $arEvents,
			'EVENT_TIME' => $eventTime < 0 ? '' : (FormatDate(IsAmPmMode() ? "g:i a" : "H:i", $eventTime)),
		],
		'SCRIPTS' => ['calendar_planner_handler']
	];
}