- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
- Класс: CCalendarEvent
- Вызов: CCalendarEvent::checkRecurringRuleField
static function checkRecurringRuleField(array &$arFields, int $toTs, $currentExDate): void
{
// Check rrules
if (
!empty($arFields['RRULE']['FREQ'])
&& in_array($arFields['RRULE']['FREQ'], ['HOURLY', 'DAILY', 'MONTHLY', 'YEARLY', 'WEEKLY'])
)
{
// Interval
if (isset($arFields['RRULE']['INTERVAL']) && (int)$arFields['RRULE']['INTERVAL'] > 1)
$arFields['RRULE']['INTERVAL'] = (int)$arFields['RRULE']['INTERVAL'];
// Until date
$untilTs = CCalendar::Timestamp($arFields['RRULE']['UNTIL'] ?? null, false, false);
if (!$untilTs)
{
$arFields['RRULE']['UNTIL'] = CCalendar::GetMaxDate();
$untilTs = CCalendar::Timestamp($arFields['RRULE']['UNTIL'], false, false);
}
elseif ($untilTs + CCalendar::GetDayLen() < $toTs)
{
$untilTs = $toTs;
}
$arFields['DATE_TO_TS_UTC'] = $untilTs + CCalendar::GetDayLen();
$arFields['RRULE']['UNTIL'] = CCalendar::Date($untilTs, false);
unset($arFields['RRULE']['~UNTIL']);
if (isset($arFields['RRULE']['COUNT']))
{
$arFields['RRULE']['COUNT'] = (int)$arFields['RRULE']['COUNT'];
}
if (isset($arFields['RRULE']['BYDAY']))
{
if (is_array($arFields['RRULE']['BYDAY']))
{
$BYDAY = $arFields['RRULE']['BYDAY'];
}
else
{
$BYDAY = [];
$days = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
$bydays = explode(',', $arFields['RRULE']['BYDAY']);
foreach ($bydays as $day)
{
$day = mb_strtoupper($day);
if (in_array($day, $days, true))
{
$BYDAY[] = $day;
}
}
}
$arFields['RRULE']['BYDAY'] = implode(',', $BYDAY);
}
if (isset($arFields["EXDATE"]))
{
$excludeDates = self::GetExDate($arFields["EXDATE"]);
}
else
{
$excludeDates = self::GetExDate($currentExDate);
}
if (!empty($excludeDates) && $untilTs)
{
$arFields["EXDATE"] = self::SetExDate($excludeDates, $untilTs);
}
$arFields['RRULE'] = self::PackRRule($arFields['RRULE']);
}
else
{
$arFields['RRULE'] = '';
$arFields['EXDATE'] = '';
}
}