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 ); }
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); }
protected function getMixedList($arOrder = array("SORT" => "ASC"), $arFilter = array(), $bIncCnt = false, $arSelectedFields = false) { $arResult = array(); $notFound = false; if (is_array($arFilter["S_ID"]) && sizeof($arFilter["S_ID"]) == 1) { $notFound = $arFilter['S_ID'][0] == 0; } if (!$notFound && !$this->isFiltering()) { $arSectionFilter = array("IBLOCK_ID" => $arFilter["IBLOCK_ID"], "=ID" => $arFilter["S_ID"], "?NAME" => $arFilter["NAME"], ">=TIMESTAMP_X" => $arFilter["DATE_MODIFY_FROM"], "<=TIMESTAMP_X" => $arFilter["DATE_MODIFY_TO"], "CODE" => $arFilter["CODE"], "ACTIVE" => $arFilter["ACTIVE"]); if (isset($arFilter["CHECK_PERMISSIONS"])) { $arSectionFilter['CHECK_PERMISSIONS'] = $arFilter["CHECK_PERMISSIONS"]; $arSectionFilter['MIN_PERMISSION'] = isset($arFilter['MIN_PERMISSION']) ? $arFilter['MIN_PERMISSION'] : 'R'; } if (array_key_exists("SECTION_ID", $arFilter)) { if (!array_key_exists("INCLUDE_SUBSECTIONS", $arFilter)) { $arSectionFilter['SECTION_ID'] = $arFilter['SECTION_ID']; } elseif (!$this->isAdvancedSearchAvailable() && ($margin = $this->getSectionMargin($arFilter['SECTION_ID']))) { $arSectionFilter['>LEFT_MARGIN'] = $margin['LEFT_MARGIN']; $arSectionFilter['<RIGHT_MARGIN'] = $margin['RIGHT_MARGIN']; $arSectionFilter['>DEPTH_LEVEL'] = $margin['DEPTH_LEVEL']; } } $obSection = new \CIBlockSection(); $rsSection = $obSection->GetList($arOrder, $arSectionFilter, $bIncCnt); while ($arSection = $rsSection->Fetch()) { $arSection["TYPE"] = "S"; $arResult[] = $arSection; } } $notFound = false; if (is_array($arFilter["ID"]) && sizeof($arFilter["ID"]) == 1) { $notFound = $arFilter['ID'][0] == 0; } if (!$notFound) { $arElementFilter = array("IBLOCK_ID" => $arFilter["IBLOCK_ID"], "?NAME" => $arFilter["NAME"], "SECTION_ID" => $arFilter["SECTION_ID"], "=ID" => $arFilter["ID"], ">=TIMESTAMP_X" => $arFilter["DATE_MODIFY_FROM"], "<=TIMESTAMP_X" => $arFilter["DATE_MODIFY_TO"], "CODE" => $arFilter["CODE"], "ACTIVE" => $arFilter["ACTIVE"], "WF_STATUS" => $arFilter["WF_STATUS"], 'INCLUDE_SUBSECTIONS' => $arFilter["INCLUDE_SUBSECTIONS"]); if (isset($arFilter["CHECK_PERMISSIONS"])) { $arElementFilter['CHECK_PERMISSIONS'] = $arFilter["CHECK_PERMISSIONS"]; $arElementFilter['MIN_PERMISSION'] = isset($arFilter['MIN_PERMISSION']) ? $arFilter['MIN_PERMISSION'] : 'R'; } foreach ($arFilter as $key => $value) { $op = \CIBlock::MkOperationFilter($key); $newkey = strtoupper($op["FIELD"]); if (substr($newkey, 0, 9) == "PROPERTY_" || substr($newkey, 0, 8) == "CATALOG_") { $arElementFilter[$key] = $value; } } if (strlen($arFilter["SECTION_ID"]) <= 0) { unset($arElementFilter["SECTION_ID"]); } if (!is_array($arSelectedFields)) { $arSelectedFields = array("ID", "IBLOCK_ID", "IBLOCK_SECTION_ID", "ACTIVE", "SORT", "NAME", "PREVIEW_PICTURE", "PREVIEW_TEXT", "PREVIEW_TEXT_TYPE", "DETAIL_PICTURE", "DETAIL_TEXT", "DETAIL_TEXT_TYPE", "SHOW_COUNTER", "SHOW_COUNTER_START", "CODE", "EXTERNAL_ID"); } if (isset($arFilter["CHECK_BP_PERMISSIONS"])) { $arElementFilter["CHECK_BP_PERMISSIONS"] = $arFilter["CHECK_BP_PERMISSIONS"]; } $obElement = new \CIBlockElement(); $rsElement = $obElement->GetList($arOrder, $arElementFilter, false, false, $arSelectedFields); while ($arElement = $rsElement->Fetch()) { $arElement["TYPE"] = "E"; $arResult[] = $arElement; } } $rsResult = new \CDBResult(); $rsResult->InitFromArray($arResult); if ($this->isAdminSection()) { $rsResult = new \CAdminResult($rsResult, $this->getTableId()); $rsResult->NavStart(); } else { $rsResult->NavStart($this->getGridOptions()->GetNavParams()); } return $rsResult; }
function MkFilter($arFilter, &$arJoinProps, &$arAddWhereFields, $level = 0, $bPropertyLeftJoin = false) { global $DB, $USER; $arSqlSearch = array(); $permSQL = ""; $arSectionFilter = array("LOGIC" => "", "BE" => array(), "BS" => array()); $strSqlSearch = ""; if (!is_array($arFilter)) { $arFilter = array(); } foreach ($arFilter as $key => $val) { $key = strtoupper($key); $p = strpos($key, "PROPERTY_"); if ($p !== false && $p < 4) { $arFilter[substr($key, 0, $p) . "PROPERTY"][substr($key, $p + 9)] = $val; unset($arFilter[$key]); } } if (array_key_exists("LOGIC", $arFilter) && $arFilter["LOGIC"] == "OR") { $Logic = "OR"; unset($arFilter["LOGIC"]); $bPropertyLeftJoin = true; } else { $Logic = "AND"; } if ($Logic === "AND" && $level === 0) { $f = new \Bitrix\Iblock\PropertyIndex\QueryBuilder($arFilter["IBLOCK_ID"]); if ($f->isValid()) { $arJoinProps["FC"] = $f->getFilterSql($arFilter, $arSqlSearch); $arJoinProps["FC_DISTINCT"] = $f->getDistinct(); } } foreach ($arFilter as $orig_key => $val) { $res = CIBlock::MkOperationFilter($orig_key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; //it was done before $key = strtoupper($key); switch ($key . "") { case "ACTIVE": case "DETAIL_TEXT_TYPE": case "PREVIEW_TEXT_TYPE": $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "string_equal", $bFullJoinTmp, $cOperationType); break; case "NAME": case "XML_ID": case "TMP_ID": case "DETAIL_TEXT": case "SEARCHABLE_CONTENT": case "PREVIEW_TEXT": case "CODE": case "TAGS": case "WF_COMMENTS": $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "string", $bFullJoinTmp, $cOperationType); break; case "ID": if (is_object($val)) { $arSqlSearch[] = $val->_sql_in("BE." . $key, $cOperationType); } else { $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "number", $bFullJoinTmp, $cOperationType); } break; case "SHOW_COUNTER": case "WF_PARENT_ELEMENT_ID": case "WF_STATUS_ID": case "SORT": case "CREATED_BY": case "PREVIEW_PICTURE": case "DETAIL_PICTURE": $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "number", $bFullJoinTmp, $cOperationType); break; case "IBLOCK_ID": $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "number", $bFullJoinTmp, $cOperationType); break; case "TIMESTAMP_X": case "DATE_CREATE": case "SHOW_COUNTER_START": $arSqlSearch[] = CIBlock::FilterCreateEx("BE." . $key, $val, "date", $bFullJoinTmp, $cOperationType); break; case "EXTERNAL_ID": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.XML_ID", $val, "string", $bFullJoinTmp, $cOperationType); break; case "IBLOCK_TYPE": $flt = CIBlock::FilterCreateEx("B.IBLOCK_TYPE_ID", $val, "string", $bFullJoinTmp, $cOperationType); $arSqlSearch[] = $flt; break; case "CHECK_PERMISSIONS": if ($val == "Y" && (!is_object($USER) || !$USER->IsAdmin())) { $permSQL = CIBlockElement::_check_rights_sql($arFilter["MIN_PERMISSION"]); } break; case "CHECK_BP_PERMISSIONS": if (IsModuleInstalled('bizproc') && (!is_object($USER) || !$USER->IsAdmin())) { if (is_array($val)) { $MODULE_ID = $DB->ForSQL($val["MODULE_ID"]); $ENTITY = $DB->ForSQL($val["ENTITY"]); $PERMISSION = $DB->ForSQL($val["PERMISSION"]); $arUserGroups = array(); if (is_array($val["GROUPS"])) { $USER_ID = intval($val["USER_ID"]); foreach ($val["GROUPS"] as $GROUP_ID) { $GROUP_ID = intval($GROUP_ID); if ($GROUP_ID) { $arUserGroups[$GROUP_ID] = $GROUP_ID; } } } else { $USER_ID = 0; } } else { $MODULE_ID = "iblock"; $ENTITY = "CIBlockDocument"; $PERMISSION = $val; $arUserGroups = false; $USER_ID = 0; } if ($PERMISSION == "read" || $PERMISSION == "write") { if (!is_array($arUserGroups) && is_object($USER)) { $USER_ID = intval($USER->GetID()); $arUserGroups = $USER->GetUserGroupArray(); } if (!is_array($arUserGroups) || count($arUserGroups) <= 0) { $arUserGroups = array(2); } $arSqlSearch[] = "EXISTS (\n\t\t\t\t\t\t\tSELECT S.DOCUMENT_ID_INT\n\t\t\t\t\t\t\tFROM\n\t\t\t\t\t\t\tb_bp_workflow_state S\n\t\t\t\t\t\t\tINNER JOIN b_bp_workflow_permissions P ON S.ID = P.WORKFLOW_ID\n\t\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\t\tS.DOCUMENT_ID_INT = BE.ID\n\t\t\t\t\t\t\t\tAND S.MODULE_ID = '{$MODULE_ID}'\n\t\t\t\t\t\t\t\tAND S.ENTITY = '{$ENTITY}'\n\t\t\t\t\t\t\t\tAND P.PERMISSION = '{$PERMISSION}'\n\t\t\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t\t\tP.OBJECT_ID IN ('" . implode("', '", $arUserGroups) . "')\n\t\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = 'Author' AND BE.CREATED_BY = {$USER_ID})\n\t\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = " . $DB->Concat("'USER_'", "'{$USER_ID}'") . ")\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)"; } } break; case "CHECK_BP_TASKS_PERMISSIONS": if (IsModuleInstalled('bizproc') && CModule::IncludeModule("socialnetwork") && (!is_object($USER) || !$USER->IsAdmin())) { $val = explode("_", $val); $taskType = $val[0]; if (!in_array($taskType, array("user", "group"))) { $taskType = "user"; } $ownerId = intval($val[1]); $val = $val[2]; if (!in_array($val, array("read", "write", "comment"))) { $val = "write"; } $userId = is_object($USER) ? intval($USER->GetID()) : 0; $arUserGroups = array(); if ($taskType == "group") { $r = CSocNetFeaturesPerms::CanPerformOperation($userId, SONET_ENTITY_GROUP, $ownerId, "tasks", $val == "write" ? "edit_tasks" : "view_all"); if ($r) { break; } $arUserGroups[] = SONET_ROLES_ALL; $r = CSocNetUserToGroup::GetUserRole($userId, $ownerId); if (strlen($r) > 0) { $arUserGroups[] = $r; } } else { // $arUserGroups[] = SONET_RELATIONS_TYPE_ALL; // if (CSocNetUserRelations::IsFriends($userId, $ownerId)) // $arUserGroups[] = SONET_RELATIONS_TYPE_FRIENDS; // elseif (CSocNetUserRelations::IsFriends2($userId, $ownerId)) // $arUserGroups[] = SONET_RELATIONS_TYPE_FRIENDS2; } $arSqlSearch[] = "EXISTS (\n\t\t\t\t\t\tSELECT S.DOCUMENT_ID_INT\n\t\t\t\t\t\tFROM\n\t\t\t\t\t\tb_bp_workflow_state S\n\t\t\t\t\t\tINNER JOIN b_bp_workflow_permissions P ON S.ID = P.WORKFLOW_ID\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\tS.DOCUMENT_ID_INT = BE.ID\n\t\t\t\t\t\t\tAND S.MODULE_ID = 'intranet'\n\t\t\t\t\t\t\tAND S.ENTITY = 'CIntranetTasksDocument'\n\t\t\t\t\t\t\tAND P.PERMISSION = '" . $val . "'\n\t\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t\t" . ($taskType == "group" ? "P.OBJECT_ID IN ('" . implode("', '", $arUserGroups) . "') OR" : "") . "\n\t\t\t\t\t\t\t\t(P.OBJECT_ID = 'author' AND BE.CREATED_BY = " . $userId . ")\n\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = 'responsible' AND " . $userId . " IN (\n\t\t\t\t\t\t\t\t\tSELECT SFPV0.VALUE_NUM\n\t\t\t\t\t\t\t\t\tFROM b_iblock_element_property SFPV0\n\t\t\t\t\t\t\t\t\t\tINNER JOIN b_iblock_property SFP0 ON (SFPV0.IBLOCK_PROPERTY_ID = SFP0.ID)\n\t\t\t\t\t\t\t\t\tWHERE " . CIBlock::_Upper("SFP0.CODE") . "='TASKASSIGNEDTO'\n\t\t\t\t\t\t\t\t\t\tAND SFP0.IBLOCK_ID = BE.IBLOCK_ID\n\t\t\t\t\t\t\t\t\t\tAND SFPV0.IBLOCK_ELEMENT_ID = BE.ID\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = 'trackers' AND " . $userId . " IN (\n\t\t\t\t\t\t\t\t\tSELECT SFPV0.VALUE_NUM\n\t\t\t\t\t\t\t\t\tFROM b_iblock_element_property SFPV0\n\t\t\t\t\t\t\t\t\t\tINNER JOIN b_iblock_property SFP0 ON (SFPV0.IBLOCK_PROPERTY_ID = SFP0.ID)\n\t\t\t\t\t\t\t\t\tWHERE " . CIBlock::_Upper("SFP0.CODE") . "='TASKTRACKERS'\n\t\t\t\t\t\t\t\t\t\tAND SFP0.IBLOCK_ID = BE.IBLOCK_ID\n\t\t\t\t\t\t\t\t\t\tAND SFPV0.IBLOCK_ELEMENT_ID = BE.ID\n\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = '" . ("USER_" . $userId) . "')\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)"; } break; case "CHECK_BP_VIRTUAL_PERMISSIONS": if (IsModuleInstalled('bizproc') && (!is_object($USER) || !$USER->IsAdmin())) { if (!in_array($val, array("read", "create", "admin"))) { $val = "admin"; } $userId = is_object($USER) ? intval($USER->GetID()) : 0; if (is_object($USER)) { $arUserGroups = $USER->GetUserGroupArray(); } if (!is_array($arUserGroups) || count($arUserGroups) <= 0) { $arUserGroups = array(2); } $arSqlSearch[] = "EXISTS (\n\t\t\t\t\t\tSELECT S.DOCUMENT_ID_INT\n\t\t\t\t\t\tFROM b_bp_workflow_state S\n\t\t\t\t\t\t\tINNER JOIN b_bp_workflow_permissions P ON S.ID = P.WORKFLOW_ID\n\t\t\t\t\t\tWHERE S.DOCUMENT_ID_INT = BE.ID\n\t\t\t\t\t\t\tAND S.MODULE_ID = 'bizproc'\n\t\t\t\t\t\t\tAND S.ENTITY = 'CBPVirtualDocument'\n\t\t\t\t\t\t\tAND\n\t\t\t\t\t\t\t\t(P.PERMISSION = '" . $val . "'\n\t\t\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t\t\tP.OBJECT_ID IN ('" . implode("', '", $arUserGroups) . "')\n\t\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = 'Author' AND BE.CREATED_BY = " . $userId . ")\n\t\t\t\t\t\t\t\t\tOR (P.OBJECT_ID = " . $DB->Concat("'USER_'", "'" . $userId . "'") . ")\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)"; } break; case "TASKSTATUS": if (IsModuleInstalled('bizproc')) { $arSqlSearch[] = ($cOperationType == "N" ? "NOT " : "") . "EXISTS (\n\t\t\t\t\t\tSELECT S.DOCUMENT_ID_INT\n\t\t\t\t\t\tFROM\n\t\t\t\t\t\tb_bp_workflow_state S\n\t\t\t\t\t\tWHERE\n\t\t\t\t\t\t\tS.DOCUMENT_ID_INT = BE.ID\n\t\t\t\t\t\t\tAND S.MODULE_ID = 'intranet'\n\t\t\t\t\t\t\tAND S.ENTITY = 'CIntranetTasksDocument'\n\t\t\t\t\t\t\tAND S.STATE = '" . $DB->ForSql($val) . "'\n\t\t\t\t\t)"; } break; case "LID": case "SITE_ID": case "IBLOCK_LID": case "IBLOCK_SITE_ID": $flt = CIBlock::FilterCreateEx("SITE_ID", $val, "string_equal", $bFullJoinTmp, $cOperationType); if (strlen($flt)) { $arSqlSearch[] = ($cOperationType == "N" ? "NOT " : "") . "EXISTS (\n\t\t\t\t\t\tSELECT IBLOCK_ID FROM b_iblock_site WHERE IBLOCK_ID = B.ID\n\t\t\t\t\t\tAND " . $flt . "\n\t\t\t\t\t)"; } break; case "DATE_ACTIVE_FROM": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.ACTIVE_FROM", $val, "date", $bFullJoinTmp, $cOperationType); break; case "DATE_ACTIVE_TO": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.ACTIVE_TO", $val, "date", $bFullJoinTmp, $cOperationType); break; case "IBLOCK_ACTIVE": $flt = CIBlock::FilterCreateEx("B.ACTIVE", $val, "string_equal", $bFullJoinTmp, $cOperationType); $arSqlSearch[] = $flt; break; case "IBLOCK_CODE": $flt = CIBlock::FilterCreateEx("B.CODE", $val, "string", $bFullJoinTmp, $cOperationType); $arSqlSearch[] = $flt; break; case "ID_ABOVE": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.ID", $val, "number_above", $bFullJoinTmp, $cOperationType); break; case "ID_LESS": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.ID", $val, "number_less", $bFullJoinTmp, $cOperationType); break; case "ACTIVE_FROM": if (strlen($val) > 0) { $arSqlSearch[] = "(BE.ACTIVE_FROM " . ($cOperationType == "N" ? "<" : ">=") . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? "" : " OR BE.ACTIVE_FROM IS NULL") . ")"; } break; case "ACTIVE_TO": if (strlen($val) > 0) { $arSqlSearch[] = "(BE.ACTIVE_TO " . ($cOperationType == "N" ? ">" : "<=") . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? "" : " OR BE.ACTIVE_TO IS NULL") . ")"; } break; case "ACTIVE_DATE": if (strlen($val) > 0) { $arSqlSearch[] = ($cOperationType == "N" ? " NOT" : "") . "((BE.ACTIVE_TO >= " . $DB->GetNowFunction() . " OR BE.ACTIVE_TO IS NULL) AND (BE.ACTIVE_FROM <= " . $DB->GetNowFunction() . " OR BE.ACTIVE_FROM IS NULL))"; } break; case "DATE_MODIFY_FROM": if (strlen($val) > 0) { $arSqlSearch[] = "(BE.TIMESTAMP_X " . ($cOperationType == "N" ? "<" : ">=") . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? "" : " OR BE.TIMESTAMP_X IS NULL") . ")"; } break; case "DATE_MODIFY_TO": if (strlen($val) > 0) { $arSqlSearch[] = "(BE.TIMESTAMP_X " . ($cOperationType == "N" ? ">" : "<=") . $DB->CharToDateFunction($DB->ForSql($val), "FULL") . ($cOperationType == "N" ? "" : " OR BE.TIMESTAMP_X IS NULL") . ")"; } break; case "WF_NEW": if ($val == "Y" || $val == "N") { $arSqlSearch[] = CIBlock::FilterCreateEx("BE.WF_NEW", "Y", "string_equal", $bFullJoinTmp, $val == "Y" ? false : true, false); } break; case "MODIFIED_USER_ID": case "MODIFIED_BY": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.MODIFIED_BY", $val, "number", $bFullJoinTmp, $cOperationType); break; case "CREATED_USER_ID": case "CREATED_BY": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.CREATED_BY", $val, "number", $bFullJoinTmp, $cOperationType); break; case "RATING_USER_ID": $arSqlSearch[] = CIBlock::FilterCreateEx("RVV.USER_ID", $val, "number", $bFullJoinTmp, $cOperationType); $arJoinProps["RVV"] = array("bFullJoin" => $bFullJoinTmp); break; case "WF_STATUS": $arSqlSearch[] = CIBlock::FilterCreateEx("BE.WF_STATUS_ID", $val, "number", $bFullJoinTmp, $cOperationType); break; case "WF_LOCK_STATUS": if (strlen($val) > 0) { $USER_ID = is_object($USER) ? intval($USER->GetID()) : 0; $arSqlSearch[] = " if(BE.WF_DATE_LOCK is null, 'green', if(DATE_ADD(BE.WF_DATE_LOCK, interval " . COption::GetOptionInt("workflow", "MAX_LOCK_TIME", 60) . " MINUTE)<now(), 'green', if(BE.WF_LOCKED_BY=" . $USER_ID . ", 'yellow', 'red'))) = '" . $DB->ForSql($val) . "'"; } break; case "WF_LAST_STATUS_ID": $arSqlSearch[] = "exists (\n\t\t\t\t\tselect\n\t\t\t\t\t\thistory.ID\n\t\t\t\t\tfrom\n\t\t\t\t\t\tb_iblock_element history\n\t\t\t\t\twhere\n\t\t\t\t\t\thistory.WF_PARENT_ELEMENT_ID = BE.ID\n\t\t\t\t\t\tand history.WF_STATUS_ID = " . intval($val) . "\n\t\t\t\t\t\tand history.ID = (\n\t\t\t\t\t\t\tselect max(history0.ID) LAST_ID\n\t\t\t\t\t\t\tfrom b_iblock_element history0\n\t\t\t\t\t\t\twhere history0.WF_PARENT_ELEMENT_ID = BE.ID\n\t\t\t\t\t\t)\n\t\t\t\t)\n\t\t\t\t"; break; case "SECTION_ACTIVE": if ($arFilter["INCLUDE_SUBSECTIONS"] === "Y") { $arSectionFilter["BS"][] = "BSubS.ACTIVE = 'Y'"; } else { $arSectionFilter["BS"][] = "BS.ACTIVE = 'Y'"; } break; case "SECTION_GLOBAL_ACTIVE": if ($arFilter["INCLUDE_SUBSECTIONS"] === "Y") { $arSectionFilter["BS"][] = "BSubS.GLOBAL_ACTIVE = 'Y'"; } else { $arSectionFilter["BS"][] = "BS.GLOBAL_ACTIVE = 'Y'"; } break; case "SUBSECTION": if (!is_array($val)) { $val = array($val); } //Find out margins of sections $arUnknownMargins = array(); foreach ($val as $i => $section) { if (!is_array($section)) { $arUnknownMargins[intval($section)] = intval($section); } } if (count($arUnknownMargins) > 0) { $rs = $DB->Query("SELECT ID, LEFT_MARGIN, RIGHT_MARGIN FROM b_iblock_section WHERE ID in (" . implode(", ", $arUnknownMargins) . ")"); while ($ar = $rs->Fetch()) { $arUnknownMargins[intval($ar["ID"])] = array(intval($ar["LEFT_MARGIN"]), intval($ar["RIGHT_MARGIN"])); } foreach ($val as $i => $section) { if (!is_array($section)) { $val[$i] = $arUnknownMargins[intval($section)]; } } } //Now sort them out $arMargins = array(); foreach ($val as $i => $section) { if (is_array($section) && count($section) == 2) { $left = intval($section[0]); $right = intval($section[1]); if ($left > 0 && $right > 0) { $arMargins[$left] = $right; } } } ksort($arMargins); //Remove subsubsections of the sections $prev_right = 0; foreach ($arMargins as $left => $right) { if ($right <= $prev_right) { unset($arMargins[$left]); } else { $prev_right = $right; } } if (isset($arFilter["INCLUDE_SUBSECTIONS"]) && $arFilter["INCLUDE_SUBSECTIONS"] === "Y") { $bsAlias = "BSubS"; } else { $bsAlias = "BS"; } $res = ""; foreach ($arMargins as $left => $right) { if ($res != "") { $res .= $cOperationType == "N" ? " AND " : " OR "; } $res .= ($cOperationType == "N" ? " NOT " : " ") . "({$bsAlias}.LEFT_MARGIN >= " . $left . " AND {$bsAlias}.RIGHT_MARGIN <= " . $right . ")\n"; } if ($res != "") { $arSectionFilter["BS"][] = "(" . $res . ")"; } break; case "SECTION_ID": if (!is_array($val)) { $val = array($val); } $arSections = array(); foreach ($val as $section_id) { $section_id = intval($section_id); $arSections[$section_id] = $section_id; } if ($cOperationType == "N") { if (array_key_exists(0, $arSections)) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS<>'N'"; $arSectionFilter["LOGIC"] = "AND"; unset($arSections[0]); if (count($arSections) > 0) { $arSectionFilter["BS"][] = "BS.ID NOT IN (" . implode(", ", $arSections) . ")"; } } elseif (count($arSections) > 0) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS='N'"; $arSectionFilter["LOGIC"] = "OR"; $arSectionFilter["BS"][] = "BS.ID NOT IN (" . implode(", ", $arSections) . ")"; } } else { if (array_key_exists(0, $arSections)) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS='N'"; $arSectionFilter["LOGIC"] = "OR"; unset($arSections[0]); } if (count($arSections) > 0) { $arSectionFilter["BS"][] = "BS.ID IN (" . implode(", ", $arSections) . ")"; } } break; case "SECTION_CODE": if (!is_array($val)) { $val = array($val); } $arSections = array(); foreach ($val as $section_code) { $section_code = $DB->ForSql($section_code); $arSections[$section_code] = $section_code; } if ($cOperationType == "N") { if (array_key_exists("", $arSections)) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS<>'N'"; $arSectionFilter["LOGIC"] = "AND"; unset($arSections[""]); if (count($arSections) > 0) { $arSectionFilter["BS"][] = "BS.CODE NOT IN ('" . implode("', '", $arSections) . "')"; } } elseif (count($arSections) > 0) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS='N'"; $arSectionFilter["LOGIC"] = "OR"; $arSectionFilter["BS"][] = "BS.CODE NOT IN ('" . implode("', '", $arSections) . "')"; } } else { if (array_key_exists("", $arSections)) { $arSectionFilter["BE"][] = "BE.IN_SECTIONS='N'"; $arSectionFilter["LOGIC"] = "OR"; unset($arSections[""]); } if (count($arSections) > "") { $arSectionFilter["BS"][] = "BS.CODE IN ('" . implode("', '", $arSections) . "')"; } } break; case "PROPERTY": foreach ($val as $propID => $propVAL) { $res = CIBlock::MkOperationFilter($propID); $res["LOGIC"] = $Logic; $res["LEFT_JOIN"] = $bPropertyLeftJoin; if (preg_match("/^([^.]+)\\.([^.]+)\$/", $res["FIELD"], $arMatch)) { $db_prop = CIBlockProperty::GetPropertyArray($arMatch[1], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"], $arFilter["~IBLOCK_ID"], $arFilter["~IBLOCK_CODE"])); if (is_array($db_prop) && $db_prop["PROPERTY_TYPE"] == "E") { $res["FIELD"] = $arMatch; CIBlockElement::MkPropertyFilter($res, $cOperationType, $propVAL, $db_prop, $arJoinProps, $arSqlSearch); } } else { if ($db_prop = CIBlockProperty::GetPropertyArray($res["FIELD"], CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"], $arFilter["~IBLOCK_ID"], $arFilter["~IBLOCK_CODE"]))) { CIBlockElement::MkPropertyFilter($res, $cOperationType, $propVAL, $db_prop, $arJoinProps, $arSqlSearch); } } } break; default: if (is_numeric($orig_key)) { //Here is hint for better property resolution: if (!is_array($val) || !array_key_exists("~IBLOCK_ID", $val)) { if (array_key_exists("IBLOCK_ID", $arFilter)) { $val["~IBLOCK_ID"] = $arFilter["IBLOCK_ID"]; } elseif (array_key_exists("~IBLOCK_ID", $arFilter)) { $val["~IBLOCK_ID"] = $arFilter["~IBLOCK_ID"]; } } if (!is_array($val) || !array_key_exists("~IBLOCK_CODE", $val)) { if (array_key_exists("IBLOCK_CODE", $arFilter)) { $val["~IBLOCK_CODE"] = $arFilter["IBLOCK_CODE"]; } elseif (array_key_exists("~IBLOCK_CODE", $arFilter)) { $val["~IBLOCK_CODE"] = $arFilter["~IBLOCK_CODE"]; } } //Subfilter process $arSubSqlSearch = CIBlockElement::MkFilter($val, $arJoinProps, $arAddWhereFields, $level + 1, $bPropertyLeftJoin); if (strlen(trim($arSubSqlSearch[0], "\n\t"))) { $arSqlSearch[] = str_replace("\n\t\t\t", "\n\t\t\t\t", $arSubSqlSearch[0]); } } elseif (strtoupper(substr($key, 0, 8)) == "CATALOG_" && CModule::IncludeModule("catalog")) { $res_catalog = CCatalogProduct::GetQueryBuildArrays(array(), array($orig_key => $val), array()); if (strlen($res_catalog["WHERE"])) { $arSqlSearch[] = substr($res_catalog["WHERE"], 5); // " AND ".$res $arAddWhereFields[$orig_key] = $val; } } break; } } //SECTION sub filter $sWhere = ""; foreach ($arSectionFilter["BS"] as $strFilter) { if (strlen($strFilter)) { if (strlen($sWhere)) { $sWhere .= " " . $Logic . " "; } $sWhere .= "(" . $strFilter . ")"; } } $bINCLUDE_SUBSECTIONS = isset($arFilter["INCLUDE_SUBSECTIONS"]) && $arFilter["INCLUDE_SUBSECTIONS"] === "Y"; if (strlen($sWhere)) { $sectionScope = ""; if (isset($arFilter["SECTION_SCOPE"])) { if ($arFilter["SECTION_SCOPE"] == "IBLOCK") { $sectionScope = "AND BSE.ADDITIONAL_PROPERTY_ID IS NULL"; } elseif ($arFilter["SECTION_SCOPE"] == "PROPERTY") { $sectionScope = "AND BSE.ADDITIONAL_PROPERTY_ID IS NOT NULL"; } elseif (preg_match("/^PROPERTY_(\\d+)\$/", $arFilter["SECTION_SCOPE"], $match)) { $sectionScope = "AND BSE.ADDITIONAL_PROPERTY_ID = " . $match[1]; } } //Try to convert correlated subquery to join subquery if ($level == 0 && $Logic == "AND" && !count($arSectionFilter["BE"])) { $arJoinProps["BES"] .= " INNER JOIN (\n\t\t\t\t\tSELECT DISTINCT BSE.IBLOCK_ELEMENT_ID\n\t\t\t\t\tFROM b_iblock_section_element BSE\n\t\t\t\t\t" . ($bINCLUDE_SUBSECTIONS ? "\n\t\t\t\t\tINNER JOIN b_iblock_section BSubS ON BSE.IBLOCK_SECTION_ID = BSubS.ID\n\t\t\t\t\tINNER JOIN b_iblock_section BS ON (BSubS.IBLOCK_ID=BS.IBLOCK_ID\n\t\t\t\t\t\tAND BSubS.LEFT_MARGIN>=BS.LEFT_MARGIN\n\t\t\t\t\t\tAND BSubS.RIGHT_MARGIN<=BS.RIGHT_MARGIN)\n\t\t\t\t\t" : "\n\t\t\t\t\tINNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID\n\t\t\t\t\t") . "\n\t\t\t\t\tWHERE (" . $sWhere . "){$sectionScope}\n\t\t\t\t\t) BES ON BES.IBLOCK_ELEMENT_ID = BE.ID\n"; } else { $arSqlSearch[] = "(" . (count($arSectionFilter["BE"]) ? implode(" " . $arSectionFilter["LOGIC"] . " ", $arSectionFilter["BE"]) . " " . $arSectionFilter["LOGIC"] : "") . " EXISTS (\n\t\t\t\t\tSELECT BSE.IBLOCK_ELEMENT_ID\n\t\t\t\t\tFROM b_iblock_section_element BSE\n\t\t\t\t\t" . ($bINCLUDE_SUBSECTIONS ? "\n\t\t\t\t\tINNER JOIN b_iblock_section BSubS ON BSE.IBLOCK_SECTION_ID = BSubS.ID\n\t\t\t\t\tINNER JOIN b_iblock_section BS ON (BSubS.IBLOCK_ID=BS.IBLOCK_ID\n\t\t\t\t\t\tAND BSubS.LEFT_MARGIN>=BS.LEFT_MARGIN\n\t\t\t\t\t\tAND BSubS.RIGHT_MARGIN<=BS.RIGHT_MARGIN)\n\t\t\t\t\t" : "\n\t\t\t\t\tINNER JOIN b_iblock_section BS ON BSE.IBLOCK_SECTION_ID = BS.ID\n\t\t\t\t\t") . "\n\t\t\t\t\tWHERE BSE.IBLOCK_ELEMENT_ID = BE.ID\n\t\t\t\t\tAND (" . $sWhere . "){$sectionScope}\n\t\t\t\t\t))"; } } elseif (count($arSectionFilter["BE"])) { foreach ($arSectionFilter["BE"] as $strFilter) { $arSqlSearch[] = $strFilter; } } $sWhere = ""; foreach ($arSqlSearch as $strFilter) { if (strlen(trim($strFilter, "\n\t"))) { if (strlen($sWhere)) { $sWhere .= "\n\t\t\t\t" . $Logic . " "; } else { $sWhere .= "\n\t\t\t\t"; } $sWhere .= "(" . $strFilter . ")"; } } $arSqlSearch = array("\n\t\t\t" . $sWhere . "\n\t\t\t"); $SHOW_BP_NEW = ""; $SHOW_NEW = isset($arFilter["SHOW_NEW"]) && $arFilter["SHOW_NEW"] == "Y" ? "Y" : "N"; if ($SHOW_NEW == "Y" && isset($arFilter["SHOW_BP_NEW"]) && is_array($arFilter["SHOW_BP_NEW"]) && IsModuleInstalled('bizproc') && (!is_object($USER) || !$USER->IsAdmin())) { $MODULE_ID = $DB->ForSQL($arFilter["SHOW_BP_NEW"]["MODULE_ID"]); $ENTITY = $DB->ForSQL($arFilter["SHOW_BP_NEW"]["ENTITY"]); $PERMISSION = $DB->ForSQL($arFilter["SHOW_BP_NEW"]["PERMISSION"]); $arUserGroups = array(); if (is_array($arFilter["SHOW_BP_NEW"]["GROUPS"])) { $USER_ID = intval($arFilter["SHOW_BP_NEW"]["USER_ID"]); foreach ($arFilter["SHOW_BP_NEW"]["GROUPS"] as $GROUP_ID) { $GROUP_ID = intval($GROUP_ID); if ($GROUP_ID) { $arUserGroups[$GROUP_ID] = $GROUP_ID; } } } else { $USER_ID = false; $arUserGroups = false; } if ($PERMISSION == "read" || $PERMISSION == "write") { if (!is_array($arUserGroups)) { $USER_ID = is_object($USER) ? intval($USER->GetID()) : 0; if (is_object($USER)) { $arUserGroups = $USER->GetUserGroupArray(); } } if (!is_array($arUserGroups) || count($arUserGroups) <= 0) { $arUserGroups = array(2); } $SHOW_BP_NEW = " AND EXISTS (\n\t\t\t\t\tSELECT S.DOCUMENT_ID_INT\n\t\t\t\t\tFROM\n\t\t\t\t\tb_bp_workflow_state S\n\t\t\t\t\tINNER JOIN b_bp_workflow_permissions P ON S.ID = P.WORKFLOW_ID\n\t\t\t\t\tWHERE\n\t\t\t\t\t\tS.DOCUMENT_ID_INT = BE.ID\n\t\t\t\t\t\tAND S.MODULE_ID = '{$MODULE_ID}'\n\t\t\t\t\t\tAND S.ENTITY = '{$ENTITY}'\n\t\t\t\t\t\tAND P.PERMISSION = '{$PERMISSION}'\n\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\tP.OBJECT_ID IN ('" . implode("', '", $arUserGroups) . "')\n\t\t\t\t\t\t\tOR (P.OBJECT_ID = 'Author' AND BE.CREATED_BY = {$USER_ID})\n\t\t\t\t\t\t\tOR (P.OBJECT_ID = " . $DB->Concat("'USER_'", "'{$USER_ID}'") . ")\n\t\t\t\t\t\t)\n\t\t\t\t)"; } } if (!isset($arFilter["SHOW_HISTORY"]) || $arFilter["SHOW_HISTORY"] != "Y") { $arSqlSearch[] = "((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL)" . ($SHOW_NEW == "Y" ? " OR (BE.WF_NEW='Y'" . $SHOW_BP_NEW . ")" : "") . ")"; } if ($permSQL) { $arSqlSearch[] = $permSQL; } if (isset($this) && is_object($this) && isset($this->subQueryProp)) { //Subquery list value should not be null $this->MkPropertyFilter(CIBlock::MkOperationFilter("!" . substr($this->strField, 9)), "NE", false, $this->subQueryProp, $arJoinProps, $arSqlSearch); } return $arSqlSearch; }
function GetSectionElementsCount($ID, $arFilter = array()) { global $DB, $USER; $arJoinProps = array(); $bJoinFlatProp = false; $arSqlSearch = array(); if (array_key_exists("PROPERTY", $arFilter)) { $val = $arFilter["PROPERTY"]; foreach ($val as $propID => $propVAL) { $res = CIBlock::MkOperationFilter($propID); $propID = $res["FIELD"]; $cOperationType = $res["OPERATION"]; if ($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { $bSave = false; if (array_key_exists($db_prop["ID"], $arJoinProps)) { $iPropCnt = $arJoinProps[$db_prop["ID"]]; } elseif ($db_prop["VERSION"] != 2 || $db_prop["MULTIPLE"] == "Y") { $bSave = true; $iPropCnt = count($arJoinProps); } if (!is_array($propVAL)) { $propVAL = array($propVAL); } if ($db_prop["PROPERTY_TYPE"] == "N" || $db_prop["PROPERTY_TYPE"] == "G" || $db_prop["PROPERTY_TYPE"] == "E") { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { $r = CIBlock::FilterCreate("FPS.PROPERTY_" . $db_prop["ORIG_ID"], $propVAL, "number", $cOperationType); $bJoinFlatProp = $db_prop["IBLOCK_ID"]; } else { $r = CIBlock::FilterCreate("FPV" . $iPropCnt . ".VALUE_NUM", $propVAL, "number", $cOperationType); } } else { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { $r = CIBlock::FilterCreate("FPS.PROPERTY_" . $db_prop["ORIG_ID"], $propVAL, "string", $cOperationType); $bJoinFlatProp = $db_prop["IBLOCK_ID"]; } else { $r = CIBlock::FilterCreate("FPV" . $iPropCnt . ".VALUE", $propVAL, "string", $cOperationType); } } if (strlen($r) > 0) { if ($bSave) { $db_prop["iPropCnt"] = $iPropCnt; $arJoinProps[$db_prop["ID"]] = $db_prop; } $arSqlSearch[] = $r; } } } } $strSqlSearch = ""; foreach ($arSqlSearch as $r) { if (strlen($r) > 0) { $strSqlSearch .= "\n\t\t\t\tAND (" . $r . ") "; } } $strSqlSearchProp = ""; foreach ($arJoinProps as $propID => $db_prop) { if ($db_prop["VERSION"] == 2) { $strTable = "b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"]; } else { $strTable = "b_iblock_element_property"; } $i = $db_prop["iPropCnt"]; $strSqlSearchProp .= "\n\t\t\t\tINNER JOIN b_iblock_property FP" . $i . " ON FP" . $i . ".IBLOCK_ID=BS.IBLOCK_ID AND\n\t\t\t\t" . (IntVal($propID) > 0 ? " FP" . $i . ".ID=" . IntVal($propID) . " " : " FP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "' ") . "\n\t\t\t\tINNER JOIN " . $strTable . " FPV" . $i . " ON FP" . $i . ".ID=FPV" . $i . ".IBLOCK_PROPERTY_ID AND FPV" . $i . ".IBLOCK_ELEMENT_ID=BE.ID\n\t\t\t"; } if ($bJoinFlatProp) { $strSqlSearchProp .= "\n\t\t\t\tINNER JOIN b_iblock_element_prop_s" . $bJoinFlatProp . " FPS ON FPS.IBLOCK_ELEMENT_ID = BE.ID\n\t\t\t"; } $strHint = $DB->type == "MYSQL" ? "STRAIGHT_JOIN" : ""; $strSql = "\n\t\t\tSELECT " . $strHint . " COUNT(DISTINCT BE.ID) as CNT\n\t\t\tFROM b_iblock_section BS\n\t\t\t\tINNER JOIN b_iblock_section BSTEMP ON (BSTEMP.IBLOCK_ID=BS.IBLOCK_ID\n\t\t\t\t\tAND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN\n\t\t\t\t\tAND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN)\n\t\t\t\tINNER JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID\n\t\t\t\tINNER JOIN b_iblock_element BE ON BE.ID=BSE.IBLOCK_ELEMENT_ID AND BE.IBLOCK_ID=BS.IBLOCK_ID\n\t\t\t" . $strSqlSearchProp . "\n\t\t\tWHERE BS.ID=" . IntVal($ID) . "\n\t\t\t\tAND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )\n\t\t\t\t" . ($arFilter["CNT_ALL"] == "Y" ? " OR BE.WF_NEW='Y' " : "") . ")\n\t\t\t\t" . ($arFilter["CNT_ACTIVE"] == "Y" ? " AND BE.ACTIVE='Y'\n\t\t\t\t\tAND (BE.ACTIVE_TO >= " . $DB->CurrentTimeFunction() . " OR BE.ACTIVE_TO IS NULL)\n\t\t\t\t\tAND (BE.ACTIVE_FROM <= " . $DB->CurrentTimeFunction() . " OR BE.ACTIVE_FROM IS NULL)" : "") . "\n\t\t\t\t" . $strSqlSearch; //echo "<pre>",htmlspecialcharsbx($strSql),"</pre>"; $res = $DB->Query($strSql); $res = $res->Fetch(); return $res["CNT"]; }
protected function UpdateList($arFields, $arFilter = array()) { global $DB, $USER, $USER_FIELD_MANAGER; $strUpdate = $DB->PrepareUpdate("b_iblock_section", $arFields, "iblock", false, "BS"); if ($strUpdate == "") { return false; } if (isset($arFilter["IBLOCK_ID"]) && $arFilter["IBLOCK_ID"] > 0) { $obUserFieldsSql = new CUserTypeSQL(); $obUserFieldsSql->SetEntity("IBLOCK_" . $arFilter["IBLOCK_ID"] . "_SECTION", "BS.ID"); $obUserFieldsSql->SetFilter($arFilter); } else { foreach ($arFilter as $key => $val) { $res = CIBlock::MkOperationFilter($key); if (preg_match("/^UF_/", $res["FIELD"])) { trigger_error("arFilter parameter of the CIBlockSection::GetList contains user fields, but has no IBLOCK_ID field.", E_USER_WARNING); break; } } } $arJoinProps = array(); $bJoinFlatProp = false; $arSqlSearch = CIBlockSection::GetFilter($arFilter); $bCheckPermissions = !array_key_exists("CHECK_PERMISSIONS", $arFilter) || $arFilter["CHECK_PERMISSIONS"] !== "N"; $bIsAdmin = is_object($USER) && $USER->IsAdmin(); if ($bCheckPermissions && !$bIsAdmin) { $arSqlSearch[] = CIBlockSection::_check_rights_sql($arFilter["MIN_PERMISSION"]); } if (array_key_exists("PROPERTY", $arFilter)) { $val = $arFilter["PROPERTY"]; foreach ($val as $propID => $propVAL) { $res = CIBlock::MkOperationFilter($propID); $propID = $res["FIELD"]; $cOperationType = $res["OPERATION"]; if ($db_prop = CIBlockProperty::GetPropertyArray($propID, CIBlock::_MergeIBArrays($arFilter["IBLOCK_ID"], $arFilter["IBLOCK_CODE"]))) { $bSave = false; if (array_key_exists($db_prop["ID"], $arJoinProps)) { $iPropCnt = $arJoinProps[$db_prop["ID"]]; } elseif ($db_prop["VERSION"] != 2 || $db_prop["MULTIPLE"] == "Y") { $bSave = true; $iPropCnt = count($arJoinProps); } if (!is_array($propVAL)) { $propVAL = array($propVAL); } if ($db_prop["PROPERTY_TYPE"] == "N" || $db_prop["PROPERTY_TYPE"] == "G" || $db_prop["PROPERTY_TYPE"] == "E") { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { $r = CIBlock::FilterCreate("FPS.PROPERTY_" . $db_prop["ORIG_ID"], $propVAL, "number", $cOperationType); $bJoinFlatProp = $db_prop["IBLOCK_ID"]; } else { $r = CIBlock::FilterCreate("FPV" . $iPropCnt . ".VALUE_NUM", $propVAL, "number", $cOperationType); } } else { if ($db_prop["VERSION"] == 2 && $db_prop["MULTIPLE"] == "N") { $r = CIBlock::FilterCreate("FPS.PROPERTY_" . $db_prop["ORIG_ID"], $propVAL, "string", $cOperationType); $bJoinFlatProp = $db_prop["IBLOCK_ID"]; } else { $r = CIBlock::FilterCreate("FPV" . $iPropCnt . ".VALUE", $propVAL, "string", $cOperationType); } } if (strlen($r) > 0) { if ($bSave) { $db_prop["iPropCnt"] = $iPropCnt; $arJoinProps[$db_prop["ID"]] = $db_prop; } $arSqlSearch[] = $r; } } } } $strSqlSearch = ""; foreach ($arSqlSearch as $r) { if (strlen($r) > 0) { $strSqlSearch .= "\n\t\t\t\tAND (" . $r . ") "; } } if (isset($obUserFieldsSql)) { $r = $obUserFieldsSql->GetFilter(); if (strlen($r) > 0) { $strSqlSearch .= "\n\t\t\t\tAND (" . $r . ") "; } } $strProp1 = ""; foreach ($arJoinProps as $propID => $db_prop) { if ($db_prop["VERSION"] == 2) { $strTable = "b_iblock_element_prop_m" . $db_prop["IBLOCK_ID"]; } else { $strTable = "b_iblock_element_property"; } $i = $db_prop["iPropCnt"]; $strProp1 .= "\n\t\t\t\tLEFT JOIN b_iblock_property FP" . $i . " ON FP" . $i . ".IBLOCK_ID=B.ID AND\n\t\t\t\t" . (IntVal($propID) > 0 ? " FP" . $i . ".ID=" . IntVal($propID) . " " : " FP" . $i . ".CODE='" . $DB->ForSQL($propID, 200) . "' ") . "\n\t\t\t\tLEFT JOIN " . $strTable . " FPV" . $i . " ON FP" . $i . ".ID=FPV" . $i . ".IBLOCK_PROPERTY_ID AND FPV" . $i . ".IBLOCK_ELEMENT_ID=BE.ID "; } if ($bJoinFlatProp) { $strProp1 .= "\n\t\t\t\tLEFT JOIN b_iblock_element_prop_s" . $bJoinFlatProp . " FPS ON FPS.IBLOCK_ELEMENT_ID = BE.ID\n\t\t\t"; } $strSql = "\n\t\t\tUPDATE\n\t\t\tb_iblock_section BS\n\t\t\t\tINNER JOIN b_iblock B ON BS.IBLOCK_ID = B.ID\n\t\t\t\t" . (isset($obUserFieldsSql) ? $obUserFieldsSql->GetJoin("BS.ID") : "") . "\n\t\t\t" . (strlen($strProp1) > 0 ? "\tINNER JOIN b_iblock_section BSTEMP ON BSTEMP.IBLOCK_ID = BS.IBLOCK_ID\n\t\t\t\t\tLEFT JOIN b_iblock_section_element BSE ON BSE.IBLOCK_SECTION_ID=BSTEMP.ID\n\t\t\t\t\tLEFT JOIN b_iblock_element BE ON (BSE.IBLOCK_ELEMENT_ID=BE.ID\n\t\t\t\t\t\tAND ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )\n\t\t\t\t\t\tAND BE.IBLOCK_ID = BS.IBLOCK_ID\n\t\t\t\t" . ($arFilter["CNT_ALL"] == "Y" ? " OR BE.WF_NEW='Y' " : "") . ")\n\t\t\t\t" . ($arFilter["CNT_ACTIVE"] == "Y" ? " AND BE.ACTIVE='Y'\n\t\t\t\t\tAND (BE.ACTIVE_TO >= " . $DB->CurrentTimeFunction() . " OR BE.ACTIVE_TO IS NULL)\n\t\t\t\t\tAND (BE.ACTIVE_FROM <= " . $DB->CurrentTimeFunction() . " OR BE.ACTIVE_FROM IS NULL)" : "") . ")\n\t\t\t\t\t" . $strProp1 . " " : "") . "\n\t\t\tSET " . $strUpdate . "\n\t\t\tWHERE 1=1\n\t\t\t" . (strlen($strProp1) > 0 ? "\tAND BSTEMP.LEFT_MARGIN >= BS.LEFT_MARGIN\n\t\t\t\t\tAND BSTEMP.RIGHT_MARGIN <= BS.RIGHT_MARGIN " : "") . "\n\t\t\t" . $strSqlSearch . "\n\t\t"; return $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__); }
public static function GetList($arOrder = array("SORT" => "ASC"), $arFilter = array(), $bIncCnt = false) { global $DB, $USER; $strSqlSearch = ""; $bAddSites = false; foreach ($arFilter as $key => $val) { $res = CIBlock::MkOperationFilter($key); $key = strtoupper($res["FIELD"]); $cOperationType = $res["OPERATION"]; switch ($key) { case "ACTIVE": $sql = CIBlock::FilterCreate("B.ACTIVE", $val, "string_equal", $cOperationType); break; case "LID": case "SITE_ID": $sql = CIBlock::FilterCreate("BS.SITE_ID", $val, "string_equal", $cOperationType); if (strlen($sql)) { $bAddSites = true; } break; case "NAME": case "CODE": case "XML_ID": case "PROPERTY_INDEX": $sql = CIBlock::FilterCreate("B." . $key, $val, "string", $cOperationType); break; case "EXTERNAL_ID": $sql = CIBlock::FilterCreate("B.XML_ID", $val, "string", $cOperationType); break; case "TYPE": $sql = CIBlock::FilterCreate("B.IBLOCK_TYPE_ID", $val, "string", $cOperationType); break; case "ID": case "VERSION": case "SOCNET_GROUP_ID": $sql = CIBlock::FilterCreate("B." . $key, $val, "number", $cOperationType); break; default: $sql = ""; break; } if (strlen($sql)) { $strSqlSearch .= " AND (" . $sql . ") "; } } $bCheckPermissions = !array_key_exists("CHECK_PERMISSIONS", $arFilter) || $arFilter["CHECK_PERMISSIONS"] !== "N" || array_key_exists("OPERATION", $arFilter); $bIsAdmin = is_object($USER) && $USER->IsAdmin(); if ($bCheckPermissions && !$bIsAdmin) { $min_permission = strlen($arFilter["MIN_PERMISSION"]) == 1 ? $arFilter["MIN_PERMISSION"] : "R"; if (is_object($USER)) { $iUserID = intval($USER->GetID()); $strGroups = $USER->GetGroups(); $bAuthorized = $USER->IsAuthorized(); } else { $iUserID = 0; $strGroups = "2"; $bAuthorized = false; } $stdPermissions = "\n\t\t\t\tSELECT IBLOCK_ID\n\t\t\t\tFROM b_iblock_group IBG\n\t\t\t\tWHERE IBG.GROUP_ID IN (" . $strGroups . ")\n\t\t\t\tAND IBG.PERMISSION >= '" . $min_permission . "'\n\t\t\t"; if (!defined("ADMIN_SECTION")) { $stdPermissions .= "\n\t\t\t\t\tAND (IBG.PERMISSION='X' OR B.ACTIVE='Y')\n\t\t\t\t"; } if (strlen($arFilter["OPERATION"]) > 0) { $operation = "'" . $DB->ForSql($arFilter["OPERATION"]) . "'"; } elseif ($min_permission >= "X") { $operation = "'iblock_edit'"; } elseif ($min_permission >= "U") { $operation = "'element_edit'"; } elseif ($min_permission >= "S") { $operation = "'iblock_admin_display'"; } else { $operation = "'section_read', 'element_read', 'section_element_bind', 'section_section_bind'"; } if ($operation) { $acc = new CAccess(); $acc->UpdateCodes(); $extPermissions = "\n\t\t\t\t\tSELECT IBLOCK_ID\n\t\t\t\t\tFROM b_iblock_right IBR\n\t\t\t\t\tINNER JOIN b_task_operation T ON T.TASK_ID = IBR.TASK_ID\n\t\t\t\t\tINNER JOIN b_operation O ON O.ID = T.OPERATION_ID\n\t\t\t\t\t" . ($iUserID > 0 ? "LEFT" : "INNER") . " JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = " . $iUserID . "\n\t\t\t\t\tWHERE IBR.ENTITY_TYPE = 'iblock'\n\t\t\t\t\tAND O.NAME in (" . $operation . ")\n\t\t\t\t\t" . ($bAuthorized ? "AND (UA.USER_ID IS NOT NULL OR IBR.GROUP_CODE = 'AU')" : "") . "\n\t\t\t\t"; $sqlPermissions = "AND (\n\t\t\t\t\tB.ID IN ({$stdPermissions})\n\t\t\t\t\tOR (B.RIGHTS_MODE = 'E' AND B.ID IN ({$extPermissions}))\n\t\t\t\t)"; } else { $sqlPermissions = "AND (\n\t\t\t\t\tB.ID IN ({$stdPermissions})\n\t\t\t\t)"; } } else { $sqlPermissions = ""; } if ($bAddSites) { $sqlJoinSites = "LEFT JOIN b_iblock_site BS ON B.ID=BS.IBLOCK_ID\n\t\t\t\t\tLEFT JOIN b_lang L ON L.LID=BS.SITE_ID"; } else { $sqlJoinSites = "INNER JOIN b_lang L ON L.LID=B.LID"; } if (!$bIncCnt) { $strSql = "\n\t\t\t\tSELECT DISTINCT\n\t\t\t\t\tB.*\n\t\t\t\t\t,B.XML_ID as EXTERNAL_ID\n\t\t\t\t\t," . $DB->DateToCharFunction("B.TIMESTAMP_X") . " as TIMESTAMP_X\n\t\t\t\t\t,L.DIR as LANG_DIR\n\t\t\t\t\t,L.SERVER_NAME\n\t\t\t\tFROM\n\t\t\t\t\tb_iblock B\n\t\t\t\t\t" . $sqlJoinSites . "\n\t\t\t\tWHERE 1 = 1\n\t\t\t\t\t" . $sqlPermissions . "\n\t\t\t\t\t" . $strSqlSearch . "\n\t\t\t"; } else { $strSql = "\n\t\t\t\tSELECT\n\t\t\t\t\tB.*\n\t\t\t\t\t,B.XML_ID as EXTERNAL_ID\n\t\t\t\t\t," . $DB->DateToCharFunction("B.TIMESTAMP_X") . " as TIMESTAMP_X\n\t\t\t\t\t,L.DIR as LANG_DIR\n\t\t\t\t\t,L.SERVER_NAME\n\t\t\t\t\t,COUNT(DISTINCT BE.ID) as ELEMENT_CNT\n\t\t\t\tFROM\n\t\t\t\t\tb_iblock B\n\t\t\t\t\t" . $sqlJoinSites . "\n\t\t\t\t\tLEFT JOIN b_iblock_element BE ON (BE.IBLOCK_ID=B.ID\n\t\t\t\t\t\tAND (\n\t\t\t\t\t\t\t(BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL )\n\t\t\t\t\t\t\t" . ($arFilter["CNT_ALL"] == "Y" ? " OR BE.WF_NEW='Y' " : "") . "\n\t\t\t\t\t\t)\n\t\t\t\t\t\t" . ($arFilter["CNT_ACTIVE"] == "Y" ? "AND BE.ACTIVE='Y'\n\t\t\t\t\t\tAND (BE.ACTIVE_TO >= " . $DB->CurrentDateFunction() . " OR BE.ACTIVE_TO IS NULL)\n\t\t\t\t\t\tAND (BE.ACTIVE_FROM <= " . $DB->CurrentDateFunction() . " OR BE.ACTIVE_FROM IS NULL)\n\t\t\t\t\t\t" : "") . "\n\t\t\t\t\t)\n\t\t\t\tWHERE 1 = 1\n\t\t\t\t\t" . $sqlPermissions . "\n\t\t\t\t\t" . $strSqlSearch . "\n\t\t\t\tGROUP BY B.ID\n\t\t\t"; } $arSqlOrder = array(); if (is_array($arOrder)) { foreach ($arOrder as $by => $order) { $by = strtolower($by); $order = strtolower($order); if ($order != "asc") { $order = "desc"; } if ($by == "id") { $arSqlOrder[$by] = " B.ID " . $order . " "; } elseif ($by == "lid") { $arSqlOrder[$by] = " B.LID " . $order . " "; } elseif ($by == "iblock_type") { $arSqlOrder[$by] = " B.IBLOCK_TYPE_ID " . $order . " "; } elseif ($by == "name") { $arSqlOrder[$by] = " B.NAME " . $order . " "; } elseif ($by == "active") { $arSqlOrder[$by] = " B.ACTIVE " . $order . " "; } elseif ($by == "sort") { $arSqlOrder[$by] = " B.SORT " . $order . " "; } elseif ($by == "code") { $arSqlOrder[$by] = " B.CODE " . $order . " "; } elseif ($bIncCnt && $by == "element_cnt") { $arSqlOrder[$by] = " ELEMENT_CNT " . $order . " "; } else { $by = "timestamp_x"; $arSqlOrder[$by] = " B.TIMESTAMP_X " . $order . " "; } } } if (count($arSqlOrder) > 0) { $strSqlOrder = " ORDER BY " . implode(",", $arSqlOrder); } else { $strSqlOrder = ""; } $res = $DB->Query($strSql . $strSqlOrder, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__); return $res; }
function GetList($arOrder = array("SORT" => "ASC"), $arFilter = array(), $bIncCnt = false) { global $DB, $USER; $arSqlSearch = array(); $bAddSites = false; $filter_keys = array_keys($arFilter); for ($i = 0; $i < count($filter_keys); $i++) { $val = $arFilter[$filter_keys[$i]]; $key = $filter_keys[$i]; $res = CIBlock::MkOperationFilter($key); $key = $res["FIELD"]; $cOperationType = $res["OPERATION"]; $key = strtoupper($key); switch ($key) { case "ACTIVE": $arSqlSearch[] = CIBlock::FilterCreate("B.ACTIVE", $val, "string_equal", $cOperationType); break; case "LID": case "SITE_ID": $str_res = CIBlock::FilterCreate("BS.SITE_ID", $val, "string_equal", $cOperationType); if (strlen($str_res) > 0) { $arSqlSearch[] = $str_res; $bAddSites = true; } break; case "NAME": case "XML_ID": $arSqlSearch[] = CIBlock::FilterCreate("B." . $key, $val, "string", $cOperationType); break; case "EXTERNAL_ID": $arSqlSearch[] = CIBlock::FilterCreate("B.XML_ID", $val, "string", $cOperationType); break; case "TYPE": $arSqlSearch[] = CIBlock::FilterCreate("B.IBLOCK_TYPE_ID", $val, "string", $cOperationType); break; case "CODE": $arSqlSearch[] = CIBlock::FilterCreate("B.CODE", $val, "string", $cOperationType); break; case "ID": $arSqlSearch[] = CIBlock::FilterCreate("B.ID", $val, "number", $cOperationType); break; case "VERSION": $arSqlSearch[] = CIBlock::FilterCreate("B.VERSION", $val, "number", $cOperationType); break; } } $strSqlSearch = ""; for ($i = 0; $i < count($arSqlSearch); $i++) { if (strlen($arSqlSearch[$i]) > 0) { $strSqlSearch .= " AND (" . $arSqlSearch[$i] . ") "; } } if (is_object($USER) && $USER->IsAdmin()) { $sqlPermissions = ""; } else { $strGroups = is_object($USER) ? $USER->GetGroups() : "2"; $min_permission = strlen($arFilter["MIN_PERMISSION"]) == 1 ? $arFilter["MIN_PERMISSION"] : "R"; $sqlPermissions = "\r\n\t\t\t\tAND EXISTS (\r\n\t\t\t\t\tSELECT\t*\r\n\t\t\t\t\tFROM \tb_iblock_group IBG\r\n\t\t\t\t\tWHERE\r\n\t\t\t\t\t\tIBG.IBLOCK_ID=B.ID \r\n\t\t\t\t\t\tAND IBG.GROUP_ID IN (" . $strGroups . ")\r\n\t\t\t\t\t\tAND IBG.PERMISSION >= '" . $min_permission . "'\r\n\t\t\t\t\t\tAND (IBG.PERMISSION='X' OR B.ACTIVE='Y')\r\n\t\t\t\t)\r\n\t\t\t"; } if ($bAddSites) { $sqlJoinSites = " LEFT JOIN b_iblock_site BS ON B.ID=BS.IBLOCK_ID " . " LEFT JOIN b_lang L ON L.LID=BS.SITE_ID "; } else { $sqlJoinSites = " INNER JOIN b_lang L ON L.LID=B.LID "; } if (!$bIncCnt) { $strSql = "SELECT B.*, B.XML_ID as EXTERNAL_ID, " . $DB->DateToCharFunction("B.TIMESTAMP_X") . " as TIMESTAMP_X, L.DIR as LANG_DIR, L.SERVER_NAME " . "FROM b_iblock B " . $sqlJoinSites . "WHERE 1 = 1 " . $sqlPermissions . $strSqlSearch; } else { $strSql = "SELECT B.*, B.XML_ID as EXTERNAL_ID, " . $DB->DateToCharFunction("B.TIMESTAMP_X") . " as TIMESTAMP_X, L.DIR as LANG_DIR, L.SERVER_NAME, T.CNT as ELEMENT_CNT " . "FROM b_iblock B " . $sqlJoinSites . "\tLEFT JOIN " . "\t(" . "\tSELECT COUNT(DISTINCT BE.ID) as CNT, BE.IBLOCK_ID " . "\tFROM b_iblock_element BE " . "\tWHERE ((BE.WF_STATUS_ID=1 AND BE.WF_PARENT_ELEMENT_ID IS NULL ) " . ($arFilter["CNT_ALL"] == "Y" ? " OR BE.WF_NEW='Y' " : "") . ") " . ($arFilter["CNT_ACTIVE"] == "Y" ? " AND BE.ACTIVE='Y' " . " AND (BE.ACTIVE_TO >= " . $DB->CurrentDateFunction() . " OR BE.ACTIVE_TO IS NULL) " . " AND (BE.ACTIVE_FROM <= " . $DB->CurrentDateFunction() . " OR BE.ACTIVE_FROM IS NULL) " : "") . "\tGROUP BY BE.IBLOCK_ID " . "\t) T ON T.IBLOCK_ID=B.ID " . "WHERE 1=1 " . $sqlPermissions . $strSqlSearch; } $arSqlOrder = array(); foreach ($arOrder as $by => $order) { $by = strtolower($by); $order = strtolower($order); if ($order != "asc") { $order = "desc"; } if ($by == "id") { $arSqlOrder[] = " B.ID " . $order . " "; } elseif ($by == "lid") { $arSqlOrder[] = " B.LID " . $order . " "; } elseif ($by == "iblock_type") { $arSqlOrder[] = " B.IBLOCK_TYPE_ID " . $order . " "; } elseif ($by == "name") { $arSqlOrder[] = " B.NAME " . $order . " "; } elseif ($by == "active") { $arSqlOrder[] = " B.ACTIVE " . $order . " "; } elseif ($by == "sort") { $arSqlOrder[] = " B.SORT " . $order . " "; } elseif ($bIncCnt && $by == "element_cnt") { $arSqlOrder[] = " ELEMENT_CNT " . $order . " "; } else { $arSqlOrder[] = " B.TIMESTAMP_X " . $order . " "; $by = "timestamp_x"; } } $strSqlOrder = ""; DelDuplicateSort($arSqlOrder); for ($i = 0; $i < count($arSqlOrder); $i++) { if ($i == 0) { $strSqlOrder = " ORDER BY "; } else { $strSqlOrder .= ","; } $strSqlOrder .= $arSqlOrder[$i]; } $strSql .= $strSqlOrder; //echo htmlspecialchars($strSql); $res = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__); return $res; }