예제 #1
0
 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;
 }
예제 #2
0
 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;
 }
예제 #3
0
 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;
 }