• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/comp_findtools.php
  • Класс: CIBlockFindTools
  • Вызов: CIBlockFindTools::resolveComponentEngine
static function resolveComponentEngine(CComponentEngine $engine, $pageCandidates, &$arVariables)
{
	/** @global CMain $APPLICATION */
	global $APPLICATION, $CACHE_MANAGER;
	static $aSearch = array("<", ">", """, "'");
	static $aReplace = array("<", ">", """, "'");

	$component = $engine->getComponent();
	if ($component)
	{
		$iblock_id = (int)$component->arParams["IBLOCK_ID"];
		$strict_check = ($component->arParams["DETAIL_STRICT_SECTION_CHECK"] ?? '') === "Y";
	}
	else
	{
		$iblock_id = 0;
		$strict_check = false;
	}

	//To fix GetPagePath security hack for SMART_FILTER_PATH
	foreach ($pageCandidates as $pageID => $arVariablesTmp)
	{
		foreach ($arVariablesTmp as $variableName => $variableValue)
		{
			if ($variableName === "SMART_FILTER_PATH")
				$pageCandidates[$pageID][$variableName] = str_replace($aSearch, $aReplace, $variableValue);
		}
	}

	$requestURL = $APPLICATION->GetCurPage(true);

	$cacheId = $requestURL.implode("|", array_keys($pageCandidates))."|".SITE_ID."|".$iblock_id.$engine->cacheSalt;
	$cache = new CPHPCache;
	if ($cache->StartDataCache(3600, $cacheId, "iblock_find"))
	{
		if (defined("BX_COMP_MANAGED_CACHE"))
		{
			$CACHE_MANAGER->StartTagCache("iblock_find");
			CIBlock::registerWithTagCache($iblock_id);
		}

		foreach ($pageCandidates as $pageID => $arVariablesTmp)
		{
			if (
				(isset($arVariablesTmp["SECTION_CODE_PATH"]) && $arVariablesTmp["SECTION_CODE_PATH"] !== "")
				&& (isset($arVariablesTmp["ELEMENT_ID"]) || isset($arVariablesTmp["ELEMENT_CODE"]))
			)
			{
				if (CIBlockFindTools::checkElement($iblock_id, $arVariablesTmp, $strict_check))
				{
					$arVariables = $arVariablesTmp;
					if (defined("BX_COMP_MANAGED_CACHE"))
						$CACHE_MANAGER->EndTagCache();
					$cache->EndDataCache(array($pageID, $arVariablesTmp));
					return $pageID;
				}
			}
		}

		foreach ($pageCandidates as $pageID => $arVariablesTmp)
		{
			if (
				(isset($arVariablesTmp["SECTION_CODE_PATH"]) && $arVariablesTmp["SECTION_CODE_PATH"] !== "")
				&& (!isset($arVariablesTmp["ELEMENT_ID"]) && !isset($arVariablesTmp["ELEMENT_CODE"]))
			)
			{
				if (CIBlockFindTools::checkSection($iblock_id, $arVariablesTmp))
				{
					$arVariables = $arVariablesTmp;
					if (defined("BX_COMP_MANAGED_CACHE"))
						$CACHE_MANAGER->EndTagCache();
					$cache->EndDataCache(array($pageID, $arVariablesTmp));
					return $pageID;
				}
			}
		}

		if (defined("BX_COMP_MANAGED_CACHE"))
			$CACHE_MANAGER->AbortTagCache();
		$cache->AbortDataCache();
	}
	else
	{
		$vars = $cache->GetVars();
		$pageID = $vars[0];
		$arVariables = $vars[1];
		return $pageID;
	}

	reset($pageCandidates);
	$pageID = key($pageCandidates);
	$arVariables = $pageCandidates[$pageID];

	return $pageID;
}