- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/sync/google/builders/buildersynceventfromexternaldata.php
- Класс: BitrixCalendarSyncGoogleBuildersBuilderSyncEventFromExternalData
- Вызов: BuilderSyncEventFromExternalData::prepareRecurringRule
private function prepareRecurringRule(CoreBaseDate $start): ?RecurringEventRules
{
if (empty($this->item['recurrence']))
{
return null;
}
foreach ($this->item['recurrence'] as $row)
{
if (strpos($row, 'RRULE:') === 0)
{
$rrule = [];
$rules = explode(';', substr($row, 6));
foreach ($rules as $rule)
{
if (empty($rule))
{
continue;
}
[$name, $value] = explode('=', $rule);
if (empty($name) || empty($value))
{
continue;
}
$rrule[$name] = $value;
}
if (!empty($rrule['FREQ']) && in_array($rrule['FREQ'], RecurringEventRules::FREQUENCY, true))
{
$property = new RecurringEventRules($rrule['FREQ']);
}
else
{
return null;
}
if (!empty($rrule['COUNT']))
{
$property->setCount((int)$rrule['COUNT']);
}
if (!empty($rrule['INTERVAL']))
{
$property->setInterval((int)$rrule['INTERVAL']);
}
if (!empty($rrule['UNTIL']))
{
try
{
$phpDate = new DateTime($rrule['UNTIL']);
$date = new CoreBaseDate(TypeDateTime::createFromPhp($phpDate));
$property->setUntil($date);
}
catch (Exception $e)
{
return null;
}
}
if ($rrule['FREQ'] === RecurringEventRules::FREQUENCY_WEEKLY)
{
if (!empty($rrule['BYDAY']))
{
$property->setByDay(explode(',', $rrule['BYDAY']));
}
else
{
$dayOfWeek = $start->format('w');
$day = CCalendar::WeekDayByInd($dayOfWeek);
if ($day)
{
$property->setByDay([$day]);
}
}
}
return $property;
}
}
return null;
}