• Модуль: dav
  • Путь к файлу: ~/bitrix/modules/dav/classes/general/groupdavclientcalendar.php
  • Класс: CDavGroupdavClientCalendar
  • Вызов: CDavGroupdavClientCalendar::GetICalContent
public function GetICalContent(array $event, $siteId = null)
{
	$oneDay = 86400; //24*60*60
	$dateFrom = date('Ymd\THis', MakeTimeStamp($event['DATE_FROM']));
	$dateTo = date('Ymd\THis', MakeTimeStamp($event['DATE_TO']));
	$tzFrom = $event['TZ_FROM'];
	$tzTo = $event['TZ_TO'];

	$iCalEvent = [
		'TYPE' => 'VEVENT',
		'CREATED' => date('Ymd\THis\Z', MakeTimeStamp($event['DATE_CREATE'])),
		'LAST-MODIFIED' => date('Ymd\THis\Z', MakeTimeStamp($event['TIMESTAMP_X'])),
		'DTSTAMP' => date('Ymd\THis\Z', MakeTimeStamp($event['TIMESTAMP_X'])),
		'UID' => $event['DAV_XML_ID'],
		'SUMMARY' => $event['NAME']
	];

	if ($event['DT_SKIP_TIME'] === 'Y')
	{
		$iCalEvent['DTSTART'] = [
			'VALUE' => date('Ymd', MakeTimeStamp($event['DATE_FROM'])),
			'PARAMETERS' => ['VALUE' => 'DATE']
		];
		$iCalEvent['DTEND'] = [
			'VALUE' => date('Ymd', MakeTimeStamp($event['DATE_TO']) + $oneDay),
			'PARAMETERS' => ['VALUE' => 'DATE']
		];

	}
	else
	{
		$iCalEvent['DTSTART'] = [
			'VALUE' => $dateFrom,
			'PARAMETERS' => ['TZID' => $tzFrom]
		];
		$iCalEvent['DTEND'] = [
			'VALUE' => $dateTo,
			'PARAMETERS' => ['TZID' => $tzTo]
		];
	}

	if (
		isset($event['ACCESSIBILITY'])
		&& (
			$event['ACCESSIBILITY'] === 'free'
			|| $event['ACCESSIBILITY'] === 'quest'
		)
	)
	{
		$iCalEvent['TRANSP'] = 'TRANSPARENT';
	}
	else
	{
		$iCalEvent['TRANSP'] = 'OPAQUE';
	}

	if (
		isset($event['LOCATION'], $event['LOCATION']['NEW'])
		&& is_array($event['LOCATION'])
		&& $event['LOCATION']['NEW']
	)
	{
		$iCalEvent['LOCATION'] = $event['LOCATION']['NEW'];
	}

	if (isset($event['IMPORTANCE']))
	{
		if ($event['IMPORTANCE'] === 'low')
		{
			$iCalEvent['PRIORITY'] = 9;
		}
		elseif ($event['IMPORTANCE'] === 'high')
		{
			$iCalEvent['PRIORITY'] = 1;
		}
		else
		{
			$iCalEvent['PRIORITY'] = 5;
		}
	}

	if (isset($event['DESCRIPTION']) && $event['DESCRIPTION'])
	{
		$iCalEvent['DESCRIPTION'] = $event['DESCRIPTION'];
	}

	if (isset($event['PROPERTY_REMIND_SETTINGS']) && $event['PROPERTY_REMIND_SETTINGS'])
	{
		$arPeriodMapTmp = [
			'min' => 'M',
			'hour' => 'H',
			'day' => 'D'
		];
		$ar = explode('_', $event['PROPERTY_REMIND_SETTINGS']);

		$iCalEvent['@VALARM'] = [
			'TYPE' => 'VALARM',
			'ACTION' => 'DISPLAY',
			'TRIGGER' => [
				'PARAMETERS' => ['VALUE' => 'DURATION'],
				'VALUE' => '-PT' . $ar[0] . $arPeriodMapTmp[$ar[1]]
			]
		];
	}

	if (isset($event['RRULE']) && is_array($event['RRULE']))
	{
		$val = 'FREQ=' . $event['RRULE']['FREQ'];
		if (isset($event['RRULE']['INTERVAL']) && $event['RRULE']['INTERVAL'] !== '')
		{
			$val .= ';INTERVAL=' . $event['RRULE']['INTERVAL'];
		}
		if (isset($event['RRULE']['BYDAY']) && $event['RRULE']['BYDAY'] !== '')
		{
			$val .= ';BYDAY=' . $event['RRULE']['BYDAY'];
		}

		if (isset($event['RRULE']['COUNT']) && $event['RRULE']['COUNT'] > 2)
		{
			$val .= ';COUNT=' . (int)$event['RRULE']['COUNT'];
		}
		elseif (isset($event['RRULE']['UNTIL']))
		{
			if ($event['RRULE']['UNTIL'] != '' && (int)$event['RRULE']['UNTIL'] == $event['RRULE']['UNTIL'])
			{
				$val .= ';UNTIL=' . date('Ymd\THis\Z', $event['RRULE']['UNTIL']);
			}
			else if($event['RRULE']['UNTIL'] != '')
			{
				$val .= ';UNTIL=' . date('Ymd', MakeTimeStamp($event['RRULE']['UNTIL'])) . 'T235959Z';
			}
		}
		else
		{
			$val .= ';UNTIL=' . date('Ymd\THis\Z', $event['DATE_TO_TS_UTC'] + (int)date('Z'));
		}

		$iCalEvent['RRULE'] = $val;
	}

	// TODO: we have to update SEQUENCE corresponding to rfc5546
	$iCalEvent['SEQUENCE'] = $event['VERSION'];

	if (
		isset($event['EXDATE'], $event['RRULE'])
		&& $event['EXDATE']
		&& $event['RRULE']
	)
	{
		$event['EXDATE'] = explode(';', $event['EXDATE']);

		$exdate = [];
		foreach ($event['EXDATE'] as $date)
		{
			if ($event['DT_SKIP_TIME'] === 'Y')
			{
				$exdate[] = date('Ymd', MakeTimeStamp($date));
			}
			else
			{
				$exdate[] = date('Ymd', MakeTimeStamp($date)) . 'T' . date('His', MakeTimeStamp($event['DATE_FROM']));
			}
		}

		if (!empty($exdate))
		{
			if ($event['DT_SKIP_TIME'] === 'Y')
			{
				$iCalEvent['EXDATE'] = [
					'VALUE' => implode(',', $exdate),
					'PARAMETERS' => [
						'VALUE' => 'DATE'
					]
				];
			}
			else
			{
				$iCalEvent['EXDATE'] = [
					'VALUE' => implode(',', $exdate),
					'PARAMETERS' => [
						'TZID' => $tzFrom,
						'VALUE' => 'DATE-TIME'
					]
				];
			}
		}
	}

	return (new CDavICalendar($iCalEvent, $siteId))->Render();
}