• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskitem.php
  • Класс: CTaskItem
  • Вызов: CTaskItem::fetchListArray
static function fetchListArray($userId, $arOrder, $arFilter, $arParams = array(), $arSelect = array(), array $arGroup = array())
{
	$arItemsData = array();
	$rsData = null;

	try
	{
		$arParamsOut = array(
			'USER_ID' => $userId,
			'bIgnoreErrors' => true,		// don't die on SQL errors
			'PERMISSION_CHECK_VERSION' => 2, // new sql code to check permissions
		);

		if (array_key_exists('TARGET_USER_ID', $arParams))
		{
			$arParamsOut['TARGET_USER_ID'] = $arParams['TARGET_USER_ID'];
		}
		if (isset($arParams['SORTING_GROUP_ID']))
		{
			$arParamsOut['SORTING_GROUP_ID'] = $arParams['SORTING_GROUP_ID'];
		}
		if (isset($arParams['MAKE_ACCESS_FILTER']))
		{
			$arParamsOut['MAKE_ACCESS_FILTER'] = $arParams['MAKE_ACCESS_FILTER'];
		}

		if (isset($arParams['nPageTop']))
		{
			$arParamsOut['nPageTop'] = $arParams['nPageTop'];
		}
		elseif (isset($arParams['NAV_PARAMS']))
		{
			$arParamsOut['NAV_PARAMS'] = $arParams['NAV_PARAMS'];
		}

		$arParamsOut['DISTINCT'] = $arParams['DISTINCT'] ?? false;

		$arFilter['CHECK_PERMISSIONS'] = 'Y';	// Always check permissions

		if ( ! empty($arSelect) && (!isset($arParams['USE_MINIMAL_SELECT_LEGACY']) || $arParams['USE_MINIMAL_SELECT_LEGACY'] != 'N'))
		{
			$arSelect = array_merge(
				$arSelect,
				static::getMinimalSelectLegacy()
			);
		}

		$arTasksIDs  = array();
		$rsData = CTasks::getList($arOrder, $arFilter, $arSelect, $arParamsOut, $arGroup);

		if ( ! is_object($rsData) )
			throw new TasksException();

		while ($arData = $rsData->fetch())
		{
			$taskId = (int)$arData['ID'];
			$arTasksIDs[] = $taskId;

			if (in_array('AUDITORS', $arSelect) || in_array('*', $arSelect))
			{
				$arData['AUDITORS'] = [];
			}
			if (in_array('ACCOMPLICES', $arSelect) || in_array('*', $arSelect))
			{
				$arData['ACCOMPLICES'] = [];
			}

			if (array_key_exists('TITLE', $arData))
			{
				$arData['TITLE'] = BitrixMainTextEmoji::decode($arData['TITLE']);
			}
			if (array_key_exists('DESCRIPTION', $arData) && $arData['DESCRIPTION'] !== '')
			{
				$arData['DESCRIPTION'] = BitrixMainTextEmoji::decode($arData['DESCRIPTION']);
			}

			$arItemsData[$taskId]  = $arData;
		}

		if(is_array($arTasksIDs) && !empty($arTasksIDs))
		{
			if (in_array('NEW_COMMENTS_COUNT', $arSelect, true))
			{
				$newComments = BitrixTasksInternalsCounter::getInstance((int)$userId)->getCommentsCount($arTasksIDs);
				foreach ($newComments as $taskId => $commentsCount)
				{
					$arItemsData[$taskId]['NEW_COMMENTS_COUNT'] = $commentsCount;
				}
			}
			if(in_array('AUDITORS', $arSelect) || in_array('ACCOMPLICES', $arSelect) || in_array('*', $arSelect))
			{
				// fill ACCOMPLICES and AUDITORS
				$rsMembers = CTaskMembers::GetList(array(), array('TASK_ID' => $arTasksIDs));

				if (!is_object($rsMembers))
					throw new TasksException();

				while ($arMember = $rsMembers->fetch())
				{
					$taskId = (int)$arMember['TASK_ID'];

					if (in_array($taskId, $arTasksIDs, true))
					{
						if ($arMember['TYPE'] === 'A' && (in_array('ACCOMPLICES', $arSelect) || in_array('*', $arSelect)) )
							$arItemsData[$taskId]['ACCOMPLICES'][] = $arMember['USER_ID'];
						elseif ($arMember['TYPE'] === 'U' && (in_array('AUDITORS', $arSelect) || in_array('*', $arSelect)) )
							$arItemsData[$taskId]['AUDITORS'][] = $arMember['USER_ID'];
					}
				}
			}

			// fill tags
			if (isset($arParams['LOAD_TAGS']) && $arParams['LOAD_TAGS'])
			{
				foreach ($arTasksIDs as $taskId)
					$arItemsData[$taskId]['TAGS'] = array();

				$rsTags = CTaskTags::getList(array(), array('TASK_ID' => $arTasksIDs));

				if ( ! is_object($rsTags) )
					throw new TasksException();

				while ($arTag = $rsTags->fetch())
				{
					$taskId = (int) $arTag['TASK_ID'];

					if (in_array($taskId, $arTasksIDs, true))
						$arItemsData[$taskId]['TAGS'][] = $arTag['NAME'];
				}
			}

			// fill parameters
			if (isset($arParams['LOAD_PARAMETERS']))
			{
				$res = BitrixTasksInternalsTaskParameterTable::getList(array('filter' => array(
					'TASK_ID' => $arTasksIDs
				)));
				while($paramItem = $res->fetch())
				{
					$arItemsData[$paramItem['TASK_ID']]['SE_PARAMETER'][] = $paramItem;
				}
			}
		}
	}
	catch (Exception $e)
	{
		$message = '[0xa819f6f1] probably SQL error at ' . $e->getFile() . ':' . $e->getLine() . '. ' . $e->getMessage();
		CTaskAssert::logError($message);
		throw new TasksException(
			$e->getMessage(),
			TasksException::TE_SQL_ERROR
			| TasksException::TE_ACTION_FAILED_TO_BE_PROCESSED
		);
	}

	return array($arItemsData, $rsData);
}