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