27 if (!is_array($arOrder) && !is_array(
$arFilter))
29 $arOrder = (string)$arOrder;
38 if (empty($arSelectFields))
39 $arSelectFields =
array(
"ID",
"PRODUCT_ID",
"EXTRA_ID",
"CATALOG_GROUP_ID",
"PRICE",
"CURRENCY",
"TIMESTAMP_X",
"QUANTITY_FROM",
"QUANTITY_TO",
"BASE",
"SORT",
"CATALOG_GROUP_NAME",
"CAN_ACCESS",
"CAN_BUY");
41 $quantityTrace = Option::get(
'catalog',
'default_quantity_trace');
42 $canBuyZero = Option::get(
'catalog',
'default_can_buy_zero');
43 $amountTrace = Option::get(
'catalog',
'allow_negative_amount');
46 "ID" =>
array(
"FIELD" =>
"P.ID",
"TYPE" =>
"int"),
47 "PRODUCT_ID" =>
array(
"FIELD" =>
"P.PRODUCT_ID",
"TYPE" =>
"int"),
48 "EXTRA_ID" =>
array(
"FIELD" =>
"P.EXTRA_ID",
"TYPE" =>
"int"),
49 "CATALOG_GROUP_ID" =>
array(
"FIELD" =>
"P.CATALOG_GROUP_ID",
"TYPE" =>
"int"),
50 "PRICE" =>
array(
"FIELD" =>
"P.PRICE",
"TYPE" =>
"double"),
51 "CURRENCY" =>
array(
"FIELD" =>
"P.CURRENCY",
"TYPE" =>
"string"),
52 "TIMESTAMP_X" =>
array(
"FIELD" =>
"P.TIMESTAMP_X",
"TYPE" =>
"datetime"),
53 "QUANTITY_FROM" =>
array(
"FIELD" =>
"P.QUANTITY_FROM",
"TYPE" =>
"int"),
54 "QUANTITY_TO" =>
array(
"FIELD" =>
"P.QUANTITY_TO",
"TYPE" =>
"int"),
55 "TMP_ID" =>
array(
"FIELD" =>
"P.TMP_ID",
"TYPE" =>
"string"),
56 "PRICE_BASE_RATE" =>
array(
"FIELD" =>
"P.PRICE_SCALE",
"TYPE" =>
"double"),
57 "PRICE_SCALE" =>
array(
"FIELD" =>
"P.PRICE_SCALE",
"TYPE" =>
"double"),
58 "BASE" =>
array(
"FIELD" =>
"CG.BASE",
"TYPE" =>
"char",
"FROM" =>
"INNER JOIN b_catalog_group CG ON (P.CATALOG_GROUP_ID = CG.ID)"),
59 "SORT" =>
array(
"FIELD" =>
"CG.SORT",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_group CG ON (P.CATALOG_GROUP_ID = CG.ID)"),
60 "PRODUCT_QUANTITY" =>
array(
"FIELD" =>
"CP.QUANTITY",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)"),
61 "PRODUCT_QUANTITY_TRACE" =>
array(
62 "FIELD" =>
"CASE WHEN CP.QUANTITY_TRACE = 'D' THEN '".
$DB->ForSql($quantityTrace).
"' ELSE CP.QUANTITY_TRACE END",
64 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
66 "PRODUCT_CAN_BUY_ZERO" =>
array(
67 "FIELD" =>
"CASE WHEN CP.CAN_BUY_ZERO = 'D' THEN '".
$DB->ForSql($canBuyZero).
"' ELSE CP.CAN_BUY_ZERO END",
69 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
71 "PRODUCT_NEGATIVE_AMOUNT_TRACE" =>
array(
72 "FIELD" =>
"CASE WHEN CP.NEGATIVE_AMOUNT_TRACE = 'D' THEN '".
$DB->ForSql($amountTrace).
"' ELSE CP.NEGATIVE_AMOUNT_TRACE END",
74 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
76 "PRODUCT_WEIGHT" =>
array(
"FIELD" =>
"CP.WEIGHT",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)"),
77 "ELEMENT_IBLOCK_ID" =>
array(
"FIELD" =>
"IE.IBLOCK_ID",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_iblock_element IE ON (P.PRODUCT_ID = IE.ID)"),
78 "CATALOG_GROUP_NAME" =>
array(
"FIELD" =>
"CGL.NAME",
"TYPE" =>
"string",
"FROM" =>
"LEFT JOIN b_catalog_group_lang CGL ON (P.CATALOG_GROUP_ID = CGL.CATALOG_GROUP_ID AND CGL.LANG = '".LANGUAGE_ID.
"')"),
82 "FIELD" =>
"CASE WHEN CGG.ID IS NULL THEN 'N' ELSE 'Y' END",
84 "FROM" =>
"LEFT JOIN b_catalog_group2group CGG ON (P.CATALOG_GROUP_ID = CGG.CATALOG_GROUP_ID AND CGG.GROUP_ID IN (".$strUserGroups.
") AND CGG.BUY <> 'Y')"
87 "FIELD" =>
"CASE WHEN CGG1.ID IS NULL THEN 'N' ELSE 'Y' END",
89 "FROM" =>
"LEFT JOIN b_catalog_group2group CGG1 ON (P.CATALOG_GROUP_ID = CGG1.CATALOG_GROUP_ID AND CGG1.GROUP_ID IN (".$strUserGroups.
") AND CGG1.BUY = 'Y')"
92 $arSelectFields = $entityResult->prepareSelect($arSelectFields);
96 if (array_key_exists(
"CAN_ACCESS",
$arFields) || array_key_exists(
"CAN_BUY",
$arFields))
97 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"DISTINCT", $arSqls[
"SELECT"]);
99 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"", $arSqls[
"SELECT"]);
101 if (empty($arGroupBy) && is_array($arGroupBy))
103 $strSql =
"SELECT ".$arSqls[
"SELECT"].
" FROM b_catalog_price P ".$arSqls[
"FROM"];
104 if (!empty($arSqls[
"WHERE"]))
105 $strSql .=
" WHERE ".$arSqls[
"WHERE"];
106 if (!empty($arSqls[
"GROUPBY"]))
107 $strSql .=
" GROUP BY ".$arSqls[
"GROUPBY"];
116 $strSql =
"SELECT ".$arSqls[
"SELECT"].
" FROM b_catalog_price P ".$arSqls[
"FROM"];
117 if (!empty($arSqls[
"WHERE"]))
118 $strSql .=
" WHERE ".$arSqls[
"WHERE"];
119 if (!empty($arSqls[
"GROUPBY"]))
120 $strSql .=
" GROUP BY ".$arSqls[
"GROUPBY"];
121 if (!empty($arSqls[
"ORDERBY"]))
122 $strSql .=
" ORDER BY ".$arSqls[
"ORDERBY"];
125 $boolNavStartParams = (!empty($arNavStartParams) && is_array($arNavStartParams));
126 if ($boolNavStartParams && isset($arNavStartParams[
'nTopCount']))
128 $intTopCount = (int)$arNavStartParams[
"nTopCount"];
130 if ($boolNavStartParams && $intTopCount <= 0)
132 $strSql_tmp =
"SELECT COUNT('x') as CNT FROM b_catalog_price P ".$arSqls[
"FROM"];
133 if (!empty($arSqls[
"WHERE"]))
134 $strSql_tmp .=
" WHERE ".$arSqls[
"WHERE"];
135 if (!empty($arSqls[
"GROUPBY"]))
136 $strSql_tmp .=
" GROUP BY ".$arSqls[
"GROUPBY"];
140 if (empty($arSqls[
"GROUPBY"]))
147 $cnt =
$dbRes->SelectedRowsCount();
151 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
155 if ($boolNavStartParams && $intTopCount > 0)
157 $strSql .=
" LIMIT ".$intTopCount;
159 $entityResult->setResult(
$DB->Query($strSql));
182 $entityResult =
new CCatalogResult(
'\Bitrix\Catalog\Model\Price');
184 if (empty($arSelectFields))
185 $arSelectFields =
array(
"ID",
"PRODUCT_ID",
"EXTRA_ID",
"CATALOG_GROUP_ID",
"PRICE",
"CURRENCY",
"TIMESTAMP_X",
"QUANTITY_FROM",
"QUANTITY_TO",
"TMP_ID");
187 $quantityTrace = Option::get(
'catalog',
'default_quantity_trace');
188 $canBuyZero = Option::get(
'catalog',
'default_can_buy_zero');
189 $amountTrace = Option::get(
'catalog',
'allow_negative_amount');
192 "ID" =>
array(
"FIELD" =>
"P.ID",
"TYPE" =>
"int"),
193 "PRODUCT_ID" =>
array(
"FIELD" =>
"P.PRODUCT_ID",
"TYPE" =>
"int"),
194 "EXTRA_ID" =>
array(
"FIELD" =>
"P.EXTRA_ID",
"TYPE" =>
"int"),
195 "CATALOG_GROUP_ID" =>
array(
"FIELD" =>
"P.CATALOG_GROUP_ID",
"TYPE" =>
"int"),
196 "PRICE" =>
array(
"FIELD" =>
"P.PRICE",
"TYPE" =>
"double"),
197 "CURRENCY" =>
array(
"FIELD" =>
"P.CURRENCY",
"TYPE" =>
"string"),
198 "TIMESTAMP_X" =>
array(
"FIELD" =>
"P.TIMESTAMP_X",
"TYPE" =>
"datetime"),
199 "QUANTITY_FROM" =>
array(
"FIELD" =>
"P.QUANTITY_FROM",
"TYPE" =>
"int"),
200 "QUANTITY_TO" =>
array(
"FIELD" =>
"P.QUANTITY_TO",
"TYPE" =>
"int"),
201 "TMP_ID" =>
array(
"FIELD" =>
"P.TMP_ID",
"TYPE" =>
"string"),
202 "PRICE_BASE_RATE" =>
array(
"FIELD" =>
"P.PRICE_SCALE",
"TYPE" =>
"double"),
203 "PRICE_SCALE" =>
array(
"FIELD" =>
"P.PRICE_SCALE",
"TYPE" =>
"double"),
204 "PRODUCT_QUANTITY" =>
array(
"FIELD" =>
"CP.QUANTITY",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)"),
205 "PRODUCT_QUANTITY_TRACE" =>
array(
206 "FIELD" =>
"CASE WHEN CP.QUANTITY_TRACE = 'D' THEN '".
$DB->ForSql($quantityTrace).
"' ELSE CP.QUANTITY_TRACE END",
208 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
210 "PRODUCT_CAN_BUY_ZERO" =>
array(
211 "FIELD" =>
"CASE WHEN CP.CAN_BUY_ZERO = 'D' THEN '".
$DB->ForSql($canBuyZero).
"' ELSE CP.CAN_BUY_ZERO END",
213 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
215 "PRODUCT_NEGATIVE_AMOUNT_TRACE" =>
array(
216 "FIELD" =>
"CASE WHEN CP.NEGATIVE_AMOUNT_TRACE = 'D' THEN '".
$DB->ForSql($amountTrace).
"' ELSE CP.NEGATIVE_AMOUNT_TRACE END",
218 "FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)",
220 "PRODUCT_WEIGHT" =>
array(
"FIELD" =>
"CP.WEIGHT",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_product CP ON (P.PRODUCT_ID = CP.ID)"),
221 "ELEMENT_IBLOCK_ID" =>
array(
"FIELD" =>
"IE.IBLOCK_ID",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_iblock_element IE ON (P.PRODUCT_ID = IE.ID)"),
222 "ELEMENT_NAME" =>
array(
"FIELD" =>
"IE.NAME",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_iblock_element IE ON (P.PRODUCT_ID = IE.ID)"),
223 "CATALOG_GROUP_CODE" =>
array(
"FIELD" =>
"CG.NAME",
"TYPE" =>
"string",
"FROM" =>
"INNER JOIN b_catalog_group CG ON (P.CATALOG_GROUP_ID = CG.ID)"),
224 "CATALOG_GROUP_BASE" =>
array(
"FIELD" =>
"CG.BASE",
"TYPE" =>
"char",
"FROM" =>
"INNER JOIN b_catalog_group CG ON (P.CATALOG_GROUP_ID = CG.ID)"),
225 "CATALOG_GROUP_SORT" =>
array(
"FIELD" =>
"CG.SORT",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_group CG ON (P.CATALOG_GROUP_ID = CG.ID)"),
226 "CATALOG_GROUP_NAME" =>
array(
"FIELD" =>
"CGL.NAME",
"TYPE" =>
"string",
"FROM" =>
"LEFT JOIN b_catalog_group_lang CGL ON (P.CATALOG_GROUP_ID = CGL.CATALOG_GROUP_ID AND CGL.LANG = '".LANGUAGE_ID.
"')"),
227 "GROUP_GROUP_ID" =>
array(
"FIELD" =>
"CGG.GROUP_ID",
"TYPE" =>
"int",
"FROM" =>
"INNER JOIN b_catalog_group2group CGG ON (P.CATALOG_GROUP_ID = CGG.CATALOG_GROUP_ID)"),
228 "GROUP_BUY" =>
array(
"FIELD" =>
"CGG.BUY",
"TYPE" =>
"char",
"FROM" =>
"INNER JOIN b_catalog_group2group CGG ON (P.CATALOG_GROUP_ID = CGG.CATALOG_GROUP_ID)")
231 $arSelectFields = $entityResult->prepareSelect($arSelectFields);
235 $arSqls[
"SELECT"] = str_replace(
"%%_DISTINCT_%%",
"", $arSqls[
"SELECT"]);
237 if (empty($arGroupBy) && is_array($arGroupBy))
239 $strSql =
"SELECT ".$arSqls[
"SELECT"].
" FROM b_catalog_price P ".$arSqls[
"FROM"];
240 if (!empty($arSqls[
"WHERE"]))
241 $strSql .=
" WHERE ".$arSqls[
"WHERE"];
242 if (!empty($arSqls[
"GROUPBY"]))
243 $strSql .=
" GROUP BY ".$arSqls[
"GROUPBY"];
252 $strSql =
"SELECT ".$arSqls[
"SELECT"].
" FROM b_catalog_price P ".$arSqls[
"FROM"];
253 if (!empty($arSqls[
"WHERE"]))
254 $strSql .=
" WHERE ".$arSqls[
"WHERE"];
255 if (!empty($arSqls[
"GROUPBY"]))
256 $strSql .=
" GROUP BY ".$arSqls[
"GROUPBY"];
257 if (!empty($arSqls[
"ORDERBY"]))
258 $strSql .=
" ORDER BY ".$arSqls[
"ORDERBY"];
261 $boolNavStartParams = (!empty($arNavStartParams) && is_array($arNavStartParams));
262 if ($boolNavStartParams && isset($arNavStartParams[
'nTopCount']))
264 $intTopCount = (int)$arNavStartParams[
"nTopCount"];
266 if ($boolNavStartParams && $intTopCount <= 0)
268 $strSql_tmp =
"SELECT COUNT('x') as CNT FROM b_catalog_price P ".$arSqls[
"FROM"];
269 if (!empty($arSqls[
"WHERE"]))
270 $strSql_tmp .=
" WHERE ".$arSqls[
"WHERE"];
271 if (!empty($arSqls[
"GROUPBY"]))
272 $strSql_tmp .=
" GROUP BY ".$arSqls[
"GROUPBY"];
276 if (empty($arSqls[
"GROUPBY"]))
283 $cnt =
$dbRes->SelectedRowsCount();
287 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
291 if ($boolNavStartParams && $intTopCount > 0)
293 $strSql .=
" LIMIT ".$intTopCount;
295 $entityResult->setResult(
$DB->Query($strSql));