- Модуль: calendar
- Путь к файлу: ~/bitrix/modules/calendar/lib/core/event/tools/recurrence.php
- Класс: BitrixCalendarCoreEventToolsRecurrence
- Вызов: Recurrence::getEventOccurenceDates
public function getEventOccurenceDates(Event $event, array $params = []): array
{
$limits = $this->prepareLimits($event, $params);
$result = [];
$counter = 0;
$pushToResult = function (DateTime $date) use (&$result, &$counter)
{
$result[$date->format('d.m.Y')] = $date;
$counter++;
};
$start = clone $event->getStart();
$start->resetTime();
$date = $this->convertBitrixDateToPhpDate($start);
while ($this->isDateWithinLimits($date, $limits, $counter))
{
if ($event->getRecurringRule()->getFrequency() === self::PERIOD_TYPES['WEEKLY'])
{
if (empty($started))
{
$started = true;
// return array like [0, 2, 5] for sunday, tuesday, friday
$weekDays = $weekDays ?? $this->prepareWeekDays($event->getRecurringRule()->getByday());
$weekDay = (int)$date->format('w');
if (!in_array($weekDay, $weekDays))
{
$this->moveToNextWeekDay($date, $weekDays);
}
}
else
{
$pushToResult(clone $date);
$this->moveToNextWeekDay($date, $weekDays);
}
}
else
{
$pushToResult(clone $date);
$unit = self::UNIT_MAP[$event->getRecurringRule()->getFrequency()] ?? null;
if ($unit === null)
{
throw new BaseException(
"Unsupported frequency type: " . $event->getRecurringRule()->getFrequency(),
406,
__FILE__,
__LINE__
);
}
$date->modify('+' . $event->getRecurringRule()->getInterval() . ' ' . $unit);
}
}
$this->removeExcludedDates($event, $result);
return $result;
}