1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
catalog_sku.php
См. документацию.
1<?php
2
8
14{
15
16}
17
19{
20 public const TYPE_CATALOG = 'D';
21 public const TYPE_PRODUCT = 'P';
22 public const TYPE_OFFERS = 'O';
23 public const TYPE_FULL = 'X';
24
25 static protected $arOfferCache = array();
26 static protected $arProductCache = array();
27 static protected $arPropertyCache = array();
28 static protected $arIBlockCache = array();
29 static protected $parentCache = array();
30
31 public static function GetCatalogTypes($boolFull = false)
32 {
33 $boolFull = ($boolFull === true);
34 if ($boolFull)
35 {
36 return array(
37 self::TYPE_CATALOG => Loc::getMessage('BT_CAT_SKU_TYPE_CATALOG'),
38 self::TYPE_PRODUCT => Loc::getMessage('BT_CAT_SKU_TYPE_PRODUCT'),
39 self::TYPE_OFFERS => Loc::getMessage('BT_CAT_SKU_TYPE_OFFERS'),
40 self::TYPE_FULL => Loc::getMessage('BT_CAT_SKU_TYPE_FULL')
41 );
42 }
43 return array(
44 self::TYPE_CATALOG,
45 self::TYPE_PRODUCT,
46 self::TYPE_OFFERS,
47 self::TYPE_FULL
48 );
49 }
50
51 public static function GetProductInfo($intOfferID, $intIBlockID = 0)
52 {
53 $intOfferID = (int)$intOfferID;
54 if ($intOfferID <= 0)
55 return false;
56
57 if (!isset(self::$parentCache[$intOfferID]))
58 {
59 self::$parentCache[$intOfferID] = false;
61 if ($intIBlockID <= 0)
62 $intIBlockID = (int)CIBlockElement::GetIBlockByID($intOfferID);
63
64 if ($intIBlockID <= 0)
65 return self::$parentCache[$intOfferID];
66
67 if (!isset(self::$arOfferCache[$intIBlockID]))
68 $skuInfo = static::GetInfoByOfferIBlock($intIBlockID);
69 else
70 $skuInfo = self::$arOfferCache[$intIBlockID];
71
72 if (empty($skuInfo) || empty($skuInfo['SKU_PROPERTY_ID']))
73 return self::$parentCache[$intOfferID];
74
76 $helper = $conn->getSqlHelper();
77
78 if ($skuInfo['VERSION'] == 2)
79 {
80 $productField = $helper->quote('PROPERTY_'.$skuInfo['SKU_PROPERTY_ID']);
81 $sqlQuery = 'select '.$productField.' as ID from '.$helper->quote('b_iblock_element_prop_s'.$skuInfo['IBLOCK_ID']).
82 ' where '.$helper->quote('IBLOCK_ELEMENT_ID').' = '.$intOfferID;
83 }
84 else
85 {
86 $productField = $helper->quote('VALUE_NUM');
87 $sqlQuery = 'select '.$productField.' as ID from '.$helper->quote('b_iblock_element_property').
88 ' where '.$helper->quote('IBLOCK_PROPERTY_ID').' = '.$skuInfo['SKU_PROPERTY_ID'].
89 ' and '.$helper->quote('IBLOCK_ELEMENT_ID').' = '.$intOfferID;
90 }
91 unset($productField);
92 $parentIterator = $conn->query($sqlQuery);
93 if ($parent = $parentIterator->fetch())
94 {
95 $parent['ID'] = (int)$parent['ID'];
96 if ($parent['ID'] > 0)
97 {
98 self::$parentCache[$intOfferID] = array(
99 'ID' => $parent['ID'],
100 'IBLOCK_ID' => $skuInfo['PRODUCT_IBLOCK_ID'],
101 'OFFER_IBLOCK_ID' => $intIBlockID,
102 'SKU_PROPERTY_ID' => $skuInfo['SKU_PROPERTY_ID']
103 );
104 }
105 }
106 unset($parent, $parentIterator, $sqlQuery, $helper, $conn, $skuInfo);
107 }
108 return self::$parentCache[$intOfferID];
109 }
110
111 public static function GetInfoByOfferIBlock($intIBlockID)
112 {
114 if ($intIBlockID <= 0)
115 return false;
116 if (!isset(self::$arOfferCache[$intIBlockID]))
117 {
118 self::$arOfferCache[$intIBlockID] = false;
120 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
121 'filter' => array('=IBLOCK_ID' => $intIBlockID, '!=PRODUCT_IBLOCK_ID' => 0)
122 ));
123 $arResult = $iblockIterator->fetch();
124 if (!empty($arResult))
125 {
126 $arResult['IBLOCK_ID'] = (int)$arResult['IBLOCK_ID'];
127 $arResult['PRODUCT_IBLOCK_ID'] = (int)$arResult['PRODUCT_IBLOCK_ID'];
128 $arResult['SKU_PROPERTY_ID'] = (int)$arResult['SKU_PROPERTY_ID'];
129 $arResult['VERSION'] = (int)$arResult['VERSION'];
130 self::$arOfferCache[$arResult['IBLOCK_ID']] = $arResult;
131 self::$arOfferCache[$arResult['PRODUCT_IBLOCK_ID']] = false;
132 self::$arProductCache[$arResult['PRODUCT_IBLOCK_ID']] = $arResult;
133 self::$arProductCache[$arResult['IBLOCK_ID']] = false;
134 self::$arPropertyCache[$arResult['SKU_PROPERTY_ID']] = $arResult;
135 }
136 unset($arResult, $iblockIterator);
137 }
138 return self::$arOfferCache[$intIBlockID];
139 }
140
141 public static function GetInfoByProductIBlock($intIBlockID)
142 {
144 if ($intIBlockID <= 0)
145 return false;
146 if (!isset(self::$arProductCache[$intIBlockID]))
147 {
148 self::$arProductCache[$intIBlockID] = false;
150 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
151 'filter' => array('=PRODUCT_IBLOCK_ID' => $intIBlockID)
152 ));
153 $arResult = $iblockIterator->fetch();
154 if (!empty($arResult))
155 {
156 $arResult['IBLOCK_ID'] = (int)$arResult['IBLOCK_ID'];
157 $arResult['PRODUCT_IBLOCK_ID'] = (int)$arResult['PRODUCT_IBLOCK_ID'];
158 $arResult['SKU_PROPERTY_ID'] = (int)$arResult['SKU_PROPERTY_ID'];
159 $arResult['VERSION'] = (int)$arResult['VERSION'];
160 self::$arProductCache[$arResult['PRODUCT_IBLOCK_ID']] = $arResult;
161 self::$arProductCache[$arResult['IBLOCK_ID']] = false;
162 self::$arOfferCache[$arResult['IBLOCK_ID']] = $arResult;
163 self::$arOfferCache[$arResult['PRODUCT_IBLOCK_ID']] = false;
164 self::$arPropertyCache[$arResult['SKU_PROPERTY_ID']] = $arResult;
165 }
166 unset($arResult, $iblockIterator);
167 }
168 return self::$arProductCache[$intIBlockID];
169 }
170
171 public static function GetInfoByLinkProperty($intPropertyID)
172 {
173 $intPropertyID = (int)$intPropertyID;
174 if ($intPropertyID <= 0)
175 return false;
176 if (!isset(self::$arPropertyCache[$intPropertyID]))
177 {
178 self::$arPropertyCache[$intPropertyID] = false;
180 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
181 'filter' => array('=SKU_PROPERTY_ID' => $intPropertyID)
182 ));
183 $arResult = $iblockIterator->fetch();
184 if (!empty($arResult))
185 {
186 $arResult['IBLOCK_ID'] = (int)$arResult['IBLOCK_ID'];
187 $arResult['PRODUCT_IBLOCK_ID'] = (int)$arResult['PRODUCT_IBLOCK_ID'];
188 $arResult['SKU_PROPERTY_ID'] = (int)$arResult['SKU_PROPERTY_ID'];
189 $arResult['VERSION'] = (int)$arResult['VERSION'];
190 self::$arPropertyCache[$arResult['SKU_PROPERTY_ID']] = $arResult;
191 self::$arProductCache[$arResult['PRODUCT_IBLOCK_ID']] = $arResult;
192 self::$arProductCache[$arResult['IBLOCK_ID']] = false;
193 self::$arOfferCache[$arResult['IBLOCK_ID']] = $arResult;
194 self::$arOfferCache[$arResult['PRODUCT_IBLOCK_ID']] = false;
195 }
196 unset($arResult, $iblockIterator);
197 }
198 return self::$arPropertyCache[$intPropertyID];
199 }
200
201 public static function GetInfoByIBlock($intIBlockID)
202 {
204 if ($intIBlockID <= 0)
205 return false;
206
207 if (!isset(self::$arIBlockCache[$intIBlockID]))
208 {
209 $result = false;
210 $arIBlock = array();
211 $arProductIBlock = array();
212 $boolExists = false;
213 $boolIBlock = false;
214 $boolProductIBlock = false;
216 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VAT_ID', 'YANDEX_EXPORT', 'SUBSCRIPTION'),
217 'filter' => array(array(
218 'LOGIC' => 'OR',
219 '=IBLOCK_ID' => $intIBlockID,
220 '=PRODUCT_IBLOCK_ID' => $intIBlockID
221 ))
222 ));
223 while ($catalog = $catalogIterator->fetch())
224 {
225 $catalog['IBLOCK_ID'] = (int)$catalog['IBLOCK_ID'];
226 $catalog['PRODUCT_IBLOCK_ID'] = (int)$catalog['PRODUCT_IBLOCK_ID'];
227 $catalog['SKU_PROPERTY_ID'] = (int)$catalog['SKU_PROPERTY_ID'];
228 $catalog['VAT_ID'] = (int)$catalog['VAT_ID'];
229 $boolExists = true;
230 if ($catalog['IBLOCK_ID'] == $intIBlockID)
231 {
232 $boolIBlock = true;
234 }
235 elseif ($catalog['PRODUCT_IBLOCK_ID'] == $intIBlockID)
236 {
237 $boolProductIBlock = true;
238 $arProductIBlock = $catalog;
239 }
240 }
242 if ($boolExists)
243 {
244 if ($boolProductIBlock && $boolIBlock)
245 {
246 $result = $arProductIBlock;
247 $result['VAT_ID'] = $arIBlock['VAT_ID'];
248 $result['YANDEX_EXPORT'] = $arIBlock['YANDEX_EXPORT'];
249 $result['SUBSCRIPTION'] = $arIBlock['SUBSCRIPTION'];
250 $result['CATALOG_TYPE'] = self::TYPE_FULL;
251 }
252 elseif ($boolIBlock)
253 {
255 $result['CATALOG_TYPE'] = (0 < $result['PRODUCT_IBLOCK_ID'] ? self::TYPE_OFFERS : self::TYPE_CATALOG);
256 }
257 else
258 {
259 $result = $arProductIBlock;
260 $result['SUBSCRIPTION'] = 'N';
261 unset($result['VAT_ID'], $result['YANDEX_EXPORT']);
262 $result['CATALOG_TYPE'] = self::TYPE_PRODUCT;
263 }
264 $result['CATALOG'] = ($boolIBlock ? 'Y' : 'N');
265 }
266 self::$arIBlockCache[$intIBlockID] = $result;
267 unset($boolProductIBlock, $boolIBlock, $boolExists);
268 unset($arProductIBlock, $arIBlock);
269 unset($result);
270 }
271 return self::$arIBlockCache[$intIBlockID];
272 }
273
278 public static function IsExistOffers($intProductID, $intIBlockID = 0)
279 {
280 $result = static::getExistOffers($intProductID, $intIBlockID);
281 return !empty($result[$intProductID]);
282 }
283
284 public static function getExistOffers($productID, $iblockID = 0)
285 {
286 $iblockID = (int)$iblockID;
287 if (!is_array($productID))
288 $productID = array($productID);
290 if (empty($productID))
291 return false;
292 $result = array_fill_keys($productID, false);
293 $iblockProduct = array();
294 $iblockSku = array();
295 if ($iblockID == 0)
296 {
297 $iblockList = array();
298 $elementIterator = Iblock\ElementTable::getList(array(
299 'select' => array('ID', 'IBLOCK_ID'),
300 'filter' => array('@ID' => $productID)
301 ));
302 while ($element = $elementIterator->fetch())
303 {
304 $element['ID'] = (int)$element['ID'];
305 $element['IBLOCK_ID'] = (int)$element['IBLOCK_ID'];
306 if (!isset($iblockList[$element['IBLOCK_ID']]))
307 $iblockList[$element['IBLOCK_ID']] = array();
308 $iblockList[$element['IBLOCK_ID']][] = $element['ID'];
309 }
310 unset($element, $elementIterator);
311 if (!empty($iblockList))
312 {
313 $iblockListIds = array_keys($iblockList);
314 foreach ($iblockListIds as &$oneIblock)
315 {
316 if (!empty(self::$arOfferCache[$oneIblock]))
317 {
318 unset($iblockList[$oneIblock]);
319 continue;
320 }
321 if (isset(self::$arProductCache[$oneIblock]))
322 {
323 if (!empty(self::$arProductCache[$oneIblock]))
324 {
325 $iblockSku[$oneIblock] = self::$arProductCache[$oneIblock];
326 $iblockProduct[$oneIblock] = $iblockList[$oneIblock];
327 }
328 unset($iblockList[$oneIblock]);
329 }
330 }
331 unset($oneIblock, $iblockListIds);
332 if (!empty($iblockList))
333 {
335 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
336 'filter' => array('@PRODUCT_IBLOCK_ID' => array_keys($iblockList))
337 ));
338 while ($iblock = $iblockIterator->fetch())
339 {
340 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
341 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
342 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
343 $iblock['VERSION'] = (int)$iblock['VERSION'];
344 $iblockSku[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
345 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
346 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
347 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
348 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
349 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
350 $iblockProduct[$iblock['PRODUCT_IBLOCK_ID']] = $iblockList[$iblock['PRODUCT_IBLOCK_ID']];
351 }
352 unset($iblock, $iblockIterator);
353 }
354 }
355 unset($iblockList);
356 }
357 else
358 {
359 if (empty(self::$arOfferCache[$iblockID]))
360 {
361 if (isset(self::$arProductCache[$iblockID]))
362 {
363 if (!empty(self::$arProductCache[$iblockID]))
364 {
365 $iblockSku[$iblockID] = self::$arProductCache[$iblockID];
366 $iblockProduct[$iblockID] = $productID;
367 }
368 }
369 else
370 {
372 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
373 'filter' => array('=PRODUCT_IBLOCK_ID' => $iblockID)
374 ));
375 if ($iblock = $iblockIterator->fetch())
376 {
377 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
378 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
379 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
380 $iblock['VERSION'] = (int)$iblock['VERSION'];
381 $iblockSku[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
382 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
383 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
384 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
385 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
386 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
387 $iblockProduct[$iblockID] = $productID;
388 }
389 unset($iblock, $iblockIterator);
390 }
391 }
392 }
393 if (empty($iblockProduct))
394 return $result;
395
397 $helper = $conn->getSqlHelper();
398 $propertyIdField = $helper->quote('IBLOCK_PROPERTY_ID');
399
400 foreach ($iblockProduct as $iblockID => $iblockProductID)
401 {
402 $sku = $iblockSku[$iblockID];
403 if ($sku['VERSION'] == 2)
404 {
405 $productField = $helper->quote('PROPERTY_'.$sku['SKU_PROPERTY_ID']);
406 $sqlQuery = 'select '.$productField.' as PRODUCT_ID, COUNT(*) as CNT from '.$helper->quote('b_iblock_element_prop_s'.$sku['IBLOCK_ID']).
407 ' where '.$productField.' IN ('.implode(',', $iblockProductID).')'.
408 ' group by '.$productField;
409 }
410 else
411 {
412 $productField = $helper->quote('VALUE_NUM');
413 $sqlQuery = 'select '.$productField.' as PRODUCT_ID, COUNT(*) as CNT from '.$helper->quote('b_iblock_element_property').
414 ' where '.$propertyIdField.' = '.$sku['SKU_PROPERTY_ID'].
415 ' and '.$productField.' IN ('.implode(',', $iblockProductID).')'.
416 ' group by '.$productField;
417 }
418 unset($productField);
419 $productIterator = $conn->query($sqlQuery);
420 while ($product = $productIterator->fetch())
421 {
422 $product['CNT'] = (int)$product['CNT'];
423 if ($product['CNT'] <= 0)
424 continue;
425
426 $product['PRODUCT_ID'] = (int)$product['PRODUCT_ID'];
427 $result[$product['PRODUCT_ID']] = true;
428 }
429 unset($product, $productIterator);
430 }
431 unset($sku, $iblockProductID, $iblockID, $iblockProduct);
432 unset($propertyIdField, $helper, $conn);
433
434 return $result;
435 }
436
447 public static function getOffersList(
448 $productID,
449 $iblockID = 0,
450 $skuFilter = array(),
451 $fields = array(),
452 $propertyFilter = array(),
453 $options = array(),
454 $order = array()
455 )
456 {
457 static $propertyCache = array();
458
459 $iblockID = (int)$iblockID;
460 if (!is_array($productID))
461 $productID = array($productID);
463 if (empty($productID))
464 return false;
465 if (!is_array($skuFilter))
466 $skuFilter = array();
467 if (!is_array($fields))
469 $fields = array_merge($fields, array('ID', 'IBLOCK_ID'));
470 if (!is_array($propertyFilter))
471 $propertyFilter = array();
472
473 $iblockProduct = array();
474 $iblockSku = array();
475 $offersIblock = array();
476 if ($iblockID == 0)
477 {
478 $iblockList = array();
479
480 $list = CIBlockElement::GetIBlockByIDList($productID);
481 foreach ($list as $elementId => $elementIblock)
482 {
483 if (!isset($iblockList[$elementIblock]))
484 $iblockList[$elementIblock] = array();
485 $iblockList[$elementIblock][] = $elementId;
486 }
487 unset($elementId, $elementIblock, $list);
488
489 if (!empty($iblockList))
490 {
491 $iblockListIds = array_keys($iblockList);
492 foreach ($iblockListIds as &$oneIblock)
493 {
494 if (isset(self::$arProductCache[$oneIblock]))
495 {
496 if (!empty(self::$arProductCache[$oneIblock]))
497 {
498 $iblockSku[$oneIblock] = self::$arProductCache[$oneIblock];
499 $offersIblock[] = self::$arProductCache[$oneIblock]['IBLOCK_ID'];
500 $iblockProduct[$oneIblock] = $iblockList[$oneIblock];
501 }
502 unset($iblockList[$oneIblock]);
503 }
504 }
505 unset($oneIblock, $iblockListIds);
506 if (!empty($iblockList))
507 {
509 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
510 'filter' => array('@PRODUCT_IBLOCK_ID' => array_keys($iblockList))
511 ));
512 while ($iblock = $iblockIterator->fetch())
513 {
514 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
515 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
516 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
517 $iblock['VERSION'] = (int)$iblock['VERSION'];
518 $iblockSku[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
519 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
520 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
521 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
522 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
523 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
524 $offersIblock[] = $iblock['IBLOCK_ID'];
525 $iblockProduct[$iblock['PRODUCT_IBLOCK_ID']] = $iblockList[$iblock['PRODUCT_IBLOCK_ID']];
526 }
527 unset($iblock, $iblockIterator);
528 }
529 }
530 unset($iblockList);
531 }
532 else
533 {
534 if (empty(self::$arOfferCache[$iblockID]))
535 {
536 if (isset(self::$arProductCache[$iblockID]))
537 {
538 if (!empty(self::$arProductCache[$iblockID]))
539 {
540 $iblockSku[$iblockID] = self::$arProductCache[$iblockID];
541 $offersIblock[] = self::$arProductCache[$iblockID]['IBLOCK_ID'];
542 $iblockProduct[$iblockID] = $productID;
543 }
544 }
545 else
546 {
548 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
549 'filter' => array('=PRODUCT_IBLOCK_ID' => $iblockID)
550 ));
551 if ($iblock = $iblockIterator->fetch())
552 {
553 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
554 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
555 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
556 $iblock['VERSION'] = (int)$iblock['VERSION'];
557 $iblockSku[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
558 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
559 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
560 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
561 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
562 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
563 $offersIblock[] = $iblock['IBLOCK_ID'];
564 $iblockProduct[$iblockID] = $productID;
565 }
566 unset($iblock, $iblockIterator);
567 }
568 }
569 }
570 if (empty($iblockProduct))
571 return array();
572
573 $propertyFilter = array_filter($propertyFilter);
574 if (isset($propertyFilter['ID']))
575 {
576 $propertyFilter['ID'] = array_filter($propertyFilter['ID']);
577 if (empty($propertyFilter['ID']))
578 unset($propertyFilter['ID']);
579 }
580 if (isset($propertyFilter['CODE']))
581 {
582 $propertyFilter['CODE'] = array_filter($propertyFilter['CODE']);
583 if (empty($propertyFilter['CODE']))
584 unset($propertyFilter['CODE']);
585 }
586
587 $iblockProperties = array();
588 if (!empty($propertyFilter['ID']) || !empty($propertyFilter['CODE']))
589 {
590 sort($offersIblock);
591 $propertyIblock = array('@IBLOCK_ID' => $offersIblock);
592 if (!empty($propertyFilter['ID']))
593 {
594 sort($propertyFilter['ID']);
595 $propertyIblock['@ID'] = $propertyFilter['ID'];
596 }
597 else
598 {
599 sort($propertyFilter['CODE']);
600 $propertyIblock['@CODE'] = $propertyFilter['CODE'];
601 }
602 $propertyKey = md5(serialize($propertyIblock));
603 if (!isset($propertyCache[$propertyKey]))
604 {
605 $propertyCache[$propertyKey] = array_fill_keys($offersIblock, array());
606 $propertyIterator = Iblock\PropertyTable::getList(array(
607 'select' => array('ID', 'IBLOCK_ID'),
608 'filter' => $propertyIblock
609 ));
610 while ($property = $propertyIterator->fetch())
611 {
612 $property['IBLOCK_ID'] = (int)$property['IBLOCK_ID'];
613 $propertyCache[$propertyKey][$property['IBLOCK_ID']][] = (int)$property['ID'];
614 }
615 unset($property, $propertyIterator, $propertyIblock);
616 }
617 $iblockProperties = $propertyCache[$propertyKey];
618 }
619 unset($offersIblock);
620
621 if (empty($order))
622 {
623 $order = array('ID' => 'ASC');
624 }
625 $orderFields = array_keys($order);
626
627 $result = array_fill_keys($productID, array());
628
629 foreach ($iblockProduct as $iblockID => $productList)
630 {
631 $skuProperty = 'PROPERTY_'.$iblockSku[$iblockID]['SKU_PROPERTY_ID'];
632 $iblockFilter = $skuFilter;
633 $iblockFilter['IBLOCK_ID'] = $iblockSku[$iblockID]['IBLOCK_ID'];
634 $iblockFilter['='.$skuProperty] = $productList;
635 $iblockFields = $fields;
636 $iblockFields[] = $skuProperty;
637 $iblockFields = array_merge($iblockFields, $orderFields);
638 $skuProperty .= '_VALUE';
639 $skuPropertyId = $skuProperty.'_ID';
640 $offersLinks = array();
641 $needProperties = !empty($iblockProperties[$iblockSku[$iblockID]['IBLOCK_ID']]);
642
643 $offersIterator = CIBlockElement::GetList(
644 $order,
645 $iblockFilter,
646 false,
647 false,
648 $iblockFields
649 );
650 while ($offer = $offersIterator->Fetch())
651 {
652 $offerProduct = (int)$offer[$skuProperty];
653 unset($offer[$skuProperty]);
654 if (isset($offer[$skuPropertyId]))
655 unset($offer[$skuPropertyId]);
656 if (!isset($result[$offerProduct]))
657 continue;
658 $offer['ID'] = (int)$offer['ID'];
659 $offer['IBLOCK_ID'] = (int)$offer['IBLOCK_ID'];
660 $offer['PARENT_ID'] = $offerProduct;
661 if ($needProperties)
662 $offer['PROPERTIES'] = array();
663 $result[$offerProduct][$offer['ID']] = $offer;
664 $offersLinks[$offer['ID']] = &$result[$offerProduct][$offer['ID']];
665 }
666 unset($offerProduct, $offer, $offersIterator, $skuProperty);
667 if (!empty($offersLinks) && $needProperties)
668 {
669 $offerIds = array_keys($offersLinks);
670 foreach (array_chunk($offerIds, 500) as $pageIds)
671 {
672 $pageOffersFilter = array(
673 'ID' => $pageIds,
674 'IBLOCK_ID' => $iblockSku[$iblockID]['IBLOCK_ID']
675 );
676 CIBlockElement::GetPropertyValuesArray(
677 $offersLinks,
678 $iblockSku[$iblockID]['IBLOCK_ID'],
679 $pageOffersFilter,
680 array('ID' => $iblockProperties[$iblockSku[$iblockID]['IBLOCK_ID']]),
682 );
683 unset($pageOffersFilter);
684 }
685 unset($pageIds, $offerIds);
686 }
687 unset($offersLinks);
688 }
689 unset($productList, $iblockID, $iblockProduct);
690
691 return array_filter($result);
692 }
693
694 public static function getProductList($offerID, $iblockID = 0)
695 {
696 $iblockID = (int)$iblockID;
697 if (!is_array($offerID))
698 $offerID = array($offerID);
700 if (empty($offerID))
701 return false;
702
703 $iblockSku = array();
704 $iblockOffers = array();
705 if ($iblockID == 0)
706 {
707 $iblockList = array();
708 $elementIterator = Iblock\ElementTable::getList(array(
709 'select' => array('ID', 'IBLOCK_ID'),
710 'filter' => array('@ID' => $offerID)
711 ));
712 while ($element = $elementIterator->fetch())
713 {
714 $element['ID'] = (int)$element['ID'];
715 $element['IBLOCK_ID'] = (int)$element['IBLOCK_ID'];
716 if (!isset($iblockList[$element['IBLOCK_ID']]))
717 $iblockList[$element['IBLOCK_ID']] = array();
718 $iblockList[$element['IBLOCK_ID']][] = $element['ID'];
719 }
720 unset($element, $elementIterator);
721 if (!empty($iblockList))
722 {
723 $iblockListIds = array_keys($iblockList);
724 foreach ($iblockListIds as &$oneIblock)
725 {
726 if (!empty(self::$arProductCache[$oneIblock]))
727 {
728 unset($iblockList[$oneIblock]);
729 continue;
730 }
731 if (isset(self::$arOfferCache[$oneIblock]))
732 {
733 if (!empty(self::$arOfferCache[$oneIblock]))
734 {
735 $iblockSku[$oneIblock] = self::$arOfferCache[$oneIblock];
736 $iblockOffers[$oneIblock] = $iblockList[$oneIblock];
737 }
738 unset($iblockList[$oneIblock]);
739 }
740 }
741 unset($oneIblock, $iblockListIds);
742 if (!empty($iblockList))
743 {
745 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
746 'filter' => array('@IBLOCK_ID' => array_keys($iblockList), '!=PRODUCT_IBLOCK_ID' => 0)
747 ));
748 while ($iblock = $iblockIterator->fetch())
749 {
750 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
751 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
752 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
753 $iblock['VERSION'] = (int)$iblock['VERSION'];
754 $iblockSku[$iblock['IBLOCK_ID']] = $iblock;
755 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
756 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
757 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
758 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
759 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
760 $iblockOffers[$iblock['IBLOCK_ID']] = $iblockList[$iblock['IBLOCK_ID']];
761 }
762 unset($iblock, $iblockIterator);
763 }
764 }
765 unset($iblockList);
766 }
767 else
768 {
769 if (empty(self::$arProductCache[$iblockID]))
770 {
771 if (isset(self::$arOfferCache[$iblockID]))
772 {
773 if (!empty(self::$arOfferCache[$iblockID]))
774 {
775 $iblockSku[$iblockID] = self::$arOfferCache[$iblockID];
776 $iblockOffers[$iblockID] = $offerID;
777 }
778 }
779 else
780 {
782 'select' => array('IBLOCK_ID', 'PRODUCT_IBLOCK_ID', 'SKU_PROPERTY_ID', 'VERSION' => 'IBLOCK.VERSION'),
783 'filter' => array('=IBLOCK_ID' => $iblockID, '!=PRODUCT_IBLOCK_ID' => 0)
784 ));
785 if ($iblock = $iblockIterator->fetch())
786 {
787 $iblock['IBLOCK_ID'] = (int)$iblock['IBLOCK_ID'];
788 $iblock['PRODUCT_IBLOCK_ID'] = (int)$iblock['PRODUCT_IBLOCK_ID'];
789 $iblock['SKU_PROPERTY_ID'] = (int)$iblock['SKU_PROPERTY_ID'];
790 $iblock['VERSION'] = (int)$iblock['VERSION'];
791 $iblockSku[$iblock['IBLOCK_ID']] = $iblock;
792 self::$arProductCache[$iblock['PRODUCT_IBLOCK_ID']] = $iblock;
793 self::$arProductCache[$iblock['IBLOCK_ID']] = false;
794 self::$arOfferCache[$iblock['IBLOCK_ID']] = $iblock;
795 self::$arOfferCache[$iblock['PRODUCT_IBLOCK_ID']] = false;
796 self::$arPropertyCache[$iblock['SKU_PROPERTY_ID']] = $iblock;
797 $iblockOffers[$iblockID] = $offerID;
798 }
799 unset($iblock, $iblockIterator);
800 }
801 }
802 }
803 if (empty($iblockOffers))
804 return array();
805
806 $result = array_fill_keys($offerID, array());
807
809 $helper = $conn->getSqlHelper();
810 $offerField = $helper->quote('IBLOCK_ELEMENT_ID');
811 $propertyIdField = $helper->quote('IBLOCK_PROPERTY_ID');
812
813 foreach ($iblockOffers as $iblockID => $offerList)
814 {
815 $sku = $iblockSku[$iblockID];
816
817 foreach (array_chunk($offerList, 500) as $pageIds)
818 {
819 if ($sku['VERSION'] == 2)
820 {
821 $productField = $helper->quote('PROPERTY_'.$sku['SKU_PROPERTY_ID']);
822 $sqlQuery = 'select '.$productField.' as PRODUCT_ID, '.$offerField.' as ID from '.$helper->quote('b_iblock_element_prop_s'.$sku['IBLOCK_ID']).
823 ' where '.$offerField.' IN ('.implode(',', $pageIds).')';
824 }
825 else
826 {
827 $productField = $helper->quote('VALUE_NUM');
828 $sqlQuery = 'select '.$productField.' as PRODUCT_ID, '.$offerField.' as ID from '.$helper->quote('b_iblock_element_property').
829 ' where '.$propertyIdField.' = '.$sku['SKU_PROPERTY_ID'].
830 ' and '.$offerField.' IN ('.implode(',', $pageIds).')';
831 }
832 unset($productField);
833 $offersIterator = $conn->query($sqlQuery);
834 while ($offer = $offersIterator->fetch())
835 {
836 $currentOffer = (int)$offer['ID'];
837 $productID = (int)$offer['PRODUCT_ID'];
838 if (!isset($result[$currentOffer]) || $productID <= 0)
839 continue;
840
841 $result[$currentOffer] = array(
842 'ID' => $productID,
843 'IBLOCK_ID' => $sku['PRODUCT_IBLOCK_ID'],
844 'OFFER_IBLOCK_ID' => $iblockID,
845 'SKU_PROPERTY_ID' => $sku['SKU_PROPERTY_ID']
846 );
847 }
848 }
849 unset($sku);
850 }
851 unset($iblockID, $iblockOffers);
852 unset($helper, $conn);
853
854 return array_filter($result);
855 }
856
857 public static function ClearCache()
858 {
859 self::$arOfferCache = array();
860 self::$arProductCache = array();
861 self::$arPropertyCache = array();
862 self::$arIBlockCache = array();
863 self::$parentCache = array();
864 }
865}
while($arIBlock=$rsIBlocks->Fetch()) $catalogIterator
Определения options.php:1934
$arResult
Определения generate_coupon.php:16
static getConnection($name="")
Определения application.php:638
static getMessage($code, $replace=null, $language=null)
Определения loc.php:30
static getList(array $parameters=array())
Определения datamanager.php:431
static normalizeArrayValuesByInt(&$map, $sorted=true)
Определения collection.php:150
Определения catalog_sku.php:14
Определения catalog_sku.php:19
static getExistOffers($productID, $iblockID=0)
Определения catalog_sku.php:284
static $parentCache
Определения catalog_sku.php:29
static GetProductInfo($intOfferID, $intIBlockID=0)
Определения catalog_sku.php:51
static GetInfoByLinkProperty($intPropertyID)
Определения catalog_sku.php:171
static IsExistOffers($intProductID, $intIBlockID=0)
Определения catalog_sku.php:278
const TYPE_OFFERS
Определения catalog_sku.php:22
static getOffersList( $productID, $iblockID=0, $skuFilter=array(), $fields=array(), $propertyFilter=array(), $options=array(), $order=array())
Определения catalog_sku.php:447
static $arOfferCache
Определения catalog_sku.php:25
static GetInfoByOfferIBlock($intIBlockID)
Определения catalog_sku.php:111
static GetInfoByProductIBlock($intIBlockID)
Определения catalog_sku.php:141
static GetCatalogTypes($boolFull=false)
Определения catalog_sku.php:31
static GetInfoByIBlock($intIBlockID)
Определения catalog_sku.php:201
static $arIBlockCache
Определения catalog_sku.php:28
static $arProductCache
Определения catalog_sku.php:26
static ClearCache()
Определения catalog_sku.php:857
const TYPE_PRODUCT
Определения catalog_sku.php:21
const TYPE_FULL
Определения catalog_sku.php:23
static getProductList($offerID, $iblockID=0)
Определения catalog_sku.php:694
static $arPropertyCache
Определения catalog_sku.php:27
const TYPE_CATALOG
Определения catalog_sku.php:20
$options
Определения commerceml2.php:49
</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
$offerList
Определения iblock_catalog_edit.php:142
$catalog
Определения iblock_catalog_edit.php:135
if(! $catalogEdit->isSuccess()) $iblock
Определения iblock_catalog_edit.php:38
$iblockList
Определения iblock_catalog_list.php:271
$order
Определения payment.php:8
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(!AccessController::getCurrent() ->check(ActionDictionary::ACTION_CATALOG_EXPORT_EDIT)) if((!isset($_REQUEST['IBLOCK_ID']))||($_REQUEST['IBLOCK_ID']=='')) $intIBlockID
Определения yandex_detail.php:44
$arIBlock['PROPERTY']
Определения yandex_detail.php:172
$fields
Определения yandex_run.php:501
if( $fieldsExist) if($parametricFieldsExist) $needProperties
Определения yandex_run.php:536