• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/provider/taskprovider.php
  • Класс: BitrixTasksProviderTaskProvider
  • Вызов: TaskProvider::getListOrm
private function getListOrm($arOrder = [], $arFilter = [], $arSelect = [], $arParams = [], array $arGroup = []): CDBResult
{
	$userFields = [];
	if (
		in_array('UF_*', $arSelect, true)
		|| in_array('*', $arSelect, true)
		|| !empty(preg_grep('/^UF_/', $arSelect))

	)
	{
		$userFields = TasksUFManager::getInstance()->getFields();
	}
	if (
		empty($arSelect)
		|| in_array('*', $arSelect)
	)
	{
		$this->makeArFields();
		$arSelect = array_diff(array_keys($this->arFields), ['MESSAGE_ID']);
	}
	if (!in_array('ID', $arSelect, true))
	{
		$arSelect[] = 'ID';
	}

	$arSelect = array_merge($arSelect, $userFields);

	$query = new TaskQuery($this->executorId);
	$query
		->setBehalfUser($this->userId)
		->setSelect($arSelect)
		->setOrder($arOrder)
		->setGroupBy($arGroup)
		->setWhere($arFilter)
		->setDistinct((bool)($arParams['DISTINCT'] ?? null))
	;

	if ($this->arParams['MAKE_ACCESS_FILTER'] ?? null)
	{
		$query->needMakeAccessFilter();
	}

	if (
		(isset($arParams['CHECK_PERMISSIONS']) && $arParams['CHECK_PERMISSIONS'] === 'N')
		|| (isset($arFilter['CHECK_PERMISSIONS']) && $arFilter['CHECK_PERMISSIONS'] === 'N')
	)
	{
		$query->skipAccessCheck();
	}

	if (
		isset($arParams['FILTER_PARAMS']['SEARCH_TASK_ONLY'])
		&& $arParams['FILTER_PARAMS']['SEARCH_TASK_ONLY'] = 'Y'
	)
	{
		$query->setParam('SEARCH_TASK_ONLY', true);
	}

	$nPlusOne = isset($arParams['NAV_PARAMS']['getPlusOne']) ? 1 : 0;
	$pageSize = isset($arParams['NAV_PARAMS']['nPageSize']) ? (int) $arParams['NAV_PARAMS']['nPageSize'] : 0;
	$page =
		(isset($arParams['NAV_PARAMS']['iNumPage']) && $arParams['NAV_PARAMS']['iNumPage'] > 0)
		? $arParams['NAV_PARAMS']['iNumPage']
		: 1;

	$navNum = null;
	$cnt = null;
	// this is a query for subtasks on the task view page
	if ($this->isLimitQuery())
	{
		global $NavNum;
		$navNum = (int)$NavNum;
		$pageName = 'PAGEN_' . ($navNum + 1);
		global ${$pageName};
		$page = ${$pageName};
		$page = $page > 0 ? (int)$page : (int)($this->arParams['NAV_PARAMS']['iNumPage'] ?? null);
		$page = $page > 0 ? $page : 1;
		$cnt = $this->getCountOrm($this->arFilter, $this->arParams, $this->arGroup)->Fetch()['CNT'];
		$pageSize = $this->arParams['NAV_PARAMS']['nPageSize'] ?? 0;
	}

	// this is a query with limit which used in BitrixTasksIntegrationUIEntitySelectorTaskProvider etc
	$nTopCount = (int)($this->arParams['NAV_PARAMS']['nTopCount'] ?? 0);
	if ($nTopCount > 0)
	{
		$query->setLimit($nTopCount + $nPlusOne);
	}
	else
	{
		$query->setLimit($pageSize + $nPlusOne);
		$query->setOffset(($page - 1) * $pageSize);
	}

	try
	{
		$list = new TaskList();
		$tasks = $list->getList($query);
		$dbResult = $list->getLastDbResult();
	}
	catch (Exception $e)
	{
		throw new TasksException($e->getMessage(), TasksException::TE_SQL_ERROR);
	}

	$tasks = $this->prepareOrmData($tasks);

	$result = new CDBResult($dbResult);
	$result->InitFromArray($tasks);
	$result->NavPageNomer = $page;
	$result->PAGEN = $page;
	$result->NavRecordCount = $cnt;
	$result->NavPageSize = $pageSize;
	$result->NavPageCount = ($pageSize > 0 && !is_null($cnt)) ? ceil($cnt / $pageSize) : null;
	$result->NavNum = is_null($navNum) ? null : $navNum + 1;

	return $result;
}