• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/event_calendar.php
  • Класс: CEventCalendar
  • Вызов: CEventCalendar::DisplayPeriodicEvent
static function DisplayPeriodicEvent(&$res, $arParams)
{
	$length = intval($arParams['length']);// length in seconds
	$count = $arParams['count'];
	$f_limit_ts = MakeTimeStamp($arParams['fromLimit'], getTSFormat());
	$t_limit_ts = MakeTimeStamp($arParams['toLimit'], getTSFormat());
	$f_real_ts = MakeTimeStamp($arParams['arItem']['DISPLAY_ACTIVE_FROM'], getTSFormat());
	$t_real_ts = MakeTimeStamp($arParams['arItem']['DISPLAY_ACTIVE_TO'], getTSFormat());
	if ($count <= 0)
		$count = 1;

	if ($f_limit_ts < $f_real_ts)
		$f_limit_ts = $f_real_ts;
	if ($t_limit_ts > $t_real_ts)
		$t_limit_ts = $t_real_ts;

	$from_ts = $f_real_ts;
	$to_ts = $f_real_ts;

	$arDays = array();
	if ($arParams['perType'] == 'WEEKLY')
	{
		$arDays_ = explode(',', $arParams['additional']);
		$arDaysCount = count($arDays_);
		for ($i = 0; $i < $arDaysCount; $i++)
			if ($arDays_[$i] != "")
				$arDays[$arDays_[$i]] = true;
		$arParams['arDays'] = $arDays;
	}

	while($to_ts < $t_limit_ts)
	{
		$f_time_h = date("H", $from_ts);
		$f_time_m = date("i", $from_ts);
		$f_time_s = date("s", $from_ts);
		$f_d = date("d", $from_ts);
		$f_m = date("m", $from_ts);
		$f_y = date("Y", $from_ts);

		if ($arParams['perType'] == 'WEEKLY')
		{
			$f_day = convertDayInd(date("w", $from_ts));
			if ($arDays[$f_day] || count($arDays) == 0)
			{
				$to_ts = mktime($f_time_h, $f_time_m, $f_time_s + $length, $f_m, $f_d, $f_y);
				if ($from_ts <= $t_limit_ts && $to_ts >= $f_limit_ts)
					CEventCalendar::HandlePeriodicElement($res, array_merge($arParams, array('dateFrom' => date(getDateFormat(), $from_ts), 'dateTo' => date(getDateFormat(), $to_ts))));
				elseif($from_ts > $f_limit_ts)
					break;
			}

			if ($f_day == 6)
				$delta = ($count - 1) * 7 + 1;
			else
				$delta = 1;
			$from_ts = mktime($f_time_h, $f_time_m, $f_time_s, $f_m, $f_d + $delta, $f_y);
		}
		else // DAILY, MONTHLY, YEARLY
		{
			$to_ts = mktime($f_time_h, $f_time_m, $f_time_s + $length, $f_m, $f_d, $f_y);
			if ($from_ts <= $t_limit_ts && $to_ts >= $f_limit_ts)
				CEventCalendar::HandlePeriodicElement($res, array_merge($arParams, array('dateFrom' => date(getDateFormat(), $from_ts), 'dateTo' => date(getDateFormat(), $to_ts))));
			elseif($from_ts > $f_limit_ts)
				break;

			switch ($arParams['perType'])
			{
				case 'DAILY':
					$from_ts = mktime($f_time_h, $f_time_m, $f_time_s, $f_m, $f_d + $count, $f_y);
					break;
				case 'MONTHLY':
					$from_ts = mktime($f_time_h, $f_time_m, $f_time_s, $f_m + $count, $f_d, $f_y);
					break;
				case 'YEARLY':
					$from_ts = mktime($f_time_h, $f_time_m, $f_time_s, $f_m, $f_d, $f_y + $count);
					break;
			}
		}
	}
}