• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_sect.php
  • Класс: CCalendarSect
  • Вызов: CCalendarSect::FormatICal
static function FormatICal($section, $events)
{
	global $APPLICATION;

	$res = 'BEGIN:VCALENDAR'."n".
		'PRODID:-//Bitrix//Bitrix Calendar//EN'."n".
		'VERSION:2.0'."n".
		'CALSCALE:GREGORIAN'."n".
		'METHOD:PUBLISH'."n".
		'X-WR-CALNAME:'.self::_ICalPaste($section['NAME'])."n".
		'X-WR-CALDESC:'.self::_ICalPaste($section['DESCRIPTION'])."n";

	$localTime = new DateTime();
	$localOffset = $localTime->getOffset();

	foreach ($events as $event)
	{
		$fromTs = CCalendar::Timestamp($event['DATE_FROM']);
		$toTs = CCalendar::Timestamp($event['DATE_TO']);
		if ($event['DT_SKIP_TIME'] === "Y")
		{
			$dtStart = date("Ymd", $fromTs);
			$dtEnd = date("Ymd", $toTs + CCalendar::GetDayLen());
		}
		else
		{
			$fromTsUTC = $fromTs - $event['TZ_OFFSET_FROM'];
			$toTsUTC = $toTs - $event['TZ_OFFSET_TO'];
			$dtStart = date("YmdTHisZ", $fromTsUTC);
			$dtEnd = date("YmdTHisZ", $toTsUTC);
		}

		$dtStamp = str_replace('T000000Z', '', date("YmdTHisZ", CCalendar::Timestamp($event['TIMESTAMP_X']) - $localOffset));
		$uid = md5(uniqid(rand(), true).$event['ID']).'@bitrix';
		$period = '';

		$rrule = CCalendarEvent::ParseRRULE($event['RRULE']);

		if($rrule && isset($rrule['FREQ']) && $rrule['FREQ'] !== 'NONE')
		{
			$period = 'RRULE:FREQ='.$rrule['FREQ'].';';
			$period .= 'INTERVAL='.$rrule['INTERVAL'].';';
			if ($rrule['FREQ'] === 'WEEKLY')
			{
				$period .= 'BYDAY='.implode(',', $rrule['BYDAY']).';';
			}

			if (isset($rrule['COUNT']) && (int)$rrule['COUNT'] > 0)
			{
				$period .= 'COUNT='. (int)$rrule['COUNT'] .';';
			}
			else
			{
				$until = date("Ymd", $event['DATE_TO_TS_UTC']);
				if($until != '20380101')
					$period .= 'UNTIL='.$until.';';
			}
			$period .= 'WKST=MO';
			$period .= "n";
		}

		$res .= 'BEGIN:VEVENT'."n";

		if ($event['DT_SKIP_TIME'] === "Y")
		{
			$res .= 'DTSTART;VALUE=DATE:'.$dtStart."n".
				'DTEND;VALUE=DATE:'.$dtEnd."n";
		}
		else
		{
			$res .= 'DTSTART;VALUE=DATE-TIME:'.$dtStart."n".
				'DTEND;VALUE=DATE-TIME:'.$dtEnd."n";
		}

		$res .= 'DTSTAMP:'.$dtStamp."n".
			'UID:'.$uid."n".
			'SUMMARY:'.self::_ICalPaste($event['NAME'])."n".
			'DESCRIPTION:'.self::_ICalPaste($event['DESCRIPTION'])."n".$period."n".
			'LOCATION:'.self::_ICalPaste(CCalendar::GetTextLocation($event['LOCATION']))."n".
			'SEQUENCE:0'."n".
			'STATUS:CONFIRMED'."n".
			'TRANSP:TRANSPARENT'."n".
			'END:VEVENT'."n";
	}

	$res .= 'END:VCALENDAR';
	if (!defined('BX_UTF') || BX_UTF !== true)
		$res = $APPLICATION->ConvertCharset($res, LANG_CHARSET, 'UTF-8');

	return $res;
}