public static function resolveComponentEngine(CComponentEngine $engine, $pageCandidates, &$arVariables) { /** @global CMain $APPLICATION */ global $APPLICATION, $CACHE_MANAGER; $component = $engine->GetComponent(); if ($component) { $iblock_id = intval($component->arParams["IBLOCK_ID"]); } else { $iblock_id = 0; } $requestURL = $APPLICATION->GetCurPage(true); $cacheId = $requestURL . implode("|", array_keys($pageCandidates)); $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 ($arVariablesTmp["SECTION_CODE_PATH"] != "" && (isset($arVariablesTmp["ELEMENT_ID"]) || isset($arVariablesTmp["ELEMENT_CODE"]))) { if (CIBlockFindTools::checkElement($iblock_id, $arVariablesTmp)) { $arVariables = $arVariablesTmp; if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->EndTagCache(); } $cache->endDataCache(array($pageID, $arVariablesTmp)); return $pageID; } } } foreach ($pageCandidates as $pageID => $arVariablesTmp) { if ($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; } list($pageID, $arVariables) = each($pageCandidates); return $pageID; }
public 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 = intval($component->arParams["IBLOCK_ID"]); } else { $iblock_id = 0; } //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; $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 ($arVariablesTmp["SECTION_CODE_PATH"] != "" && (isset($arVariablesTmp["ELEMENT_ID"]) || isset($arVariablesTmp["ELEMENT_CODE"]))) { if (CIBlockFindTools::checkElement($iblock_id, $arVariablesTmp)) { $arVariables = $arVariablesTmp; if (defined("BX_COMP_MANAGED_CACHE")) { $CACHE_MANAGER->EndTagCache(); } $cache->endDataCache(array($pageID, $arVariablesTmp)); return $pageID; } } } foreach ($pageCandidates as $pageID => $arVariablesTmp) { if ($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); list($pageID, $arVariables) = each($pageCandidates); return $pageID; }
function Fetch() { /** @global CCacheManager $CACHE_MANAGER */ global $CACHE_MANAGER; /** @global CDatabase $DB */ global $DB; $res = parent::Fetch(); if (!is_object($this)) { return $res; } $arUpdate = array(); if ($res) { if (is_array($this->arIBlockLongProps)) { foreach ($res as $k => $v) { if (preg_match("#^ALIAS_(\\d+)_(.*)\$#", $k, $match)) { $res[$this->arIBlockLongProps[$match[1]] . $match[2]] = $v; unset($res[$k]); } } } if (isset($res["IBLOCK_ID"]) && defined("BX_COMP_MANAGED_CACHE") && $res["IBLOCK_ID"] != $this->_LAST_IBLOCK_ID) { CIBlock::registerWithTagCache($res["IBLOCK_ID"]); $this->_LAST_IBLOCK_ID = $res["IBLOCK_ID"]; } if (isset($res["ID"]) && $res["ID"] != "" && is_array($this->arIBlockMultProps)) { foreach ($this->arIBlockMultProps as $field_name => $db_prop) { if (array_key_exists($field_name, $res)) { if (is_object($res[$field_name])) { $res[$field_name] = $res[$field_name]->load(); } if (preg_match("/(_VALUE)\$/", $field_name)) { $descr_name = preg_replace("/(_VALUE)\$/", "_DESCRIPTION", $field_name); } else { $descr_name = preg_replace("/^(PROPERTY_)/", "DESCRIPTION_", $field_name); } if (strlen($res[$field_name]) <= 0) { $strSql = "\n\t\t\t\t\t\t\t\tSELECT VALUE,DESCRIPTION\n\t\t\t\t\t\t\t\tFROM b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"] . "\n\t\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\t\tIBLOCK_ELEMENT_ID = " . intval($res["ID"]) . "\n\t\t\t\t\t\t\t\t\tAND IBLOCK_PROPERTY_ID = " . intval($db_prop["ORIG_ID"]) . "\n\t\t\t\t\t\t\t\tORDER BY ID\n\t\t\t\t\t\t\t"; $rs = $DB->Query($strSql); $res[$field_name] = array(); $res[$descr_name] = array(); while ($ar = $rs->Fetch()) { $res[$field_name][] = $ar["VALUE"]; $res[$descr_name][] = $ar["DESCRIPTION"]; } $arUpdate["b_iblock_element_prop_s" . $db_prop["IBLOCK_ID"]]["PROPERTY_" . $db_prop["ORIG_ID"]] = serialize(array("VALUE" => $res[$field_name], "DESCRIPTION" => $res[$descr_name])); } else { $tmp = unserialize($res[$field_name]); $res[$field_name] = $tmp["VALUE"]; $res[$descr_name] = $tmp["DESCRIPTION"]; } if (is_array($res[$field_name]) && $db_prop["PROPERTY_TYPE"] == "L") { $arTemp = array(); foreach ($res[$field_name] as $key => $val) { $arEnum = CIBlockPropertyEnum::GetByID($val); if ($arEnum !== false) { $arTemp[$val] = $arEnum["VALUE"]; } } $res[$field_name] = $arTemp; } } } foreach ($arUpdate as $strTable => $arFields) { $strUpdate = $DB->PrepareUpdate($strTable, $arFields); if ($strUpdate != "") { $strSql = "UPDATE " . $strTable . " SET " . $strUpdate . " WHERE IBLOCK_ELEMENT_ID = " . intval($res["ID"]); $DB->QueryBind($strSql, $arFields); } } } if (is_array($this->arIBlockConvProps)) { foreach ($this->arIBlockConvProps as $strFieldName => $arCallback) { if (is_array($res[$strFieldName])) { foreach ($res[$strFieldName] as $key => $value) { $arValue = call_user_func_array($arCallback["ConvertFromDB"], array($arCallback["PROPERTY"], array("VALUE" => $value, "DESCRIPTION" => ""))); $res[$strFieldName][$key] = $arValue["VALUE"]; } } else { $arValue = call_user_func_array($arCallback["ConvertFromDB"], array($arCallback["PROPERTY"], array("VALUE" => $res[$strFieldName], "DESCRIPTION" => ""))); $res[$strFieldName] = $arValue["VALUE"]; } } } if (is_array($this->arIBlockNumProps)) { foreach ($this->arIBlockNumProps as $field_name => $db_prop) { if (strlen($res[$field_name]) > 0) { $res[$field_name] = htmlspecialcharsex(CIBlock::NumberFormat($res[$field_name])); } } } if (isset($res["UC_ID"])) { $res["CREATED_BY_FORMATTED"] = CUser::FormatName($this->nameTemplate, array("NAME" => $res["UC_NAME"], "LAST_NAME" => $res["UC_LAST_NAME"], "SECOND_NAME" => $res["UC_SECOND_NAME"], "EMAIL" => $res["UC_EMAIL"], "ID" => $res["UC_ID"], "LOGIN" => $res["UC_LOGIN"]), true, false); unset($res["UC_NAME"]); unset($res["UC_LAST_NAME"]); unset($res["UC_SECOND_NAME"]); unset($res["UC_EMAIL"]); unset($res["UC_ID"]); unset($res["UC_LOGIN"]); } } elseif (defined("BX_COMP_MANAGED_CACHE") && $this->_LAST_IBLOCK_ID == "" && count($this->_FILTER_IBLOCK_ID)) { foreach ($this->_FILTER_IBLOCK_ID as $iblock_id => $t) { CIBlock::registerWithTagCache($iblock_id); } } return $res; }