• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/classes/general/taskitem.php
  • Класс: CTaskItem
  • Вызов: CTaskItem::runRestMethod
static function runRestMethod($executiveUserId, $methodName, $args, $navigation)
{
	static $arManifest = null;
	static $arMethodsMetaInfo = null;

	$rsData = null;

	if ($arManifest === null)
	{
		$arManifest = self::getManifest();
		$arMethodsMetaInfo = $arManifest['REST: available methods'];
	}

	// Check and parse params
	CTaskAssert::assert(isset($arMethodsMetaInfo[$methodName]));
	$arMethodMetaInfo = $arMethodsMetaInfo[$methodName];
	$argsParsed = CTaskRestService::_parseRestParams('ctaskitem', $methodName, $args);

	$runAs = $methodName;
	if(isset($arMethodsMetaInfo[$methodName]['runAs']) && (string) $arMethodsMetaInfo[$methodName]['runAs'] != '')
	{
		$runAs = $arMethodsMetaInfo[$methodName]['runAs'];
	}

	$returnValue = null;
	if (isset($arMethodMetaInfo['staticMethod']) && $arMethodMetaInfo['staticMethod'])
	{
		if ($methodName === 'add')
		{
			$argsParsed[] = $executiveUserId;
			/** @var CTaskItem $oTaskItem */
			$oTaskItem    = call_user_func_array(array('self', $methodName), $argsParsed);
			$taskId       = (int) $oTaskItem->getId();
			$returnValue  = $taskId;
			self::cacheInstanceInPool($taskId, $executiveUserId, $oTaskItem);
		}
		elseif ($methodName === 'getlist' || $methodName === 'list') // todo: temporal fix
		{
			array_unshift($argsParsed, $executiveUserId);

			// we need to fill default values up to $arParams (4th) argument
			while (!array_key_exists(3, $argsParsed))
			{
				$argsParsed[] = [];
			}

			if ($navigation['iNumPage'] > 1)
			{
				$argsParsed[3]['NAV_PARAMS'] = [
					'nPageSize' => CTaskRestService::TASKS_LIMIT_PAGE_SIZE,
					'iNumPage' => (int)$navigation['iNumPage'],
				];
			}
			else if (isset($argsParsed[3]['NAV_PARAMS']))
			{
				if (isset($argsParsed[3]['NAV_PARAMS']['nPageTop']))
				{
					$argsParsed[3]['NAV_PARAMS']['nPageTop'] = min(
						CTaskRestService::TASKS_LIMIT_TOP_COUNT,
						(int)$argsParsed[3]['NAV_PARAMS']['nPageTop']
					);
				}
				if (isset($argsParsed[3]['NAV_PARAMS']['nPageSize']))
				{
					$argsParsed[3]['NAV_PARAMS']['nPageSize'] = min(
						CTaskRestService::TASKS_LIMIT_PAGE_SIZE,
						(int)$argsParsed[3]['NAV_PARAMS']['nPageSize']
					);
				}
				if (
					!isset($argsParsed[3]['NAV_PARAMS']['nPageTop'])
					&& !isset($argsParsed[3]['NAV_PARAMS']['nPageSize'])
				)
				{
					$argsParsed[3]['NAV_PARAMS'] = [
						'nPageSize' => CTaskRestService::TASKS_LIMIT_PAGE_SIZE,
						'iNumPage' => 1,
					];
				}
			}
			else
			{
				$argsParsed[3]['NAV_PARAMS'] = [
					'nPageSize' => CTaskRestService::TASKS_LIMIT_PAGE_SIZE,
					'iNumPage' => 1,
				];
			}
			$argsParsed[3]['NAV_PARAMS']['getTotalCount'] = true;

			$filter = $argsParsed[2];
			$allowedParentIdNullValues = ['0', 'NULL', 'null'];

			if (array_key_exists('PARENT_ID', $filter) && in_array($filter['PARENT_ID'], $allowedParentIdNullValues))
			{
				$argsParsed[2]['PARENT_ID'] = false;
			}

			/** @var CTaskItem[] $oTaskItems */
			/** @noinspection PhpUnusedLocalVariableInspection */
			[$oTaskItems, $rsData] = call_user_func_array(array('self', 'fetchList'), $argsParsed);

			$returnValue = array();

			foreach ($oTaskItems as $oTaskItem)
			{
				$arTaskData = $oTaskItem->getData(false);
				$arTaskData['ALLOWED_ACTIONS'] = $oTaskItem->getAllowedActionsAsStrings();

				if (isset($argsParsed[3]))
				{
					if (isset($argsParsed[3]['LOAD_TAGS']) && ($argsParsed[3]['LOAD_TAGS'] == 1 || $argsParsed[3]['LOAD_TAGS'] == 'Y'))
					{
						$arTaskData['TAGS'] = $oTaskItem->getTags();
					}
				}

				$returnValue[] = $arTaskData;
			}
		}
		else
		{
			$returnValue = call_user_func_array(array('self', $runAs), $argsParsed);
		}
	}
	else
	{
		$taskId = array_shift($argsParsed);

		if($runAs == 'isactionallowed') // modify isactionallowed() behaviour
		{
			$actionId = $argsParsed[0];
			if(intval($argsParsed[1]))
			{
				$executiveUserId = intval($argsParsed[1]);
			}

			$oTask  = self::getInstanceFromPool($taskId, $executiveUserId);

			if($actionId == self::ACTION_READ)
			{
				$returnValue = true;
				try
				{
					$oTask->getData(false);
				}
				catch(Exception $e)
				{
					$returnValue = false;
				}
			}
			else
			{
				$returnValue = call_user_func_array(array($oTask, $runAs), array($actionId));
			}
		}
		else
		{
			$oTask  = self::getInstanceFromPool($taskId, $executiveUserId);
			$returnValue = call_user_func_array(array($oTask, $runAs), $argsParsed);
		}
	}

	return (array($returnValue, $rsData));
}