• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/event_calendar.php
  • Класс: CEventCalendar
  • Вызов: CEventCalendar::GetNearestEventsList
static function GetNearestEventsList($arParams)
{
	if (!isset($arParams['userId']))
	{
		global $USER;
		// Get current user id
		$curUserId = $USER->IsAuthorized() ? $USER->GetID() : 0;
	}
	else
	{
		$curUserId = intval($arParams['userId']);
	}

	if ($arParams['bCurUserList'])
	{
		if ($curUserId <= 0 || (class_exists('CSocNetFeatures') && !CSocNetFeatures::IsActiveFeature(SONET_ENTITY_USER, $curUserId, "calendar")))
			return 'inactive_feature';

		// Get iblock id for users calendar from module-settings
		$iblockId = COption::GetOptionInt("intranet", 'iblock_calendar');
		// Get section id
		$sectionId = CEventCalendar::GetSectionIDByOwnerId($curUserId, "USER", $iblockId);
		// Expand filter
		$arFilterEx = array("CREATED_BY" => $curUserId, "SECTION_ID" => $sectionId, "INCLUDE_SUBSECTIONS" => "Y");
	}
	else
	{
		if (intval($arParams['iblockSectionId']) > 0)
			$arFilterEx = array("SECTION_ID" => $arParams['iblockSectionId'], "INCLUDE_SUBSECTIONS" => "Y");
		$iblockId = $arParams['iblockId'];
	}

	// Check access
	$maxPerm = CIBlock::GetPermission($iblockId);
	$bAccess = $maxPerm >= 'R';
	if (CIBlock::GetPermission($iblockId) < 'R')
		return 'access_denied';

	$arSelect = array(
		"ID",
		"IBLOCK_ID",
		"IBLOCK_SECTION_ID",
		"NAME",
		"ACTIVE_FROM",
		"ACTIVE_TO",
		"DETAIL_TEXT",
		"DETAIL_TEXT_TYPE",
		"CREATED_BY",
		"PROPERTY_*",
	);

	$arFilter = array (
		"IBLOCK_ID" => $iblockId,
		"ACTIVE" => "Y",
		"CHECK_PERMISSIONS" => 'N',
		">=DATE_ACTIVE_TO" => $arParams['fromLimit'],
		"<=DATE_ACTIVE_FROM" => $arParams['toLimit'],
	);

	if (!empty($arFilterEx))
	{
		$arFilter = array_merge($arFilter, $arFilterEx);
	}

	$bCache = true;
	$arResult = false;
	if ($bCache)
	{
		$cache = new CPHPCache;
		$cachePath = 'event_calendar/events/'.$iblockId.'/';
		$cacheId = 'ne_'.serialize($arFilter);
		if(($tzOffset = CTimeZone::GetOffset()) <> 0)
			$cacheId .= "_".$tzOffset;
		$cacheTime = 36000000;

		if ($cache->InitCache($cacheTime, $cacheId, $cachePath))
		{
			$res = $cache->GetVars();
			$arResult = $res['events'];
		}
	}

	if (!$bCache || $arResult === false)
	{
		$arSort = Array('ACTIVE_FROM' => 'ASC');
		$rsElement = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect);
		$arResult = array();

		while($obElement = $rsElement->GetNextElement())
		{
			$arItem = $obElement->GetFields();
			$props = $obElement->GetProperties();
			$arItem["ACCESSIBILITY"] = (isset($props['ACCESSIBILITY']['VALUE'])) ? $props['ACCESSIBILITY']['VALUE'] : 'busy';
			$arItem["IMPORTANCE"] = (isset($props['IMPORTANCE']['VALUE'])) ? $props['IMPORTANCE']['VALUE'] : '';
			$arItem["PRIVATE"] = (isset($props['PRIVATE']['VALUE'])) ? $props['PRIVATE']['VALUE'] : '';

			if (isset($props['PARENT']) && $props['PARENT']['VALUE'] > 0)
			{
				$status = mb_strtoupper(isset($props['CONFIRMED'])? $props['CONFIRMED']['VALUE_XML_ID'] : 'Q');
				if ($status != 'Y' && $status != 'N')
					$status = 'Q';
				$arItem['STATUS'] = $status;
			}

			$arItem["DISPLAY_ACTIVE_FROM"] = CIBlockFormatProperties::DateFormat(getDateFormat(true), MakeTimeStamp($arItem["ACTIVE_FROM"]));
			$arItem["DISPLAY_ACTIVE_TO"] = CIBlockFormatProperties::DateFormat(getDateFormat(true), MakeTimeStamp($arItem["ACTIVE_TO"]));
			$perType = (isset($props['PERIOD_TYPE']['VALUE']) && $props['PERIOD_TYPE']['VALUE'] != 'NONE')? mb_strtoupper($props['PERIOD_TYPE']['VALUE']) : false;

			if ($perType)
			{
				$count = (isset($props['PERIOD_COUNT']['VALUE'])) ? intval($props['PERIOD_COUNT']['VALUE']) : '';
				$length = (isset($props['EVENT_LENGTH']['VALUE'])) ? intval($props['EVENT_LENGTH']['VALUE']) : '';
				$additional = (isset($props['PERIOD_ADDITIONAL']['VALUE'])) ? $props['PERIOD_ADDITIONAL']['VALUE'] : '';

				CEventCalendar::DisplayPeriodicEvent($arResult, array(
					'arItem' => $arItem,
					'perType' => $perType,
					'count' => $count,
					'length' => $length,
					'additional' => $additional,
					'fromLimit' => $arParams['fromLimit'],
					'toLimit' => $arParams['toLimit'],
				));
			}
			else
			{
				CEventCalendar::HandleElement($arResult, $arItem);
			}
		}

		if ($bCache)
		{
			$cache->StartDataCache($cacheTime, $cacheId, $cachePath);
			$cache->EndDataCache(array("events" => $arResult));
		}
	}

	return $arResult;
}