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