- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_event.php
- Класс: CCalendarEvent
- Вызов: CCalendarEvent::ParseRRULE
static function ParseRRULE($rule = null)
{
$res = [];
if (!$rule)
{
return $res;
}
if (is_array($rule))
{
return isset($rule['FREQ'])
? $rule
: $res;
}
$arRule = explode(";", $rule);
if (!is_array($arRule))
{
return $res;
}
foreach($arRule as $par)
{
$arPar = explode("=", $par);
if (!empty($arPar[0]))
{
switch($arPar[0])
{
case 'FREQ':
if (in_array($arPar[1], ['DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY']))
{
$res['FREQ'] = $arPar[1];
}
break;
case 'COUNT':
case 'INTERVAL':
if ((int)$arPar[1] > 0)
{
$res[$arPar[0]] = (int)$arPar[1];
}
break;
case 'UNTIL':
if (
CCalendar::DFormat(false) !== ExcludedDatesCollection::EXCLUDED_DATE_FORMAT
&& $arPar[1][2] === '.'
&& $arPar[1][5] === '.'
)
{
$arPar[1] = self::convertDateToCulture($arPar[1]);
}
$res['UNTIL'] = CCalendar::Timestamp($arPar[1])
? $arPar[1]
: CCalendar::Date((int)$arPar[1], false, false)
;
break;
case 'BYDAY':
$res[$arPar[0]] = [];
foreach(explode(',', $arPar[1]) as $day)
{
$matches = [];
if (preg_match('/((-|+)?d+)?(MO|TU|WE|TH|FR|SA|SU)/', $day, $matches))
{
$res[$arPar[0]][$matches[3]] =
$matches[1] === ''
? $matches[3]
: $matches[1];
}
}
if (empty($res[$arPar[0]]))
{
unset($res[$arPar[0]]);
}
break;
case 'BYMONTHDAY':
$res[$arPar[0]] = [];
foreach(explode(',', $arPar[1]) as $day)
{
if (abs($day) > 0 && abs($day) <= 31)
{
$res[$arPar[0]][(int)$day] = (int)$day;
}
}
if (empty($res[$arPar[0]]))
{
unset($res[$arPar[0]]);
}
break;
case 'BYYEARDAY':
case 'BYSETPOS':
$res[$arPar[0]] = [];
foreach(explode(',', $arPar[1]) as $day)
{
if (abs($day) > 0 && abs($day) <= 366)
{
$res[$arPar[0]][(int)$day] = (int)$day;
}
}
if (empty($res[$arPar[0]]))
{
unset($res[$arPar[0]]);
}
break;
case 'BYWEEKNO':
$res[$arPar[0]] = [];
foreach(explode(',', $arPar[1]) as $day)
{
if (abs($day) > 0 && abs($day) <= 53)
{
$res[$arPar[0]][(int)$day] = (int)$day;
}
}
if (empty($res[$arPar[0]]))
{
unset($res[$arPar[0]]);
}
break;
case 'BYMONTH':
$res[$arPar[0]] = [];
foreach(explode(',', $arPar[1]) as $m)
{
if ($m > 0 && $m <= 12)
{
$res[$arPar[0]][(int)$m] = (int)$m;
}
}
if (empty($res[$arPar[0]]))
{
unset($res[$arPar[0]]);
}
break;
}
}
}
if (
$res['FREQ'] === 'WEEKLY'
&& (
empty($res['BYDAY'])
|| !is_array($res['BYDAY'])
)
)
{
$res['BYDAY'] = ['MO' => 'MO'];
}
if ($res['FREQ'] !== 'WEEKLY' && isset($res['BYDAY']))
{
unset($res['BYDAY']);
}
$res['INTERVAL'] = (int)($res['INTERVAL'] ?? null);
if ($res['INTERVAL'] <= 1)
{
$res['INTERVAL'] = 1;
}
$res['~UNTIL'] = $res['UNTIL'] ?? null;
if (($res['UNTIL'] ?? null) === CCalendar::GetMaxDate())
{
$res['~UNTIL'] = '';
}
return $res;
}