示例#1
0
	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
		);
	}
示例#2
0
 /**
  * <p>Возвращает список свойств по фильтру <i>arFilter</i> отсортированные в порядке <i>arOrder</i>. Метод статический.</p>
  *
  *
  * @param array $arrayarOrder = Array() Массив для сортировки, имеющий вид <i>by1=&gt;order1[,by2=&gt;order2 [, ..]]</i>,
  * где:<i> by</i> - поле сортировки, может принимать значения: <ul> <li> <b>id</b> -
  * код;</li> <li> <b>block_id</b> - код информационного блока, которому
  * принадлежит свойство; <b>name</b> - название;</li> <li> <b>name</b> - название;</li>
  * <li> <b>active</b> - активность;</li> <li> <b>sort</b> - индекс сортировки;</li> <li>
  * <b>timestamp_x</b> - дата последнего изменения</li> <li> <b>searchable</b> - по
  * признаку участия значения свойства в поиске; </li> <li> <b>filtrable</b> - по
  * признаку участия свойства в фильре на странице списка элементов;
  * </li> <li> <b>order</b> - порядок сортировки, может принимать значения: <ul> <li>
  * <b>asc</b> - по возрастанию;</li> <li> <b>desc</b> - по убыванию;</li> </ul> </li> </ul>
  *
  * @param array $arrayarFilter = Array() Массив вида <i> array("фильтруемое поле"=&gt;"значение" [, ...])</i>. Ни один
  * параметр фильтра не принимает массивы. <i>Фильтруемое поле</i>
  * может принимать значения: <ul> <li> <b>ACTIVE</b> - фильтр по активности
  * (Y|N);</li> <li> <b>ID</b> - по ID свойства, только число;</li> <li> <b>CODE</b> - по
  * символьному коду (по шаблону [%_]), только строка;</li> <li> <b>NAME</b> - по
  * названию свойства (по шаблону [%_]);</li> <li> <b>EXTERNAL_ID</b> или <b>XML_ID </b>- по
  * внешнему коду(по шаблону [%_]). Возможно использование отрицания,
  * указав <i>!EXTERNAL_ID</i>;</li> <li> <b>PROPERTY_TYPE</b> - по типу свойства: <ul> <li> <b>S</b> -
  * строка</li> <li> <b>N</b> - число</li> <li> <b>L</b> - список</li> <li> <b>F</b> - файл</li> <li>
  * <b>G</b> - привязка к разделу</li> <li> <b>E</b> - привязка к элементу</li> </ul> </li>
  * <li> <b>USER_TYPE</b> - по пользовательскому типу свойства; <ul> <li> <b>UserID</b> -
  * Привязка к пользователю</li> <li> <b>DateTime</b> - Дата/Время</li> <li> <b>EList</b> -
  * Привязка к элементам в виде списка</li> <li> <b>FileMan</b> - Привязка к
  * файлу (на сервере)</li> <li> <b>map_yandex</b> - Привязка к Яndex.Карте</li> <li>
  * <b>HTML</b> - HTML/текст</li> <li> <b>map_google</b> - Привязка к карте Google Maps</li> <li>
  * <b>ElementXmlID</b> - Привязка к элементам по XML_ID</li> <li> <b>Sequence</b> - Счетчик</li>
  * <li> <b>EAutocomplete</b> - Привязка к элементам с автозаполнением</li> <li>
  * <b>SKU</b> - Привязка к товарам (SKU)</li> <li> <b>video</b> - Видео</li> <li> <b>TopicID</b> -
  * Привязка к теме форума</li> </ul> Кроме того, можно использовать
  * идентификаторы пользовательских типов свойств инфоблока,
  * добавленных сторонними модулями. </li> <li> <b>SEARCHABLE</b> - по признаку
  * участия значения свойства в поиске (Y|N); </li> <li> <b>FILTRABLE</b> - по
  * признаку участия свойства в фильре на странице списка элементов
  * (Y|N);</li> <li> <b>VERSION</b> - по флагу хранения значений свойств элементов
  * инфоблока;</li> <li> <b>MIN_PERMISSION</b> - фильтр по правам доступа, по
  * умолчанию принимает <i>R</i> (уровень доступа <i>Чтение</i>);</li> <li>
  * <b>CHECK_PERMISSIONS</b> - если установлено значение "N", то проверки прав не
  * происходит; <br> </li> <li> <b>IBLOCK_ID</b> - по коду информационного блока,
  * которому принадлежит свойство;</li> <li> <b>IBLOCK_CODE</b> - по символьному
  * коду информационного блока, которому принадлежит свойство;</li> <li>
  * <b>LINK_IBLOCK_ID</b> - по коду связанного информационного блока (может
  * быть указан для свойств типа "E" и "G");</li> <li> <b>MULTIPLE</b> - Проверка на
  * множественность. по умолчанию N.</li> </ul> Необязательное. По
  * умолчанию записи не фильтруются.
  *
  * @return CDBResult <a href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a>
  *
  * <h4>Example</h4> 
  * <pre>
  * &lt;?<br>$IBLOCK_ID = 11;<br>$properties = CIBlockProperty::GetList(Array("sort"=&gt;"asc", "name"=&gt;"asc"), Array("ACTIVE"=&gt;"Y", "IBLOCK_ID"=&gt;$IBLOCK_ID));<br>while ($prop_fields = $properties-&gt;GetNext())<br>{<br>  echo $prop_fields["ID"]." - ".$prop_fields["NAME"]."&lt;br&gt;";<br>}<br>?&gt;<br>
  * </pre>
  *
  *
  * <h4>See Also</h4> 
  * <ul> <li> <a href="http://dev.1c-bitrix.ru/api_help/main/reference/cdbresult/index.php">CDBResult</a> </li> <li> <a
  * href="http://dev.1c-bitrix.ru/api_help/iblock/fields.php#fproperty">Поля свойства</a> </li> </ul> <a
  * name="examples"></a>
  *
  *
  * @static
  * @link http://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockproperty/getlist.php
  * @author Bitrix
  */
 public static function GetList($arOrder = array(), $arFilter = array())
 {
     global $DB;
     $strSql = "\n\t\t\tSELECT BP.*\n\t\t\tFROM b_iblock_property BP\n\t\t";
     $bJoinIBlock = false;
     $arSqlSearch = "";
     foreach ($arFilter as $key => $val) {
         $val = $DB->ForSql($val);
         $key = strtoupper($key);
         switch ($key) {
             case "ACTIVE":
             case "SEARCHABLE":
             case "FILTRABLE":
             case "IS_REQUIRED":
             case "MULTIPLE":
                 if ($val == "Y" || $val == "N") {
                     $arSqlSearch[] = "BP." . $key . " = '" . $val . "'";
                 }
                 break;
             case "?CODE":
             case "?NAME":
                 $arSqlSearch[] = CIBlock::FilterCreate("BP." . substr($key, 1), $val, "string", "E");
                 break;
             case "CODE":
             case "NAME":
                 $arSqlSearch[] = "UPPER(BP." . $key . ") LIKE UPPER('" . $val . "')";
                 break;
             case "XML_ID":
             case "EXTERNAL_ID":
                 $arSqlSearch[] = "BP.XML_ID LIKE '" . $val . "'";
                 break;
             case "!XML_ID":
             case "!EXTERNAL_ID":
                 $arSqlSearch[] = "(BP.XML_ID IS NULL OR NOT (BP.XML_ID LIKE '" . $val . "'))";
                 break;
             case "TMP_ID":
                 $arSqlSearch[] = "BP.TMP_ID LIKE '" . $val . "'";
                 break;
             case "!TMP_ID":
                 $arSqlSearch[] = "(BP.TMP_ID IS NULL OR NOT (BP.TMP_ID LIKE '" . $val . "'))";
                 break;
             case "PROPERTY_TYPE":
                 $ar = explode(":", $val);
                 if (count($ar) == 2) {
                     $val = $ar[0];
                     $arSqlSearch[] = "BP.USER_TYPE = '" . $ar[1] . "'";
                 }
                 $arSqlSearch[] = "BP." . $key . " = '" . $val . "'";
                 break;
             case "USER_TYPE":
                 $arSqlSearch[] = "BP." . $key . " = '" . $val . "'";
                 break;
             case "ID":
             case "IBLOCK_ID":
             case "LINK_IBLOCK_ID":
             case "VERSION":
                 $arSqlSearch[] = "BP." . $key . " = " . (int) $val;
                 break;
             case "IBLOCK_CODE":
                 $arSqlSearch[] = "UPPER(B.CODE) = UPPER('" . $val . "')";
                 $bJoinIBlock = true;
                 break;
         }
     }
     if ($bJoinIBlock) {
         $strSql .= "\n\t\t\t\tINNER JOIN b_iblock B ON B.ID = BP.IBLOCK_ID\n\t\t\t";
     }
     if (!empty($arSqlSearch)) {
         $strSql .= "\n\t\t\t\tWHERE " . implode("\n\t\t\t\tAND ", $arSqlSearch) . "\n\t\t\t";
     }
     $arSqlOrder = array();
     foreach ($arOrder as $by => $order) {
         $by = strtoupper($by);
         $order = strtoupper($order) == "ASC" ? "ASC" : "DESC";
         if ($by === "ID" || $by === "IBLOCK_ID" || $by === "NAME" || $by === "ACTIVE" || $by === "SORT" || $by === "FILTRABLE" || $by === "SEARCHABLE") {
             $arSqlOrder[] = " BP." . $by . " " . $order;
         } else {
             $arSqlOrder[] = " BP.TIMESTAMP_X " . $order;
         }
     }
     DelDuplicateSort($arSqlOrder);
     if (!empty($arSqlOrder)) {
         $strSql .= "\n\t\t\t\tORDER BY " . implode(", ", $arSqlOrder) . "\n\t\t\t";
     }
     $res = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__);
     $res = new CIBlockPropertyResult($res);
     return $res;
 }
 public static function GetList($arOrder = array("SORT" => "ASC", "VALUE" => "ASC"), $arFilter = array())
 {
     global $DB;
     $arSqlSearch = array();
     foreach ($arFilter as $key => $val) {
         if ($key[0] == "!") {
             $key = substr($key, 1);
             $bInvert = true;
         } else {
             $bInvert = false;
         }
         $key = strtoupper($key);
         switch ($key) {
             case "CODE":
                 $arSqlSearch[] = CIBlock::FilterCreate("P.CODE", $val, "string", $bInvert);
                 break;
             case "IBLOCK_ID":
                 $arSqlSearch[] = CIBlock::FilterCreate("P.IBLOCK_ID", $val, "number", $bInvert);
                 break;
             case "DEF":
                 $arSqlSearch[] = CIBlock::FilterCreate("BEN.DEF", $val, "string_equal", $bInvert);
                 break;
             case "EXTERNAL_ID":
                 $arSqlSearch[] = CIBlock::FilterCreate("BEN.XML_ID", $val, "string_equal", $bInvert);
                 break;
             case "VALUE":
             case "XML_ID":
             case "TMP_ID":
                 $arSqlSearch[] = CIBlock::FilterCreate("BEN." . $key, $val, "string", $bInvert);
                 break;
             case "PROPERTY_ID":
                 if (is_numeric(substr($val, 0, 1))) {
                     $arSqlSearch[] = CIBlock::FilterCreate("P.ID", $val, "number", $bInvert);
                 } else {
                     $arSqlSearch[] = CIBlock::FilterCreate("P.CODE", $val, "string", $bInvert);
                 }
                 break;
             case "PROPERTY_ACTIVE":
                 $arSqlSearch[] = CIBlock::FilterCreate("P.ACTIVE", $val, "string_equal", $bInvert);
                 break;
             case "ID":
             case "SORT":
                 $arSqlSearch[] = CIBlock::FilterCreate("BEN." . $key, $val, "number", $bInvert);
                 break;
         }
     }
     $strSqlSearch = "";
     foreach (array_filter($arSqlSearch) as $sqlCondition) {
         $strSqlSearch .= " AND  (" . $sqlCondition . ") ";
     }
     $arSqlOrder = array();
     foreach ($arOrder as $by => $order) {
         $order = strtolower($order) != "asc" ? "desc" : "asc";
         $by = strtoupper($by);
         switch ($by) {
             case "ID":
             case "PROPERTY_ID":
             case "VALUE":
             case "XML_ID":
             case "EXTERNAL_ID":
             case "DEF":
                 $arSqlOrder[$by] = "BEN." . $by . " " . $order;
                 break;
             case "PROPERTY_SORT":
                 $arSqlOrder[$by] = "P.SORT " . $order;
                 break;
             case "PROPERTY_CODE":
                 $arSqlOrder[$by] = "P.CODE " . $order;
                 break;
             default:
                 $arSqlOrder["SORT"] = " BEN.SORT " . $order;
                 break;
         }
     }
     if (!empty($arSqlOrder)) {
         $strSqlOrder = "ORDER BY " . implode(", ", $arSqlOrder);
     } else {
         $strSqlOrder = "";
     }
     $strSql = "\n\t\t\tSELECT\n\t\t\t\tBEN.*,\n\t\t\t\tBEN.XML_ID as EXTERNAL_ID,\n\t\t\t\tP.NAME as PROPERTY_NAME,\n\t\t\t\tP.CODE as PROPERTY_CODE,\n\t\t\t\tP.SORT as PROPERTY_SORT\n\t\t\tFROM\n\t\t\t\tb_iblock_property_enum BEN,\n\t\t\t\tb_iblock_property P\n\t\t\tWHERE\n\t\t\t\tBEN.PROPERTY_ID=P.ID\n\t\t\t{$strSqlSearch}\n\t\t\t{$strSqlOrder}\n\t\t";
     $rs = $DB->Query($strSql, false, "FILE: " . __FILE__ . "<br> LINE: " . __LINE__);
     return new CIBlockPropertyEnumResult($rs);
 }
示例#4
0
 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);
 }
示例#5
0
 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"];
 }
示例#6
0
 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__);
 }
示例#7
0
 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;
 }
示例#8
0
 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;
 }