1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
product.php
См. документацию.
1<?php
2
7
8require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/catalog/general/product.php");
9
11{
23 public static function GetList($arOrder = array(), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array())
24 {
25 global $DB;
26
27 $entityResult = new CCatalogResult('\Bitrix\Catalog\Model\Product');
28
29 if (!is_array($arOrder) && !is_array($arFilter))
30 {
31 $arOrder = (string)$arOrder;
32 $arFilter = (string)$arFilter;
33 $arOrder = ($arOrder != '' && $arFilter != '' ? array($arOrder => $arFilter) : array());
34 $arFilter = (is_array($arGroupBy) ? $arGroupBy : array());
35 $arGroupBy = false;
36 }
37
38 $defaultQuantityTrace = Option::get('catalog', 'default_quantity_trace');
39 $defaultCanBuyZero = Option::get('catalog', 'default_can_buy_zero');
40 $defaultNegativeAmount = Option::get('catalog', 'allow_negative_amount');
41 $defaultSubscribe = Option::get('catalog', 'default_subscribe');
42
44 "ID" => array("FIELD" => "CP.ID", "TYPE" => "int"),
45 "QUANTITY" => array("FIELD" => "CP.QUANTITY", "TYPE" => "double"),
46 "QUANTITY_RESERVED" => array("FIELD" => "CP.QUANTITY_RESERVED", "TYPE" => "double"),
47 "QUANTITY_TRACE_ORIG" => array("FIELD" => "CP.QUANTITY_TRACE", "TYPE" => "char"),
48 "CAN_BUY_ZERO_ORIG" => array("FIELD" => "CP.CAN_BUY_ZERO", "TYPE" => "char"),
49 "NEGATIVE_AMOUNT_TRACE_ORIG" => array("FIELD" => "CP.NEGATIVE_AMOUNT_TRACE", "TYPE" => "char"),
50 "QUANTITY_TRACE" => array(
51 "FIELD" => "CASE WHEN CP.QUANTITY_TRACE = 'D' THEN '".$DB->ForSql($defaultQuantityTrace)."' ELSE CP.QUANTITY_TRACE END",
52 "TYPE" => "char",
53 ),
54 "CAN_BUY_ZERO" => array(
55 "FIELD" => "CASE WHEN CP.CAN_BUY_ZERO = 'D' THEN '".$DB->ForSql($defaultCanBuyZero)."' ELSE CP.CAN_BUY_ZERO END",
56 "TYPE" => "char",
57 ),
58 "NEGATIVE_AMOUNT_TRACE" => array(
59 "FIELD" => "CASE WHEN CP.NEGATIVE_AMOUNT_TRACE = 'D' THEN '".$DB->ForSql($defaultNegativeAmount)."' ELSE CP.NEGATIVE_AMOUNT_TRACE END",
60 "TYPE" => "char",
61 ),
62 "SUBSCRIBE_ORIG" => array("FIELD" => "CP.SUBSCRIBE", "TYPE" => "char"),
63 "SUBSCRIBE" => array(
64 "FIELD" => "CASE WHEN CP.SUBSCRIBE = 'D' THEN '".$DB->ForSql($defaultSubscribe)."' ELSE CP.SUBSCRIBE END",
65 "TYPE" => "char",
66 ),
67 "AVAILABLE" => array("FIELD" => "CP.AVAILABLE", "TYPE" => "char"),
68 "BUNDLE" => array("FIELD" => "CP.BUNDLE", "TYPE" => "char"),
69 "WEIGHT" => array("FIELD" => "CP.WEIGHT", "TYPE" => "double"),
70 "WIDTH" => array("FIELD" => "CP.WIDTH", "TYPE" => "double"),
71 "LENGTH" => array("FIELD" => "CP.LENGTH", "TYPE" => "double"),
72 "HEIGHT" => array("FIELD" => "CP.HEIGHT", "TYPE" => "double"),
73 "TIMESTAMP_X" => array("FIELD" => "CP.TIMESTAMP_X", "TYPE" => "datetime"),
74 "PRICE_TYPE" => array("FIELD" => "CP.PRICE_TYPE", "TYPE" => "char"),
75 "RECUR_SCHEME_TYPE" => array("FIELD" => "CP.RECUR_SCHEME_TYPE", "TYPE" => "char"),
76 "RECUR_SCHEME_LENGTH" => array("FIELD" => "CP.RECUR_SCHEME_LENGTH", "TYPE" => "int"),
77 "TRIAL_PRICE_ID" => array("FIELD" => "CP.TRIAL_PRICE_ID", "TYPE" => "int"),
78 "WITHOUT_ORDER" => array("FIELD" => "CP.WITHOUT_ORDER", "TYPE" => "char"),
79 "SELECT_BEST_PRICE" => array("FIELD" => "CP.SELECT_BEST_PRICE", "TYPE" => "char"),
80 "VAT_ID" => array("FIELD" => "CP.VAT_ID", "TYPE" => "int"),
81 "VAT_INCLUDED" => array("FIELD" => "CP.VAT_INCLUDED", "TYPE" => "char"),
82 "TMP_ID" => array("FIELD" => "CP.TMP_ID", "TYPE" => "char"),
83 "PURCHASING_PRICE" => array("FIELD" => "CP.PURCHASING_PRICE", "TYPE" => "double"),
84 "PURCHASING_CURRENCY" => array("FIELD" => "CP.PURCHASING_CURRENCY", "TYPE" => "string"),
85 "BARCODE_MULTI" => array("FIELD" => "CP.BARCODE_MULTI", "TYPE" => "char"),
86 "MEASURE" => array("FIELD" => "CP.MEASURE", "TYPE" => "int"),
87 "TYPE" => array("FIELD" => "CP.TYPE", "TYPE" => "int"),
88 "ELEMENT_IBLOCK_ID" => array("FIELD" => "I.IBLOCK_ID", "TYPE" => "int", "FROM" => "INNER JOIN b_iblock_element I ON (CP.ID = I.ID)"),
89 "ELEMENT_XML_ID" => array("FIELD" => "I.XML_ID", "TYPE" => "string", "FROM" => "INNER JOIN b_iblock_element I ON (CP.ID = I.ID)"),
90 "ELEMENT_NAME" => array("FIELD" => "I.NAME", "TYPE" => "string", "FROM" => "INNER JOIN b_iblock_element I ON (CP.ID = I.ID)")
91 );
92
93 $arSelectFields = $entityResult->prepareSelect($arSelectFields);
94
95 $arSqls = CCatalog::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields);
96
97 $arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", "", $arSqls["SELECT"]);
98
99 if (empty($arGroupBy) && is_array($arGroupBy))
100 {
101 $strSql = "SELECT ".$arSqls["SELECT"]." FROM b_catalog_product CP ".$arSqls["FROM"];
102 if (!empty($arSqls["WHERE"]))
103 $strSql .= " WHERE ".$arSqls["WHERE"];
104 if (!empty($arSqls["GROUPBY"]))
105 $strSql .= " GROUP BY ".$arSqls["GROUPBY"];
106
107 $dbRes = $DB->Query($strSql);
108 if ($arRes = $dbRes->Fetch())
109 return $arRes["CNT"];
110 else
111 return false;
112 }
113
114 $strSql = "SELECT ".$arSqls["SELECT"]." FROM b_catalog_product CP ".$arSqls["FROM"];
115 if (!empty($arSqls["WHERE"]))
116 $strSql .= " WHERE ".$arSqls["WHERE"];
117 if (!empty($arSqls["GROUPBY"]))
118 $strSql .= " GROUP BY ".$arSqls["GROUPBY"];
119 if (!empty($arSqls["ORDERBY"]))
120 $strSql .= " ORDER BY ".$arSqls["ORDERBY"];
121
122 $intTopCount = 0;
123 $boolNavStartParams = (!empty($arNavStartParams) && is_array($arNavStartParams));
124 if ($boolNavStartParams && isset($arNavStartParams['nTopCount']))
125 $intTopCount = (int)$arNavStartParams['nTopCount'];
126
127 if ($boolNavStartParams && $intTopCount <= 0)
128 {
129 $strSql_tmp = "SELECT COUNT('x') as CNT FROM b_catalog_product CP ".$arSqls["FROM"];
130 if (!empty($arSqls["WHERE"]))
131 $strSql_tmp .= " WHERE ".$arSqls["WHERE"];
132 if (!empty($arSqls["GROUPBY"]))
133 $strSql_tmp .= " GROUP BY ".$arSqls["GROUPBY"];
134
135 $dbRes = $DB->Query($strSql_tmp);
136 $cnt = 0;
137 if (empty($arSqls["GROUPBY"]))
138 {
139 if ($arRes = $dbRes->Fetch())
140 $cnt = $arRes["CNT"];
141 }
142 else
143 {
144 $cnt = $dbRes->SelectedRowsCount();
145 }
146
147 $dbRes = new CDBResult();
148 $dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
149 }
150 else
151 {
152 if ($boolNavStartParams && $intTopCount > 0)
153 $strSql .= " LIMIT ".$intTopCount;
154
155 $entityResult->setResult($DB->Query($strSql));
156
157 $dbRes = $entityResult;
158 }
159
160 return $dbRes;
161 }
162
173 public static function GetListEx($arOrder=array("SORT"=>"ASC"), $arFilter=array())
174 {
175 return false;
176 }
177
185 public static function GetVATInfo($PRODUCT_ID)
186 {
187 $vat = self::GetVATDataByID($PRODUCT_ID);
188 if (empty($vat))
189 $vat = [];
190 else
191 $vat = [0 => $vat];
192 $result = new CDBResult();
193 $result->InitFromArray($vat);
194 unset($vat);
195
196 return $result;
197 }
198
204 public static function GetVATDataByIDList(array $list): array
205 {
206 $output = [];
207 if (empty($list))
208 return $output;
210 if (empty($list))
211 return $output;
212 return self::loadVatInfoFromDB($list);
213 }
214
220 public static function GetVATDataByID($id)
221 {
222 $id = (int)$id;
223 if ($id <= 0)
224 return false;
225 $result = self::loadVatInfoFromDB([$id]);
226 return ($result[$id] ?? false);
227 }
228
234 private static function loadVatInfoFromDB(array $list): array
235 {
236 $result = array_fill_keys($list, false);
237 $ids = [];
238 foreach ($list as $id)
239 {
240 if (isset(static::$vatCache[$id]))
241 {
242 $result[$id] = static::$vatCache[$id];
243 }
244 else
245 {
246 $ids[] = $id;
247 static::$vatCache[$id] = false;
248 }
249 }
250 if (!empty($ids))
251 {
252 $conn = Main\Application::getConnection();
253 $iterator = $conn->query(
254 "
255 select CAT_PR.ID as PRODUCT_ID, CAT_VAT.*, CAT_PR.VAT_INCLUDED
256 from b_catalog_product CAT_PR
257 left join b_iblock_element BE on (BE.ID = CAT_PR.ID)
258 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)
259 left join b_catalog_vat CAT_VAT on (CAT_VAT.ID = CASE WHEN (CAT_PR.VAT_ID is null or CAT_PR.VAT_ID = 0) THEN CAT_IB.VAT_ID ELSE CAT_PR.VAT_ID END)
260 where CAT_PR.ID in (".implode(', ', $ids).")
261 and CAT_VAT.ACTIVE='Y'
262 "
263 );
264 while ($row = $iterator->fetch())
265 {
266 $productId = (int)$row['PRODUCT_ID'];
267 if (isset($row['TIMESTAMP_X']) && $row['TIMESTAMP_X'] instanceof Main\Type\DateTime)
268 {
269 $row['TIMESTAMP_X'] = $row['TIMESTAMP_X']->toString();
270 }
271 if ($row['RATE'] !== null)
272 {
273 $row['RATE'] = (float)$row['RATE'];
274 }
275 static::$vatCache[$productId] = $row;
276 $result[$productId] = $row;
277 }
278 unset($productId, $row, $iterator);
279 unset($conn);
280 }
281 unset($ids);
282
283 return $result;
284 }
285
293 public static function SetProductType($intID, $intTypeID)
294 {
295 $intID = (int)$intID;
296 if ($intID <= 0)
297 return false;
298 $intTypeID = (int)$intTypeID;
299 if ($intTypeID != Catalog\ProductTable::TYPE_PRODUCT && $intTypeID != Catalog\ProductTable::TYPE_SET)
300 return false;
301
302 $result = Catalog\Model\Product::update($intID, ['TYPE' => $intTypeID]);
303 return $result->isSuccess();
304 }
305}
static update($id, array $data)
Определения entity.php:229
const TYPE_SET
Определения product.php:71
const TYPE_PRODUCT
Определения product.php:70
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static normalizeArrayValuesByInt(&$map, $sorted=true)
Определения collection.php:150
static PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields)
Определения catalog.php:389
Определения product.php:10
Определения product.php:11
static GetVATDataByID($id)
Определения product.php:220
static GetList($arOrder=array(), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения product.php:23
static GetVATInfo($PRODUCT_ID)
Определения product.php:185
static SetProductType($intID, $intTypeID)
Определения product.php:293
static GetListEx($arOrder=array("SORT"=>"ASC"), $arFilter=array())
Определения product.php:173
static GetVATDataByIDList(array $list)
Определения product.php:204
Определения result.php:6
$arFields
Определения dblapprove.php:5
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$result
Определения get_property_values.php:14
$output
Определения options.php:436
$_SERVER["DOCUMENT_ROOT"]
Определения cron_frame.php:9
global $DB
Определения cron_frame.php:29
$vat
Определения template.php:273
$arRes
Определения options.php:104
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$iterator
Определения yandex_run.php:610