• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/event_calendar.php
  • Класс: CEventCalendar
  • Вызов: CEventCalendar::GetEvents
public function GetEvents($arParams = array())
{
	$DontSaveOptions = isset($arParams['DontSaveOptions']) ? $arParams['DontSaveOptions'] : false;
	$iblockId = isset($arParams['iblockId']) ? $arParams['iblockId'] : $this->iblockId;
	$SECTION_ID = isset($arParams['sectionId']) ? $arParams['sectionId'] : 0;
	$EVENT_ID = isset($arParams['eventId']) ? $arParams['eventId'] : false;
	$bLoadAll = isset($arParams['bLoadAll']) ? $arParams['bLoadAll'] : false;
	$arCalendarIds = isset($arParams['arCalendarIds']) ? $arParams['arCalendarIds'] : $this->arCalendarIds;
	$bJS = isset($arParams['bJS']) ? $arParams['bJS'] : false;
	$forExport = isset($arParams['forExport']) ? $arParams['forExport'] : false;
	$from_limit = isset($arParams['fromLimit']) ? $arParams['fromLimit'] : $this->fromLimit;
	$to_limit = isset($arParams['toLimit']) ? $arParams['toLimit'] : $this->toLimit;
	$checkPermissions = $forExport ? 'N' : 'Y';
	$bSuperposed = isset($arParams['bSuperposed']) ? $arParams['bSuperposed'] : false;
	$bCheckSPEvents = isset($arParams['bCheckSPEvents']) ? $arParams['bCheckSPEvents'] : false;
	$timestampFrom = isset($arParams['timestampFrom']) ? $arParams['timestampFrom'] : false;
	$ownerType = isset($arParams['ownerType']) ? $arParams['ownerType'] : $this->ownerType;
	$emptyRes = $bJS ? '[]' : Array();

	if ($bCheckSPEvents)
	{
		$arCalendars = $this->GetCalendarsEx(); // Cache inside
		$arCalInd = array();
		$arSPCalInd = array();
		for($i = 0, $l = count($arCalendars); $i < $l; $i++)
			$arCalInd[$arCalendars[$i]['ID']] = true;
		$this->HandleSuperpose($this->arSPIblIds);
		for($i = 0, $l = count($this->arSPCalShow); $i < $l; $i++)
			if (!$arCalInd[$this->arSPCalShow[$i]['ID']])
				$arSPCalInd[$this->arSPCalShow[$i]['ID']] = true;
	}

	$this->CheckProperties($iblockId);

	$RESULT = $bJS ? '' : array();
	//SELECT
	$arSelect = array(
		"ID",
		"IBLOCK_ID",
		"IBLOCK_SECTION_ID",
		"NAME",
		"ACTIVE_FROM",
		"ACTIVE_TO",
		"DETAIL_TEXT",
		"DETAIL_TEXT_TYPE",
		"TIMESTAMP_X",
		"DATE_CREATE",
		"CREATED_BY",
		"PROPERTY_*",
	);
	//WHERE
	$arFilter = array (
		"IBLOCK_ID" => $iblockId,
		"ACTIVE" => "Y",
		"CHECK_PERMISSIONS" => $checkPermissions,
		"!=PROPERTY_CONFIRMED" => $this->GetConfirmedID($iblockId, "N"),
	);

	if ($EVENT_ID !== false)
		$arFilter['ID'] = $EVENT_ID;

	if($timestampFrom !== false)
		$arFilter[">TIMESTAMP_X"] = $timestampFrom;

	if(isset($arParams['CREATED_BY']))
		$arFilter["CREATED_BY"] = $arParams['CREATED_BY'];

	if(isset($arParams['bNotFree']) && $arParams['bNotFree'])
		$arFilter["!=PROPERTY_ACCESSIBILITY"] = 'free';

	if ($SECTION_ID !== false)
	{
		$arFilter["INCLUDE_SUBSECTIONS"] = "Y";
		if ($arCalendarIds !== false && is_array($arCalendarIds))
		{
			if (!$DontSaveOptions && class_exists('CUserOptions'))
				$this->SaveHidden($arCalendarIds);

			if (count($arCalendarIds) == 0)
				return $emptyRes;
			$arFilter["SECTION_ID"] = $arCalendarIds;
		}
		else
		{
			$arFilter["SECTION_ID"] = $SECTION_ID;
		}
	}

	if (!$bLoadAll)
	{
		$arFilter[">=DATE_ACTIVE_TO"] = $from_limit;
		$arFilter["<=DATE_ACTIVE_FROM"] = $to_limit;
	}

	//Sort
	$arSort = Array('ACTIVE_FROM' => 'ASC');
	$r = CIBlockElement::GetList($arSort, $arFilter, false, false, $arSelect);
	while($obElement = $r->GetNextElement())
	{
		$arItem = $obElement->GetFields();
		if (isset($this->arCalenderIndex[$arItem['IBLOCK_SECTION_ID']]))
			$privateStatus = $this->arCalenderIndex[$arItem['IBLOCK_SECTION_ID']]['PRIVATE_STATUS'];
		else
			$privateStatus = CECCalendar::GetPrivateStatus($iblockId, $arItem['IBLOCK_SECTION_ID'], $ownerType);

		$bCurUserOwner = $arItem["CREATED_BY"] == $this->userId;
		if ($privateStatus == 'private' && !$bCurUserOwner) // event in private calendar
			continue;

		$props = $obElement->GetProperties();
		$arItem["REMIND"] = (isset($props['REMIND_SETTINGS']['VALUE'])) ? $props['REMIND_SETTINGS']['VALUE'] : '';
		$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'] : '';
		$arItem["VERSION"] = (isset($props['VERSION']['VALUE'])) ? $props['VERSION']['VALUE'] : 1;
		$arItem['IS_MEETING'] = $props['IS_MEETING']['VALUE'] == 'Y';
		$arItem['LOCATION'] = (isset($props['LOCATION']['VALUE'])) ? $props['LOCATION']['VALUE'] : '';

		if ($arItem["PRIVATE"] && !$bCurUserOwner) // private event
			continue;

		$arItem["DISPLAY_ACTIVE_FROM"] = CIBlockFormatProperties::DateFormat(getDateFormat(true), MakeTimeStamp($arItem["ACTIVE_FROM"]));
		$arItem["DISPLAY_ACTIVE_TO"] = CIBlockFormatProperties::DateFormat(getDateFormat(true), MakeTimeStamp($arItem["ACTIVE_TO"]));

		$per_type = (isset($props['PERIOD_TYPE']['VALUE']) && $props['PERIOD_TYPE']['VALUE'] != 'NONE')? mb_strtoupper($props['PERIOD_TYPE']['VALUE']) : false;

		if ($this->bSocNet) // Social net: check meeting
		{
			// Check if it's "child" event in the guest's calendar
			$parentId = $arItem['ID'];
			if (isset($props['PARENT']) && $props['PARENT']['VALUE'] > 0)
			{
				$parentId = $props['PARENT']['VALUE'];
				$rsHost = CIBlockElement::GetList(array(), array(
						"=ID" => $parentId,
					), false, false, array(
						"ID",
						"IBLOCK_ID",
						"CREATED_BY",
					)
				);
				$arHost = $rsHost->Fetch();
				if($arHost)
				{
					$rsHostUser = CUser::GetByID($arHost["CREATED_BY"]);
					if($arHostUser = $rsHostUser->Fetch())
					{
						$name = trim($arHostUser['NAME'].' '.$arHostUser['LAST_NAME']);
						if ($name == '')
							$name = trim($User['LOGIN']);
						$arItem['HOST'] = array('id' => $arHostUser['ID'], 'name' => $name);
						$arItem['HOST'] = array('id' => $arHostUser['ID'], 'name' => $name, 'parentId' => $parentId);
					}
				}
				$status = mb_strtoupper(isset($props['CONFIRMED'])? $props['CONFIRMED']['VALUE_XML_ID'] : 'Q');
				if ($status != 'Y' && $status != 'N')
					$status = 'Q';
				$arItem['STATUS'] = $status;
			}
			else
			{
				$arItem['HOST'] = false;
				$arItem['STATUS'] = false;
			}

			if ($arItem['IS_MEETING'])
			{
				$arGuests = array();
				$R = CECEvent::GetGuests($this->userIblockId, $parentId, array('bCheckOwner' => true, 'ownerType' => $ownerType, 'bHostIsAbsent' => $props['HOST_IS_ABSENT']['VALUE'] == 'Y')); // Get guests

				foreach($R as $guest_id => $arGuest)
				{
					$guest_id = intval($guest_id);
					$User = $arGuest['CREATED_BY'];
					$name = trim($User['NAME'].' '.$User['LAST_NAME']);
					if ($name == '')
						$name = trim($User['LOGIN']);

					$arGuests[] = array(
						'id' => $guest_id,
						'name' => $name,
						'status' => $arGuest['PROPERTY_VALUES']['CONFIRMED'],
						'bHost' => $arGuest['IS_HOST'] === true
					);
				}
				$arItem['GUESTS'] = $arGuests;

				$arItem['MEETING_TEXT'] = $props['MEETING_TEXT']['VALUE']['TEXT'];
			}
		}

		if ($bCheckSPEvents)
			$bSuperposed = $arSPCalInd[$arItem['IBLOCK_SECTION_ID']];

		if ((!$this->bCurUserOwner || $bSuperposed) && ($privateStatus == 'time' || $privateStatus == 'title'))
		{
			if (!$arItem['ACCESSIBILITY'])
				$arItem['ACCESSIBILITY'] = 'busy';
			$accessibilityMess = GetMessage('EC_ACCESSIBILITY_'.mb_strtoupper($arItem['ACCESSIBILITY']));
			if ($privateStatus == 'time')
			{
				$arItem['~NAME'] = $arItem['NAME'] = $accessibilityMess;
				$arItem['ACCESSIBILITY'] = '';
			}
			$arItem['DETAIL_TEXT'] = '';
			$arItem['REMIND'] = '';
			$arItem['PRIVATE'] = '';
			$arItem['GUESTS'] = Array();
		}

		if ($per_type)
		{
			$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'] : '';
			if ($forExport) // only for export
			{
				$this->HandleElement($RESULT, $arItem, array('TYPE' => $per_type, 'COUNT' => intval($count), 'LENGTH' => intval($length), 'DAYS' => $additional), $bJS, $bSuperposed);
			}
			else
			{
				$this->DisplayPeriodicEvent($RESULT, array(
					'arItem' => $arItem,
					'perType' => $per_type,
					'count' => $count,
					'length' => $length,
					'additional' => $additional,
					'fromLimit' => $from_limit,
					'toLimit' => $to_limit,
					'bJS' => $bJS,
					'bSuperposed' => $bSuperposed
				));
			}
		}
		else
		{
			$this->HandleElement($RESULT, $arItem, false, $bJS, $bSuperposed);
		}
	}

	if (!$bJS)
		return $RESULT;
	if ($RESULT == '')
		return $emptyRes;

	return '['.mb_substr($RESULT, 0, -1).']';
}