• Модуль: calendar
  • Путь к файлу: ~/bitrix/modules/calendar/classes/general/calendar_sect.php
  • Класс: CCalendarSect
  • Вызов: CCalendarSect::getListOrm
static function getListOrm($params)
{
	$sectionFields = self::getSectionFields();
	$filterFields = $params['arFilter'] ?? [];
	$orderFields = $params['arOrder'] ?? [];
	$selectFields = $params['arSelect'] ?? ['*'];

	$query = SectionTable::query();
	$queryFilter = null;

	if (!empty($filterFields) && is_array($filterFields))
	{
		$queryFilter = BitrixMainORMQueryQuery::filter();
		foreach ($filterFields as $key => $value)
		{
			if (is_string($value) && !$value)
			{
				continue;
			}

			switch ($key)
			{
				case 'ID':
				case 'XML_ID':
				case 'OWNER_ID':
				case 'EXTERNAL_TYPE':
					if (is_array($value))
					{
						$queryFilter->whereIn($key, $value);
					}
					else
					{
						$queryFilter->where($key, $value);
					}
					break;
				case '>ID':
					if ((int)$value)
					{
						$queryFilter->where('ID', '>', (int)$value);
					}
					break;
				case 'ACTIVE':
					if ($value === 'Y')
					{
						$queryFilter->where('ACTIVE', $value);
					}
					break;
				case 'CAL_TYPE':
					if (is_array($value))
					{
						$params['joinTypeInfo'] = true;

						$queryFilter
							->where('TYPE.ACTIVE', 'Y')
							->whereIn('CAL_TYPE', $value);
					}
					else
					{
						$queryFilter->where('CAL_TYPE', $value);
					}
					break;
				default:
					if (in_array($key, $sectionFields, true))
					{
						$queryFilter->where($key, $value);
					}
					break;
			}

		}
	}

	if (!empty($filterFields['ADDITIONAL_IDS']) && is_array($filterFields['ADDITIONAL_IDS']))
	{
		if ($queryFilter)
		{
			$query->where(
				BitrixMainORMQueryQuery::filter()
					->logic('or')
					->whereIn('ID', $filterFields['ADDITIONAL_IDS'])
					->where($queryFilter)
			);
		}
		else
		{
			$query->whereIn('ID', $filterFields['ADDITIONAL_IDS']);
		}
	}
	else if ($queryFilter)
	{
		$query->where($queryFilter);
	}

	if ($params['joinTypeInfo'])
	{
		$query->registerRuntimeField(
			'TYPE',
			new BitrixMainEntityReferenceField(
				'TYPE',
				BitrixCalendarInternalsTypeTable::getEntity(),
				BitrixMainORMQueryJoin::on('ref.XML_ID', 'this.CAL_TYPE'),
				['join_type' => BitrixMainORMQueryJoin::TYPE_INNER]

			)
		);

		$selectFields['TYPE_NAME'] = 'TYPE.NAME';
		$selectFields['TYPE_DESC'] = 'TYPE.DESCRIPTION';
	}

	$query->setSelect($selectFields);

	$orderList = [];
	foreach ($orderFields as $key => $order)
	{
		if (in_array($key, $sectionFields, true))
		{
			$orderList[$key] = (mb_strtoupper($order) === 'DESC') ? 'DESC' : 'ASC';
		}
	}

	if (!empty($orderList))
	{
		$query->setOrder($orderList);
	}

	if (isset($params['limit']) && (int)$params['limit'] > 0)
	{
		$query->setLimit((int)$params['limit']);
	}

	$sectionQuery = $query->exec();

	[$sectionIdList, $result] = self::prepareSectionQueryData($sectionQuery);

	if ($params['getPermissions'])
	{
		$result = self::getSectionAccess($sectionIdList, $result);
	}

	return $result;
}