- Модуль: 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;
}