public static function GetQueryBuildArrays($arOrder, $arFilter, $arSelect) { global $DB, $USER, $stackCacheManager; $strDefQuantityTrace = (string) Option::get('catalog', 'default_quantity_trace') == 'Y' ? 'Y' : 'N'; $strDefCanBuyZero = (string) Option::get('catalog', 'default_can_buy_zero') == 'Y' ? 'Y' : 'N'; $strDefNegAmount = (string) Option::get('catalog', 'allow_negative_amount') == 'Y' ? 'Y' : 'N'; $strSubscribe = (string) Option::get('catalog', 'default_subscribe') == 'N' ? 'N' : 'Y'; $sResSelect = ''; $sResFrom = ''; $sResWhere = ''; $arResOrder = array(); $arJoinGroup = array(); $arStoreWhere = array(); $arStore = array(); $arStoreOrder = array(); $arSensID = array('PRODUCT_ID' => true, 'CATALOG_GROUP_ID' => true, 'CURRENCY' => true, 'SHOP_QUANTITY' => true, 'PRICE' => true, 'STORE_AMOUNT' => true); $arOrderTmp = array(); foreach ($arOrder as $key => $val) { foreach ($val as $by => $order) { if ($arField = CCatalogProduct::ParseQueryBuildField($by)) { $res = ''; $join = true; $inum = (int) $arField["NUM"]; $by = (string) $arField["FIELD"]; if ($by == '' || $inum <= 0 && isset($arSensID[$by])) { continue; } switch ($by) { case 'PRICE': $res = " " . CIBlock::_Order("CAT_P" . $inum . ".PRICE", $order, "asc") . " "; break; case 'CURRENCY': $res = " " . CIBlock::_Order("CAT_P" . $inum . ".CURRENCY", $order, "asc") . " "; break; case 'QUANTITY': $arResOrder[$key] = " " . CIBlock::_Order("CAT_PR.QUANTITY", $order, "asc", false) . " "; $join = false; break; case 'WEIGHT': $arResOrder[$key] = " " . CIBlock::_Order("CAT_PR.WEIGHT", $order, "asc", false) . " "; $join = false; break; case 'AVAILABLE': $arResOrder[$key] = " " . CIBlock::_Order("CATALOG_AVAILABLE", $order, "desc", false) . " "; $join = false; break; case 'TYPE': $arResOrder[$key] = " " . CIBlock::_Order("CAT_PR.TYPE", $order, "asc", false) . " "; $join = false; break; case 'PURCHASING_PRICE': $arResOrder[$key] = " " . CIBlock::_Order("CAT_PR.PURCHASING_PRICE", $order, "asc") . " "; $join = false; break; case 'PURCHASING_CURRENCY': $arResOrder[$key] = " " . CIBlock::_Order("CAT_PR.PURCHASING_CURRENCY", $order, "asc") . " "; $join = false; break; case 'STORE_AMOUNT': $arStore[$inum] = true; if (!isset($arStoreOrder[$inum])) { $arStoreOrder[$inum] = array(); } $arStoreOrder[$inum][$key] = " " . CIBlock::_Order("CAT_SP" . $inum . ".AMOUNT", $order, "asc") . " "; $join = false; break; default: $res = " " . CIBlock::_Order("CAT_P" . $inum . ".ID", $order, "asc", false) . " "; break; } if ($join) { if (!isset($arOrderTmp[$inum])) { $arOrderTmp[$inum] = array(); } $arOrderTmp[$inum][$key] = $res; $arJoinGroup[$inum] = true; } } } } $productWhere = array(); $arWhereTmp = array(); $arAddJoinOn = array(); $filter_keys = !is_array($arFilter) ? array() : array_keys($arFilter); for ($i = 0, $cnt = count($filter_keys); $i < $cnt; $i++) { $key = strtoupper($filter_keys[$i]); $val = $arFilter[$filter_keys[$i]]; $res = CIBlock::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; if ($arField = CCatalogProduct::ParseQueryBuildField($key)) { $res = ''; $join = true; $key = (string) $arField["FIELD"]; $inum = (int) $arField["NUM"]; if ($key == '' || $inum <= 0 && isset($arSensID[$key])) { continue; } switch ($key) { case "PRODUCT_ID": $res = CIBlock::FilterCreate("CAT_P" . $inum . ".PRODUCT_ID", $val, "number", $cOperationType); break; case "CATALOG_GROUP_ID": $res = CIBlock::FilterCreate("CAT_P" . $inum . ".CATALOG_GROUP_ID", $val, "number", $cOperationType); break; case "CURRENCY": $res = CIBlock::FilterCreate("CAT_P" . $inum . ".CURRENCY", $val, "string", $cOperationType); break; case "SHOP_QUANTITY": $val = (int) $val; $res = ' 1=1 '; $arAddJoinOn[$inum] = ($cOperationType == "N" ? " NOT " : " ") . " ((CAT_P" . $inum . ".QUANTITY_FROM <= " . $val . " OR CAT_P" . $inum . ".QUANTITY_FROM IS NULL) AND (CAT_P" . $inum . ".QUANTITY_TO >= " . $val . " OR CAT_P" . $inum . ".QUANTITY_TO IS NULL)) "; break; case "PRICE": $res = CIBlock::FilterCreate("CAT_P" . $inum . ".PRICE", $val, "number", $cOperationType); break; case "QUANTITY": $res = CIBlock::FilterCreate("CAT_PR.QUANTITY", $val, "number", $cOperationType); $join = false; break; case "AVAILABLE": if ('N' !== $val) { $val = 'Y'; } $res = " (IF (\n\t\t\t\t\tCAT_PR.QUANTITY > 0 OR\n\t\t\t\t\tIF (CAT_PR.QUANTITY_TRACE = 'D', '" . $strDefQuantityTrace . "', CAT_PR.QUANTITY_TRACE) = 'N' OR\n\t\t\t\t\tIF (CAT_PR.CAN_BUY_ZERO = 'D', '" . $strDefCanBuyZero . "', CAT_PR.CAN_BUY_ZERO) = 'Y',\n\t\t\t\t\t'Y', 'N'\n\t\t\t\t\t) " . ($cOperationType == "N" ? "<>" : "=") . " '" . $val . "') "; $join = false; break; case "WEIGHT": $res = CIBlock::FilterCreate("CAT_PR.WEIGHT", $val, "number", $cOperationType); $join = false; break; case 'TYPE': $res = CIBlock::FilterCreate("CAT_PR.TYPE", $val, "number", $cOperationType); $join = false; break; case 'PURCHASING_PRICE': $res = CIBlock::FilterCreate("CAT_PR.PURCHASING_PRICE", $val, "number", $cOperationType); $join = false; break; case 'PURCHASING_CURRENCY': $res = CIBlock::FilterCreate("CAT_PR.PURCHASING_PRICE", $val, "string", $cOperationType); $join = false; break; case 'STORE_AMOUNT': $arStore[$inum] = true; if (!isset($arStoreWhere[$inum])) { $arStoreWhere[$inum] = array(); } $arStoreWhere[$inum][] = CIBlock::FilterCreate("CAT_SP" . $inum . ".AMOUNT", $val, "number", $cOperationType); $join = false; break; } if ($res == '') { continue; } if ($join) { if (!isset($arWhereTmp[$inum])) { $arWhereTmp[$inum] = array(); } $arWhereTmp[$inum][] = $res; $arJoinGroup[$inum] = true; } else { $productWhere[] = $res; } } } if (!empty($arSelect)) { foreach ($arSelect as &$strOneSelect) { $val = strtoupper($strOneSelect); if (strncmp($val, 'CATALOG_GROUP_', 14) == 0) { $num = (int) substr($val, 14); if ($num > 0) { $arJoinGroup[$num] = true; } } elseif (strncmp($val, 'CATALOG_STORE_AMOUNT_', 21) == 0) { $num = (int) substr($val, 21); if ($num > 0) { $arStore[$num] = true; } } } unset($strOneSelect); } if (!empty($arJoinGroup)) { $strSubWhere = implode(',', array_keys($arJoinGroup)); $strUserGroups = CCatalog::IsUserExists() ? $USER->GetGroups() : '2'; $strCacheKey = "P_" . $strUserGroups; $strCacheKey .= "_" . $strSubWhere; $strCacheKey .= "_" . LANGUAGE_ID; $cacheTime = CATALOG_CACHE_DEFAULT_TIME; if (defined("CATALOG_CACHE_TIME")) { $cacheTime = intval(CATALOG_CACHE_TIME); } $stackCacheManager->SetLength("catalog_GetQueryBuildArrays", 50); $stackCacheManager->SetTTL("catalog_GetQueryBuildArrays", $cacheTime); if ($stackCacheManager->Exist("catalog_GetQueryBuildArrays", $strCacheKey)) { $arResult = $stackCacheManager->Get("catalog_GetQueryBuildArrays", $strCacheKey); } else { $strSql = "SELECT CAT_CG.ID, CAT_CGL.NAME as CATALOG_GROUP_NAME, " . "\tIF(CAT_CGG.ID IS NULL, 'N', 'Y') as CATALOG_CAN_ACCESS, " . "\tIF(CAT_CGG1.ID IS NULL, 'N', 'Y') as CATALOG_CAN_BUY " . "FROM b_catalog_group CAT_CG " . "\tLEFT JOIN b_catalog_group2group CAT_CGG ON (CAT_CG.ID = CAT_CGG.CATALOG_GROUP_ID AND CAT_CGG.GROUP_ID IN (" . $strUserGroups . ") AND CAT_CGG.BUY <> 'Y') " . "\tLEFT JOIN b_catalog_group2group CAT_CGG1 ON (CAT_CG.ID = CAT_CGG1.CATALOG_GROUP_ID AND CAT_CGG1.GROUP_ID IN (" . $strUserGroups . ") AND CAT_CGG1.BUY = 'Y') " . "\tLEFT JOIN b_catalog_group_lang CAT_CGL ON (CAT_CG.ID = CAT_CGL.CATALOG_GROUP_ID AND CAT_CGL.LANG = '" . LANGUAGE_ID . "') " . " WHERE CAT_CG.ID IN (" . $strSubWhere . ") " . " GROUP BY CAT_CG.ID "; $dbRes = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); $arResult = array(); while ($arRes = $dbRes->Fetch()) { $arResult[] = $arRes; } $stackCacheManager->Set("catalog_GetQueryBuildArrays", $strCacheKey, $arResult); } foreach ($arResult as &$row) { $i = (int) $row["ID"]; if (!empty($arWhereTmp[$i]) && is_array($arWhereTmp[$i])) { $sResWhere .= ' AND ' . implode(' AND ', $arWhereTmp[$i]); } if (!empty($arOrderTmp[$i]) && is_array($arOrderTmp[$i])) { foreach ($arOrderTmp[$i] as $k => $v) { $arResOrder[$k] = $v; } } $sResSelect .= ", CAT_P" . $i . ".ID as CATALOG_PRICE_ID_" . $i . ", " . " CAT_P" . $i . ".CATALOG_GROUP_ID as CATALOG_GROUP_ID_" . $i . ", " . " CAT_P" . $i . ".PRICE as CATALOG_PRICE_" . $i . ", " . " CAT_P" . $i . ".CURRENCY as CATALOG_CURRENCY_" . $i . ", " . " CAT_P" . $i . ".QUANTITY_FROM as CATALOG_QUANTITY_FROM_" . $i . ", " . " CAT_P" . $i . ".QUANTITY_TO as CATALOG_QUANTITY_TO_" . $i . ", " . " '" . $DB->ForSql($row["CATALOG_GROUP_NAME"]) . "' as CATALOG_GROUP_NAME_" . $i . ", " . " '" . $DB->ForSql($row["CATALOG_CAN_ACCESS"]) . "' as CATALOG_CAN_ACCESS_" . $i . ", " . " '" . $DB->ForSql($row["CATALOG_CAN_BUY"]) . "' as CATALOG_CAN_BUY_" . $i . ", " . " CAT_P" . $i . ".EXTRA_ID as CATALOG_EXTRA_ID_" . $i; $sResFrom .= ' left join b_catalog_price CAT_P' . $i . ' on (CAT_P' . $i . '.PRODUCT_ID = BE.ID AND CAT_P' . $i . '.CATALOG_GROUP_ID = ' . $row['ID'] . ') '; if (isset($arAddJoinOn[$i])) { $sResFrom .= ' and ' . $arAddJoinOn[$i]; } } if (isset($row)) { unset($row); } } $sResSelect .= ", CAT_PR.QUANTITY as CATALOG_QUANTITY, CAT_PR.QUANTITY_RESERVED as CATALOG_QUANTITY_RESERVED, " . " IF (CAT_PR.QUANTITY_TRACE = 'D', '" . $strDefQuantityTrace . "', CAT_PR.QUANTITY_TRACE) as CATALOG_QUANTITY_TRACE, " . " CAT_PR.QUANTITY_TRACE as CATALOG_QUANTITY_TRACE_ORIG, " . " IF (CAT_PR.CAN_BUY_ZERO = 'D', '" . $strDefCanBuyZero . "', CAT_PR.CAN_BUY_ZERO) as CATALOG_CAN_BUY_ZERO, " . " CAT_PR.CAN_BUY_ZERO as CATALOG_CAN_BUY_ZERO_ORIG, " . " IF (CAT_PR.NEGATIVE_AMOUNT_TRACE = 'D', '" . $strDefNegAmount . "', CAT_PR.NEGATIVE_AMOUNT_TRACE) as CATALOG_NEGATIVE_AMOUNT_TRACE, " . " CAT_PR.NEGATIVE_AMOUNT_TRACE as CATALOG_NEGATIVE_AMOUNT_ORIG, " . " IF (CAT_PR.SUBSCRIBE = 'D', '" . $strSubscribe . "', CAT_PR.SUBSCRIBE) as CATALOG_SUBSCRIBE, " . " CAT_PR.SUBSCRIBE as CATALOG_SUBSCRIBE_ORIG, " . " IF (\n\t\t\t\tCAT_PR.QUANTITY > 0 OR\n\t\t\t\tIF (CAT_PR.QUANTITY_TRACE = 'D', '" . $strDefQuantityTrace . "', CAT_PR.QUANTITY_TRACE) = 'N' OR\n\t\t\t\tIF (CAT_PR.CAN_BUY_ZERO = 'D', '" . $strDefCanBuyZero . "', CAT_PR.CAN_BUY_ZERO) = 'Y',\n\t\t\t\t'Y', 'N'\n\t\t\t) as CATALOG_AVAILABLE, " . " CAT_PR.WEIGHT as CATALOG_WEIGHT, CAT_PR.WIDTH as CATALOG_WIDTH, CAT_PR.LENGTH as CATALOG_LENGTH, CAT_PR.HEIGHT as CATALOG_HEIGHT, " . " CAT_PR.MEASURE as CATALOG_MEASURE, " . " CAT_VAT.RATE as CATALOG_VAT, CAT_PR.VAT_INCLUDED as CATALOG_VAT_INCLUDED, " . " CAT_PR.PRICE_TYPE as CATALOG_PRICE_TYPE, CAT_PR.RECUR_SCHEME_TYPE as CATALOG_RECUR_SCHEME_TYPE, " . " CAT_PR.RECUR_SCHEME_LENGTH as CATALOG_RECUR_SCHEME_LENGTH, CAT_PR.TRIAL_PRICE_ID as CATALOG_TRIAL_PRICE_ID, " . " CAT_PR.WITHOUT_ORDER as CATALOG_WITHOUT_ORDER, CAT_PR.SELECT_BEST_PRICE as CATALOG_SELECT_BEST_PRICE, " . " CAT_PR.PURCHASING_PRICE as CATALOG_PURCHASING_PRICE, CAT_PR.PURCHASING_CURRENCY as CATALOG_PURCHASING_CURRENCY, CAT_PR.TYPE as CATALOG_TYPE "; $sResFrom .= " left join b_catalog_product CAT_PR on (CAT_PR.ID = BE.ID) "; $sResFrom .= " left join b_catalog_iblock CAT_IB on ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID) "; $sResFrom .= " left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) "; if (!empty($productWhere)) { $sResWhere .= ' and ' . implode(' and ', $productWhere); } unset($productWhere); if (!empty($arStore)) { foreach (array_keys($arStore) as $inum) { $sResFrom .= " left join b_catalog_store_product CAT_SP" . $inum . " on (CAT_SP" . $inum . ".PRODUCT_ID = BE.ID and CAT_SP" . $inum . ".STORE_ID = " . $inum . ") "; $sResSelect .= ", CAT_SP" . $inum . ".AMOUNT as CATALOG_STORE_AMOUNT_" . $inum . " "; } if (!empty($arStoreOrder)) { foreach ($arStoreOrder as $oneStoreOrder) { if (!empty($oneStoreOrder) && is_array($oneStoreOrder)) { foreach ($oneStoreOrder as $k => $v) { $arResOrder[$k] = $v; } unset($k, $v); } } unset($oneStoreOrder); } if (!empty($arStoreWhere)) { foreach ($arStoreWhere as $where) { $sResWhere .= ' and ' . implode(' and ', $where); } } } return array('SELECT' => $sResSelect, 'FROM' => $sResFrom, 'WHERE' => $sResWhere, 'ORDER' => $arResOrder); }
public static function GetQueryBuildArrays($arOrder, $arFilter, $arSelect) { global $DB, $USER; global $stackCacheManager; $strDefQuantityTrace = COption::GetOptionString('catalog','default_quantity_trace','N'); if ('Y' != $strDefQuantityTrace) $strDefQuantityTrace = 'N'; $strDefCanBuyZero = COption::GetOptionString('catalog','default_can_buy_zero','N'); if ('Y' != $strDefCanBuyZero) $strDefCanBuyZero = 'N'; $strDefNegAmount = COption::GetOptionString('catalog','allow_negative_amount','N'); if ('Y' != $strDefNegAmount) $strDefNegAmount = 'N'; $sResSelect = ""; $sResFrom = ""; $sResWhere = ""; $arResOrder = array(); $arJoinGroup = array(); $arSensID = array( 'PRODUCT_ID' => true, 'CATALOG_GROUP_ID' => true, 'CURRENCY' => true, 'SHOP_QUANTITY' => true, 'PRICE' => true ); $arOrderTmp = array(); foreach ($arOrder as $key => $val) { foreach ($val as $by => $order) { if ($arField = CCatalogProduct::ParseQueryBuildField($by)) { $inum = $arField["NUM"]; $by = $arField["FIELD"]; $res = ''; if (0 >= $inum && array_key_exists($by, $arSensID)) continue; if ($by == "PRICE") { $res = " ".CIBlock::_Order("CAT_P".$inum.".PRICE", $order, "asc")." "; } elseif ($by == "CURRENCY") { $res = " ".CIBlock::_Order("CAT_P".$inum.".CURRENCY", $order, "asc")." "; } elseif ($by == "QUANTITY") { $arResOrder[$key] = " ".CIBlock::_Order("CAT_PR.QUANTITY", $order, "asc", false)." "; continue; } elseif ($by == 'WEIGHT') { $arResOrder[$key] = " ".CIBlock::_Order("CAT_PR.WEIGHT", $order, "asc", false)." "; continue; } elseif ($by == 'AVAILABLE') { $arResOrder[$key] = " ".CIBlock::_Order("CATALOG_AVAILABLE", $order, "desc", false)." "; continue; } else { $res = " ".CIBlock::_Order("CAT_P".$inum.".ID", $order, "asc", false)." "; } if (!array_key_exists($inum, $arOrderTmp)) $arOrderTmp[$inum] = array(); $arOrderTmp[$inum][$key] = $res; $arJoinGroup[$inum] = true; } } } $arWhereTmp = array(); $arAddJoinOn = array(); $filter_keys = (!is_array($arFilter) ? array() : array_keys($arFilter)); for ($i=0, $cnt = count($filter_keys); $i < $cnt; $i++) { $key = strtoupper($filter_keys[$i]); $val = $arFilter[$filter_keys[$i]]; $res = CIBlock::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; if ($arField = CCatalogProduct::ParseQueryBuildField($key)) { $key = $arField["FIELD"]; $inum = $arField["NUM"]; if (0 >= $inum && array_key_exists($key, $arSensID)) continue; $res = ""; switch($key) { case "PRODUCT_ID": $res = CIBlock::FilterCreate("CAT_P".$inum.".PRODUCT_ID", $val, "number", $cOperationType); break; case "CATALOG_GROUP_ID": $res = CIBlock::FilterCreate("CAT_P".$inum.".CATALOG_GROUP_ID", $val, "number", $cOperationType); break; case "CURRENCY": $res = CIBlock::FilterCreate("CAT_P".$inum.".CURRENCY", $val, "string", $cOperationType); break; case "SHOP_QUANTITY": $res = ' 1=1 '; $arAddJoinOn[$inum] = (($cOperationType=="N") ? " NOT " : " "). " ((CAT_P".$inum.".QUANTITY_FROM <= ".intval($val)." OR CAT_P".$inum.".QUANTITY_FROM IS NULL) AND (CAT_P".$inum.".QUANTITY_TO >= ".intval($val)." OR CAT_P".$inum.".QUANTITY_TO IS NULL)) "; break; case "PRICE": $res = CIBlock::FilterCreate("CAT_P".$inum.".PRICE", $val, "number", $cOperationType); break; case "QUANTITY": $res = CIBlock::FilterCreate("CAT_PR.QUANTITY", $val, "number", $cOperationType); break; case "AVAILABLE": if ('N' !== $val) $val = 'Y'; $res = " (IF ( CAT_PR.QUANTITY > 0 OR IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) = 'N' OR IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) = 'Y', 'Y', 'N' ) ".(($cOperationType=="N") ? "<>" : "=")." '".$val."') "; break; case "WEIGHT": $res = CIBlock::FilterCreate("CAT_PR.WEIGHT", $val, "number", $cOperationType); break; } if ('' == $res) continue; if (!array_key_exists($inum, $arWhereTmp)) $arWhereTmp[$inum] = array(); $arWhereTmp[$inum][] = $res; $arJoinGroup[$inum] = true; } } $strSubWhere = ""; if (!empty($arSelect)) { foreach ($arSelect as &$strOneSelect) { $val = strtoupper($strOneSelect); if (0 != strncmp($val, 'CATALOG_GROUP_', 14)) continue; $num = intval(substr($val, 14)); if (0 < $num) $arJoinGroup[$num] = true; } if (isset($strOneSelect)) unset($strOneSelect); } if (!empty($arJoinGroup)) { $strSubWhere = implode(',', array_keys($arJoinGroup)); $strUserGroups = $USER->GetGroups(); $strCacheKey = "P_".$strUserGroups; $strCacheKey .= "_".$strSubWhere; $strCacheKey .= "_".LANGUAGE_ID; $cacheTime = CATALOG_CACHE_DEFAULT_TIME; if (defined("CATALOG_CACHE_TIME")) $cacheTime = intval(CATALOG_CACHE_TIME); $stackCacheManager->SetLength("catalog_GetQueryBuildArrays", 50); $stackCacheManager->SetTTL("catalog_GetQueryBuildArrays", $cacheTime); if ($stackCacheManager->Exist("catalog_GetQueryBuildArrays", $strCacheKey)) { $arResult = $stackCacheManager->Get("catalog_GetQueryBuildArrays", $strCacheKey); } else { $strSql = "SELECT CAT_CG.ID, CAT_CGL.NAME as CATALOG_GROUP_NAME, ". " IF(CAT_CGG.ID IS NULL, 'N', 'Y') as CATALOG_CAN_ACCESS, ". " IF(CAT_CGG1.ID IS NULL, 'N', 'Y') as CATALOG_CAN_BUY ". "FROM b_catalog_group CAT_CG ". " LEFT JOIN b_catalog_group2group CAT_CGG ON (CAT_CG.ID = CAT_CGG.CATALOG_GROUP_ID AND CAT_CGG.GROUP_ID IN (".$strUserGroups.") AND CAT_CGG.BUY <> 'Y') ". " LEFT JOIN b_catalog_group2group CAT_CGG1 ON (CAT_CG.ID = CAT_CGG1.CATALOG_GROUP_ID AND CAT_CGG1.GROUP_ID IN (".$strUserGroups.") AND CAT_CGG1.BUY = 'Y') ". " LEFT JOIN b_catalog_group_lang CAT_CGL ON (CAT_CG.ID = CAT_CGL.CATALOG_GROUP_ID AND CAT_CGL.LID = '".LANGUAGE_ID."') ". " WHERE CAT_CG.ID IN (".$strSubWhere.") ". " GROUP BY CAT_CG.ID "; $dbRes = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__); $arResult = array(); while ($arRes = $dbRes->Fetch()) $arResult[] = $arRes; $stackCacheManager->Set("catalog_GetQueryBuildArrays", $strCacheKey, $arResult); } $arCatGroups = array(); foreach ($arResult as &$row) { $i = intval($row["ID"]); if (!empty($arWhereTmp[$i]) && is_array($arWhereTmp[$i])) { $sResWhere .= ' AND '.implode(' AND ',$arWhereTmp[$i]); } if (!empty($arOrderTmp[$i]) && is_array($arOrderTmp[$i])) { foreach($arOrderTmp[$i] as $k=>$v) $arResOrder[$k] = $v; } $sResSelect .= ", CAT_P".$i.".ID as CATALOG_PRICE_ID_".$i.", ". " CAT_P".$i.".CATALOG_GROUP_ID as CATALOG_GROUP_ID_".$i.", ". " CAT_P".$i.".PRICE as CATALOG_PRICE_".$i.", ". " CAT_P".$i.".CURRENCY as CATALOG_CURRENCY_".$i.", ". " CAT_P".$i.".QUANTITY_FROM as CATALOG_QUANTITY_FROM_".$i.", ". " CAT_P".$i.".QUANTITY_TO as CATALOG_QUANTITY_TO_".$i.", ". " '".$DB->ForSql($row["CATALOG_GROUP_NAME"])."' as CATALOG_GROUP_NAME_".$i.", ". " '".$DB->ForSql($row["CATALOG_CAN_ACCESS"])."' as CATALOG_CAN_ACCESS_".$i.", ". " '".$DB->ForSql($row["CATALOG_CAN_BUY"])."' as CATALOG_CAN_BUY_".$i.", ". " CAT_P".$i.".EXTRA_ID as CATALOG_EXTRA_ID_".$i; $sResFrom .= " LEFT JOIN b_catalog_price CAT_P".$i." ON (CAT_P".$i.".PRODUCT_ID = BE.ID AND CAT_P".$i.".CATALOG_GROUP_ID = ".$row["ID"].") "; if (isset($arAddJoinOn[$i])) $sResFrom .= ' AND '.$arAddJoinOn[$i]; } if (isset($row)) unset($row); } $sResSelect .= ", CAT_PR.QUANTITY as CATALOG_QUANTITY, ". " IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) as CATALOG_QUANTITY_TRACE, ". " CAT_PR.QUANTITY_TRACE as CATALOG_QUANTITY_TRACE_ORIG, ". " IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) as CATALOG_CAN_BUY_ZERO, ". " IF (CAT_PR.NEGATIVE_AMOUNT_TRACE = 'D', '".$strDefNegAmount."', CAT_PR.NEGATIVE_AMOUNT_TRACE) as CATALOG_NEGATIVE_AMOUNT_TRACE, ". " IF ( CAT_PR.QUANTITY > 0 OR IF (CAT_PR.QUANTITY_TRACE = 'D', '".$strDefQuantityTrace."', CAT_PR.QUANTITY_TRACE) = 'N' OR IF (CAT_PR.CAN_BUY_ZERO = 'D', '".$strDefCanBuyZero."', CAT_PR.CAN_BUY_ZERO) = 'Y', 'Y', 'N' ) as CATALOG_AVAILABLE, ". " CAT_PR.WEIGHT as CATALOG_WEIGHT, ". " CAT_VAT.RATE as CATALOG_VAT, ". " CAT_PR.VAT_INCLUDED as CATALOG_VAT_INCLUDED, ". " CAT_PR.PRICE_TYPE as CATALOG_PRICE_TYPE, ". " CAT_PR.RECUR_SCHEME_TYPE as CATALOG_RECUR_SCHEME_TYPE, ". " CAT_PR.RECUR_SCHEME_LENGTH as CATALOG_RECUR_SCHEME_LENGTH, ". " CAT_PR.TRIAL_PRICE_ID as CATALOG_TRIAL_PRICE_ID, ". " CAT_PR.WITHOUT_ORDER as CATALOG_WITHOUT_ORDER, ". " CAT_PR.SELECT_BEST_PRICE as CATALOG_SELECT_BEST_PRICE, ". " CAT_PR.PURCHASING_PRICE as CATALOG_PURCHASING_PRICE, CAT_PR.PURCHASING_CURRENCY as CATALOG_PURCHASING_CURRENCY "; $sResFrom .= " LEFT JOIN b_catalog_product CAT_PR ON (CAT_PR.ID = BE.ID) "; $sResFrom .= " LEFT JOIN b_catalog_iblock CAT_IB ON ((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0) AND CAT_IB.IBLOCK_ID = BE.IBLOCK_ID) "; $sResFrom .= " LEFT JOIN b_catalog_vat CAT_VAT ON (CAT_VAT.ID = IF((CAT_PR.VAT_ID IS NULL OR CAT_PR.VAT_ID = 0), CAT_IB.VAT_ID, CAT_PR.VAT_ID)) "; if (!empty($arWhereTmp[0]) && is_array($arWhereTmp[0])) { $sResWhere .= ' AND '.implode(' AND ', $arWhereTmp[0]); } return array( "SELECT" => $sResSelect, "FROM" => $sResFrom, "WHERE" => $sResWhere, "ORDER" => $arResOrder ); }
function PrepareGetList(&$arIblockElementFields, &$arJoinProps, &$bOnlyCount, &$bDistinct, &$arSelectFields, &$sSelect, &$arAddSelectFields, &$arFilter, &$sWhere, &$sSectionWhere, &$arAddWhereFields, &$arGroupBy, &$sGroupBy, &$arOrder, &$arSqlOrder, &$arAddOrderByFields, &$arIBlockFilter, &$arIBlockMultProps, &$arIBlockConvProps, &$arIBlockAllProps, &$arIBlockNumProps, &$arIBlockLongProps) { if (is_array($arSelectFields) && (in_array("DETAIL_PAGE_URL", $arSelectFields) || in_array("CANONICAL_PAGE_URL", $arSelectFields)) && !in_array("LANG_DIR", $arSelectFields)) { $arSelectFields[] = "LANG_DIR"; } global $DB, $USER; if (!is_array($arSelectFields) && $arSelectFields == "" || count($arSelectFields) <= 0 || $arSelectFields === false) { $arSelectFields = array("*"); } if (is_bool($arGroupBy) && $arGroupBy !== false) { $arGroupBy = array(); } if (is_array($arGroupBy) && count($arGroupBy) == 0) { $bOnlyCount = true; } $iPropCnt = 0; $arJoinProps = array("FP" => array(), "FPV" => array(), "FPS" => array(), "FPEN" => array(), "BE" => array(), "BE_FP" => array(), "BE_FPV" => array(), "BE_FPS" => array(), "BE_FPEN" => array(), "BES" => "", "RV" => false, "RVU" => false, "RVV" => false, "FC" => ""); $arIBlockMultProps = array(); $arIBlockAllProps = array(); $arIBlockNumProps = array(); $bWasGroup = false; //********************************ORDER BY PART*********************************************** $arSqlOrder = array(); $arAddOrderByFields = array(); $iOrdNum = -1; if (!is_array($arOrder)) { $arOrder = array(); } foreach ($arOrder as $by => $order) { $by_orig = $by; $by = strtoupper($by); //Remove aliases if ($by == "EXTERNAL_ID") { $by = "XML_ID"; } elseif ($by == "DATE_ACTIVE_FROM") { $by = "ACTIVE_FROM"; } elseif ($by == "DATE_ACTIVE_TO") { $by = "ACTIVE_TO"; } if (array_key_exists($by, $arSqlOrder)) { continue; } if (substr($by, 0, 8) == "CATALOG_") { $iOrdNum++; $arAddOrderByFields[$iOrdNum] = array($by => $order); //Reserve for future fill $arSqlOrder[$iOrdNum] = false; } else { if ($by == "ID") { $arSqlOrder[$by] = CIBlock::_Order("BE.ID", $order, "desc", false); } elseif ($by == "NAME") { $arSqlOrder[$by] = CIBlock::_Order("BE.NAME", $order, "desc", false); } elseif ($by == "STATUS") { $arSqlOrder[$by] = CIBlock::_Order("BE.WF_STATUS_ID", $order, "desc"); } elseif ($by == "XML_ID") { $arSqlOrder[$by] = CIBlock::_Order("BE.XML_ID", $order, "desc"); } elseif ($by == "CODE") { $arSqlOrder[$by] = CIBlock::_Order("BE.CODE", $order, "desc"); } elseif ($by == "TAGS") { $arSqlOrder[$by] = CIBlock::_Order("BE.TAGS", $order, "desc"); } elseif ($by == "TIMESTAMP_X") { $arSqlOrder[$by] = CIBlock::_Order("BE.TIMESTAMP_X", $order, "desc"); } elseif ($by == "CREATED") { $arSqlOrder[$by] = CIBlock::_Order("BE.DATE_CREATE", $order, "desc"); } elseif ($by == "CREATED_DATE") { $arSqlOrder[$by] = CIBlock::_Order($DB->DateFormatToDB("YYYY.MM.DD", "BE.DATE_CREATE"), $order, "desc"); } elseif ($by == "IBLOCK_ID") { $arSqlOrder[$by] = CIBlock::_Order("BE.IBLOCK_ID", $order, "desc"); } elseif ($by == "MODIFIED_BY") { $arSqlOrder[$by] = CIBlock::_Order("BE.MODIFIED_BY", $order, "desc"); } elseif ($by == "CREATED_BY") { $arSqlOrder[$by] = CIBlock::_Order("BE.CREATED_BY", $order, "desc"); } elseif ($by == "ACTIVE") { $arSqlOrder[$by] = CIBlock::_Order("BE.ACTIVE", $order, "desc"); } elseif ($by == "ACTIVE_FROM") { $arSqlOrder[$by] = CIBlock::_Order("BE.ACTIVE_FROM", $order, "desc"); } elseif ($by == "ACTIVE_TO") { $arSqlOrder[$by] = CIBlock::_Order("BE.ACTIVE_TO", $order, "desc"); } elseif ($by == "SORT") { $arSqlOrder[$by] = CIBlock::_Order("BE.SORT", $order, "desc"); } elseif ($by == "IBLOCK_SECTION_ID") { $arSqlOrder[$by] = CIBlock::_Order("BE.IBLOCK_SECTION_ID", $order, "desc"); } elseif ($by == "SHOW_COUNTER") { $arSqlOrder[$by] = CIBlock::_Order("BE.SHOW_COUNTER", $order, "desc"); } elseif ($by == "SHOW_COUNTER_START") { $arSqlOrder[$by] = CIBlock::_Order("BE.SHOW_COUNTER_START", $order, "desc"); } elseif ($by == "RAND") { $arSqlOrder[$by] = CIBlockElement::GetRandFunction(true); } elseif ($by == "SHOWS") { $arSqlOrder[$by] = CIBlock::_Order(CIBlockElement::GetShowedFunction(), $order, "desc", false); } elseif ($by == "HAS_PREVIEW_PICTURE") { $arSqlOrder[$by] = CIBlock::_Order(CIBlock::_NotEmpty("BE.PREVIEW_PICTURE"), $order, "desc", false); } elseif ($by == "HAS_DETAIL_PICTURE") { $arSqlOrder[$by] = CIBlock::_Order(CIBlock::_NotEmpty("BE.DETAIL_PICTURE"), $order, "desc", false); } elseif ($by == "RATING_TOTAL_VALUE") { $arSqlOrder[$by] = CIBlock::_Order("RV.TOTAL_VALUE", $order, "desc"); $arJoinProps["RV"] = true; } elseif ($by == "CNT") { if (is_array($arGroupBy) && count($arGroupBy) > 0) { $arSqlOrder[$by] = " CNT " . $order . " "; } } elseif (substr($by, 0, 9) == "PROPERTY_") { $propID = strtoupper(substr($by_orig, 9)); if (preg_match("/^([^.]+)\\.([^.]+)\$/", $propID, $arMatch)) { $db_prop = CIBlockProperty::GetPropertyArray($arMatch[1], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"])); if (is_array($db_prop) && $db_prop["PROPERTY_TYPE"] == "E") { CIBlockElement::MkPropertyOrder($arMatch, $order, false, $db_prop, $arJoinProps, $arSqlOrder); } } else { if ($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { CIBlockElement::MkPropertyOrder($by, $order, false, $db_prop, $arJoinProps, $arSqlOrder); } } } elseif (substr($by, 0, 13) == "PROPERTYSORT_") { $propID = strtoupper(substr($by_orig, 13)); if (preg_match("/^([^.]+)\\.([^.]+)\$/", $propID, $arMatch)) { $db_prop = CIBlockProperty::GetPropertyArray($arMatch[1], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"])); if (is_array($db_prop) && $db_prop["PROPERTY_TYPE"] == "E") { CIBlockElement::MkPropertyOrder($arMatch, $order, true, $db_prop, $arJoinProps, $arSqlOrder); } } else { if ($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { CIBlockElement::MkPropertyOrder($by, $order, true, $db_prop, $arJoinProps, $arSqlOrder); } } } else { $by = "ID"; if (!array_key_exists($by, $arSqlOrder)) { $arSqlOrder[$by] = CIBLock::_Order("BE.ID", $order, "desc"); } } //Check if have to add select field in order to correctly sort if (is_array($arSqlOrder[$by])) { if (is_array($arGroupBy) && count($arGroupBy) > 0) { $arGroupBy[] = $arSqlOrder[$by][1]; } else { $arSelectFields[] = $arSqlOrder[$by][1]; } // COLUMN ALIAS COLUMN EXPRESSION $arIblockElementFields[$arSqlOrder[$by][1]] = $arSqlOrder[$by][0]; // ORDER EXPRESSION $arSqlOrder[$by] = $arSqlOrder[$by][2]; } } //Add order by fields to the select list //in order to avoid sql errors if (is_array($arGroupBy) && count($arGroupBy) > 0) { if ($by == "STATUS") { $arGroupBy[] = "WF_STATUS_ID"; } elseif ($by == "CREATED") { $arGroupBy[] = "DATE_CREATE"; } else { $arGroupBy[] = $by; } } else { if ($by == "STATUS") { $arSelectFields[] = "WF_STATUS_ID"; } elseif ($by == "CREATED") { $arSelectFields[] = "DATE_CREATE"; } else { $arSelectFields[] = $by; } } } //*************************GROUP BY PART**************************** $sGroupBy = ""; if (is_array($arGroupBy) && count($arGroupBy) > 0) { $arSelectFields = $arGroupBy; $bWasGroup = true; foreach ($arSelectFields as $key => $val) { $val = strtoupper($val); if (array_key_exists($val, $arIblockElementFields)) { $sGroupBy .= "," . preg_replace("/(\\s+AS\\s+[A-Z_]+)/i", "", $arIblockElementFields[$val]); } elseif (substr($val, 0, 9) == "PROPERTY_") { $PR_ID = strtoupper(substr($val, 9)); if ($db_prop = CIBlockProperty::GetPropertyArray($PR_ID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { $sGroupBy .= CIBlockElement::MkPropertyGroup($db_prop, $arJoinProps); } } elseif (substr($val, 0, 13) == "PROPERTYSORT_") { $PR_ID = strtoupper(substr($val, 13)); if ($db_prop = CIBlockProperty::GetPropertyArray($PR_ID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { $sGroupBy .= CIBlockElement::MkPropertyGroup($db_prop, $arJoinProps, true); } } } if ($sGroupBy != "") { $sGroupBy = " GROUP BY " . substr($sGroupBy, 1) . " "; } } //*************************SELECT PART**************************** $arAddSelectFields = array(); if ($bOnlyCount) { $sSelect = "COUNT(%%_DISTINCT_%% BE.ID) as CNT "; } else { $sSelect = ""; $arDisplayedColumns = array(); $arProductFields = array("CATALOG_PURCHASING_PRICE" => true, "CATALOG_PURCHASING_CURRENCY" => true, "CATALOG_WEIGHT" => true, "CATALOG_QUANTITY" => true, "CATALOG_QUANTITY_RESERVED" => true, "CATALOG_VAT_INCLUDED" => true, "CATALOG_TYPE" => true, "CATALOG_MEASURE" => true, "CATALOG_AVAILABLE" => true); $bStar = false; foreach ($arSelectFields as $key => $val) { $val = strtoupper($val); if (array_key_exists($val, $arIblockElementFields)) { if (array_key_exists($val, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$val] = true; $arSelectFields[$key] = $val; $sSelect .= "," . $arIblockElementFields[$val] . " as " . $val; } elseif ($val == "PROPERTY_*" && !$bWasGroup) { //We have to analyze arFilter IBLOCK_ID and IBLOCK_CODE //in a way to be shure we will get properties of the ONE IBLOCK ONLY! $arPropertyFilter = array("ACTIVE" => "Y", "VERSION" => 2); if (array_key_exists("IBLOCK_ID", $arFilter)) { if (is_array($arFilter["IBLOCK_ID"]) && count($arFilter["IBLOCK_ID"]) == 1) { $arPropertyFilter["IBLOCK_ID"] = $arFilter["IBLOCK_ID"][0]; } elseif (!is_array($arFilter["IBLOCK_ID"]) && intval($arFilter["IBLOCK_ID"]) > 0) { $arPropertyFilter["IBLOCK_ID"] = $arFilter["IBLOCK_ID"]; } } if (!array_key_exists("IBLOCK_ID", $arPropertyFilter)) { if (array_key_exists("IBLOCK_CODE", $arFilter)) { if (is_array($arFilter["IBLOCK_CODE"]) && count($arFilter["IBLOCK_CODE"]) == 1) { $arPropertyFilter["IBLOCK_CODE"] = $arFilter["IBLOCK_CODE"][0]; } elseif (!is_array($arFilter["IBLOCK_CODE"]) && strlen($arFilter["IBLOCK_CODE"]) > 0) { $arPropertyFilter["IBLOCK_CODE"] = $arFilter["IBLOCK_CODE"]; } else { continue; } } else { continue; } } $rs_prop = CIBlockProperty::GetList(array("sort" => "asc"), $arPropertyFilter); while ($db_prop = $rs_prop->Fetch()) { $arIBlockAllProps[] = $db_prop; } $iblock_id = false; foreach ($arIBlockAllProps as $db_prop) { if ($db_prop["USER_TYPE"] != "") { $arUserType = CIBlockProperty::GetUserType($db_prop["USER_TYPE"]); if (array_key_exists("ConvertFromDB", $arUserType)) { $arIBlockConvProps["PROPERTY_" . $db_prop["ID"]] = array("ConvertFromDB" => $arUserType["ConvertFromDB"], "PROPERTY" => $db_prop); } } $db_prop["ORIG_ID"] = $db_prop["ID"]; if ($db_prop["MULTIPLE"] == "Y") { $arIBlockMultProps["PROPERTY_" . $db_prop["ID"]] = $db_prop; } $iblock_id = $db_prop["IBLOCK_ID"]; } if ($iblock_id !== false) { if (!array_key_exists($iblock_id, $arJoinProps["FPS"])) { $arJoinProps["FPS"][$iblock_id] = count($arJoinProps["FPS"]); } $iPropCnt = $arJoinProps["FPS"][$iblock_id]; $sSelect .= ", FPS" . $iPropCnt . ".*"; } } elseif (substr($val, 0, 9) == "PROPERTY_") { $PR_ID = strtoupper($val); if (array_key_exists($PR_ID, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$PR_ID] = true; $PR_ID = substr($PR_ID, 9); if (preg_match("/^([^.]+)\\.([^.]+)\$/", $PR_ID, $arMatch)) { $db_prop = CIBlockProperty::GetPropertyArray($arMatch[1], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"])); if (is_array($db_prop) && $db_prop["PROPERTY_TYPE"] == "E") { CIBlockElement::MkPropertySelect($arMatch, $db_prop, $arIBlockLongProps, $arIBlockConvProps, $arJoinProps, $arIBlockMultProps, $arIBlockNumProps, $bWasGroup, $sGroupBy, $sSelect); } } else { if ($db_prop = CIBlockProperty::GetPropertyArray($PR_ID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { CIBlockElement::MkPropertySelect($PR_ID, $db_prop, $arIBlockLongProps, $arIBlockConvProps, $arJoinProps, $arIBlockMultProps, $arIBlockNumProps, $bWasGroup, $sGroupBy, $sSelect); } } } elseif (substr($val, 0, 13) == "PROPERTYSORT_") { $PR_ID = strtoupper($val); if (array_key_exists($PR_ID, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$PR_ID] = true; $PR_ID = substr($PR_ID, 13); if (preg_match("/^([^.]+)\\.([^.]+)\$/", $PR_ID, $arMatch)) { $db_prop = CIBlockProperty::GetPropertyArray($arMatch[1], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"])); if (is_array($db_prop) && $db_prop["PROPERTY_TYPE"] == "E") { CIBlockElement::MkPropertySelect($arMatch, $db_prop, $arIBlockLongProps, $arIBlockConvProps, $arJoinProps, $arIBlockMultProps, $arIBlockNumProps, $bWasGroup, $sGroupBy, $sSelect, true); } } else { if ($db_prop = CIBlockProperty::GetPropertyArray($PR_ID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { CIBlockElement::MkPropertySelect($PR_ID, $db_prop, $arIBlockLongProps, $arIBlockConvProps, $arJoinProps, $arIBlockMultProps, $arIBlockNumProps, $bWasGroup, $sGroupBy, $sSelect, true); } } } elseif ($val == "*") { $bStar = true; } elseif (substr($val, 0, 14) == "CATALOG_GROUP_") { $arAddSelectFields[] = $val; } elseif (substr($val, 0, 21) == "CATALOG_STORE_AMOUNT_") { $arAddSelectFields[] = $val; } elseif (isset($arProductFields[$val])) { $arAddSelectFields[] = $val; } elseif ($val == "RATING_TOTAL_VALUE" || $val == "RATING_TOTAL_VOTES" || $val == "RATING_TOTAL_POSITIVE_VOTES" || $val == "RATING_TOTAL_NEGATIVE_VOTES") { if (array_key_exists($val, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$val] = true; $arSelectFields[$key] = $val; $sSelect .= "," . preg_replace("/^RATING_/", "RV.", $val) . " as " . $val; $arJoinProps["RV"] = true; } elseif ($val == "RATING_USER_VOTE_VALUE") { if (array_key_exists($val, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$val] = true; $arSelectFields[$key] = $val; if (isset($USER) && is_object($USER)) { $sSelect .= "," . $DB->IsNull('RVU.VALUE', '0') . " as " . $val; $arJoinProps["RVU"] = true; } else { $sSelect .= ",0 as " . $val; } } } if ($bStar) { foreach ($arIblockElementFields as $key => $val) { if (array_key_exists($key, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$key] = true; $arSelectFields[] = $key; $sSelect .= "," . $val . " as " . $key; } } elseif ($sGroupBy == "") { //Try to add missing fields for correct URL translation (only then no grouping) if (array_key_exists("DETAIL_PAGE_URL", $arDisplayedColumns)) { $arAddFields = array("LANG_DIR", "ID", "CODE", "EXTERNAL_ID", "IBLOCK_SECTION_ID", "IBLOCK_TYPE_ID", "IBLOCK_ID", "IBLOCK_CODE", "IBLOCK_EXTERNAL_ID", "LID"); } elseif (array_key_exists("CANONICAL_PAGE_URL", $arDisplayedColumns)) { $arAddFields = array("LANG_DIR", "ID", "CODE", "EXTERNAL_ID", "IBLOCK_SECTION_ID", "IBLOCK_TYPE_ID", "IBLOCK_ID", "IBLOCK_CODE", "IBLOCK_EXTERNAL_ID", "LID"); } elseif (array_key_exists("SECTION_PAGE_URL", $arDisplayedColumns)) { $arAddFields = array("LANG_DIR", "ID", "CODE", "EXTERNAL_ID", "IBLOCK_SECTION_ID", "IBLOCK_TYPE_ID", "IBLOCK_ID", "IBLOCK_CODE", "IBLOCK_EXTERNAL_ID", "LID"); } elseif (array_key_exists("LIST_PAGE_URL", $arDisplayedColumns)) { $arAddFields = array("LANG_DIR", "IBLOCK_TYPE_ID", "IBLOCK_ID", "IBLOCK_CODE", "IBLOCK_EXTERNAL_ID", "LID"); } else { $arAddFields = array(); } //Try to add missing fields for correct PREVIEW and DETAIL text formatting if (array_key_exists("DETAIL_TEXT", $arDisplayedColumns)) { $arAddFields[] = "DETAIL_TEXT_TYPE"; } if (array_key_exists("PREVIEW_TEXT", $arDisplayedColumns)) { $arAddFields[] = "PREVIEW_TEXT_TYPE"; } foreach ($arAddFields as $key) { if (array_key_exists($key, $arDisplayedColumns)) { continue; } $arDisplayedColumns[$key] = true; $arSelectFields[] = $key; $sSelect .= "," . $arIblockElementFields[$key] . " as " . $key; } } if ($sGroupBy != "") { $sSelect = substr($sSelect, 1) . ", COUNT(%%_DISTINCT_%% BE.ID) as CNT "; } elseif (strlen($sSelect) > 0) { $sSelect = "%%_DISTINCT_%% " . substr($sSelect, 1) . " "; } } //*********************WHERE PART********************* $arAddWhereFields = array(); if (is_array($arFilter) && array_key_exists("CATALOG", $arFilter)) { $arAddWhereFields = $arFilter["CATALOG"]; unset($arFilter["CATALOG"]); } $arSqlSearch = CIBlockElement::MkFilter($arFilter, $arJoinProps, $arAddWhereFields); $bDistinct = false; $sSectionWhere = ""; $sWhere = ""; foreach ($arSqlSearch as $condition) { if (strlen(trim($condition, "\n\t")) > 0) { $sWhere .= "\n\t\t\tAND (" . $condition . ")"; } } }