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