19 self::$disableShowErrors++;
24 self::$disableShowErrors--;
29 return (self::$disableShowErrors >= 0);
34 self::$recalculateSet++;
39 self::$recalculateSet--;
44 return (self::$recalculateSet >= 0);
49 return self::$arErrors;
56 if (isset(
$params[
'CHECK_PRODUCT']))
58 self::$disableCheckProduct = (
'N' ==
$params[
'CHECK_PRODUCT']);
65 self::$disableCheckProduct =
false;
70 self::$arErrors =
array();
72 $strAction = mb_strtoupper($strAction);
73 if (
'ADD' != $strAction &&
'UPDATE' != $strAction &&
'TEST' != $strAction)
80 if (array_key_exists(
'DATE_CREATE',
$arFields))
82 if (array_key_exists(
'TIMESTAMP_X',
$arFields))
86 if (!$boolCheck || !empty(self::$arErrors))
88 if (static::isEnabledShowErrors())
110 public static function delete($intID)
137 $intProductID = (int)$intProductID;
138 if ($intProductID <= 0)
141 if (self::isProductInSet($intProductID, $intSetType))
144 if (CCatalogSku::IsExistOffers($intProductID))
173 $intProductID = (int)$intProductID;
174 if (0 >= $intProductID)
176 $intSetType = (int)$intSetType;
177 if (self::TYPE_SET != $intSetType && self::TYPE_GROUP != $intSetType)
180 foreach (
GetModuleEvents(
'catalog',
'OnBeforeProductAllSetsDelete',
true) as $arEvent)
186 $strSql =
'delete from b_catalog_product_sets where OWNER_ID='.$intProductID.
' and TYPE='.$intSetType;
193 case self::TYPE_GROUP:
194 if (!static::isProductHaveSet($intProductID, self::TYPE_GROUP))
199 foreach (
GetModuleEvents(
'catalog',
'OnProductAllSetsDelete',
true) as $arEvent)
213 $setID = (int)$setID;
214 $productID = (int)$productID;
219 $setParams = static::createSetItemsParamsFromUpdate($setID,
false);
223 $extSetParams = static::createSetItemsParamsFromUpdate($setID,
true);
224 $productID = $extSetParams[
'ITEM_ID'];
225 $setParams = $extSetParams[
'ITEMS'];
226 unset($extSetParams);
228 static::fillSetItemsParams($setParams);
229 static::calculateSetParams($productID, $setParams);
238 $boolCheckNew = !!$boolCheckNew;
242 $intCurrentUser = (int)
$USER->GetID();
243 if ($intCurrentUser <= 0)
244 $intCurrentUser =
false;
246 $strTimeFunc =
$DB->GetNowFunction();
248 $arProductInSet =
array();
249 $dblDiscountPercent = 0;
255 if (empty(self::$arErrors))
261 self::$arErrors[] =
array(
'id' =>
'ITEM_ID',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_PRODUCT_ID_IS_BAD'));
266 self::$arErrors[] =
array(
'id' =>
'ITEM_ID',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_PRODUCT_ID_IS_BAD'));
271 self::$arErrors[] =
array(
'id' =>
'TYPE',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_TYPE_IS_BAD'));
274 self::$arErrors[] =
array(
'id' =>
'ITEMS',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_ITEMS_IS_ABSENT'));
277 if (empty(self::$arErrors))
283 if (empty(self::$arErrors))
286 $arProductInSet[
$arFields[
'ITEM_ID']] =
true;
288 $arValidItems =
array();
289 foreach (
$arFields[
'ITEMS'] as &$arOneItem)
291 if (empty($arOneItem) || !is_array($arOneItem))
293 $arOneItem = array_merge($arDefItem, $arOneItem);
294 $arOneItem[
'ITEM_ID'] = (int)$arOneItem[
'ITEM_ID'];
295 if (0 >= $arOneItem[
'ITEM_ID'])
297 if (isset($arProductInSet[$arOneItem[
'ITEM_ID']]))
299 self::$arErrors[] =
array(
'id' =>
'ITEM_ID',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_ITEM_ID_DUBLICATE'));
302 $arProductInSet[$arOneItem[
'ITEM_ID']] =
true;
303 $arOneItem[
'QUANTITY'] = doubleval($arOneItem[
'QUANTITY']);
304 if (0 >= $arOneItem[
'QUANTITY'])
306 self::$arErrors[] =
array(
318 $arOneItem[
'MEASURE'] = (int)$arOneItem[
'MEASURE'];
319 if (0 > $arOneItem[
'MEASURE'])
320 $arOneItem[
'MEASURE'] = 0;
322 if (
false !== $arOneItem[
'DISCOUNT_PERCENT'])
324 $arOneItem[
'DISCOUNT_PERCENT'] = doubleval($arOneItem[
'DISCOUNT_PERCENT']);
325 if (0 > $arOneItem[
'DISCOUNT_PERCENT'] || 100 < $arOneItem[
'DISCOUNT_PERCENT'])
327 self::$arErrors[] =
array(
'id' =>
'DISCOUNT_PERCENT',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_DISCOUNT_PERCENT_IS_BAD'));
330 $dblDiscountPercent += $arOneItem[
'DISCOUNT_PERCENT'];
335 $arOneItem[
'MEASURE'] =
false;
336 $arOneItem[
'DISCOUNT_PERCENT'] =
false;
338 $arValidItems[] = $arOneItem;
341 if (empty($arValidItems))
342 self::$arErrors[] =
array(
'id' =>
'ITEMS',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_EMPTY_VALID_ITEMS'));
345 unset($arValidItems);
346 if (100 < $dblDiscountPercent)
347 self::$arErrors[] =
array(
'id' =>
'DISCOUNT_PERCENT',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_ALL_DISCOUNT_PERCENT_IS_BAD'));
350 if (empty(self::$arErrors))
352 $arProductList = array_keys($arProductInSet);
353 if (!self::$disableCheckProduct)
355 if (
$arFields[
'TYPE'] == self::TYPE_GROUP)
357 $checkProductList = $arProductInSet;
359 unset($checkProductList[
$arFields[
'ITEM_ID']]);
360 $checkProductList = array_keys($checkProductList);
364 $checkProductList = $arProductList;
366 if (!static::checkProducts(
$arFields[
'TYPE'], $checkProductList))
368 self::$arErrors[] =
array(
377 unset($checkProductList);
381 if (empty(self::$arErrors))
390 $arFields[
'~DATE_CREATE'] = $strTimeFunc;
391 $arFields[
'~TIMESTAMP_X'] = $strTimeFunc;
394 $arFields[
'CREATED_BY'] = $intCurrentUser;
397 $arFields[
'MODIFIED_BY'] = $intCurrentUser;
401 return empty(self::$arErrors);
411 $intCurrentUser = (int)
$USER->GetID();
412 if ($intCurrentUser <= 0)
413 $intCurrentUser =
false;
415 $strTimeFunc =
$DB->GetNowFunction();
419 $arProductInSet =
array();
420 $dblDiscountPercent = 0;
423 $intID = (int)$intID;
427 $arCurrent =
array();
428 if (empty(self::$arErrors))
431 if (empty($arCurrent))
435 if (empty(self::$arErrors))
438 if (array_key_exists(
'ACTIVE',
$arFields))
449 $arFields[
'MODIFIED_BY'] = $intCurrentUser;
451 $arFields[
'~TIMESTAMP_X'] = $strTimeFunc;
454 if (empty(self::$arErrors))
456 $arProductInSet[$arCurrent[
'ITEM_ID']] =
true;
458 if (array_key_exists(
'ITEMS',
$arFields))
462 self::$arErrors[] =
array(
'id' =>
'ITEMS',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_ITEMS_IS_ABSENT'));
466 $arValidItems =
array();
467 foreach (
$arFields[
'ITEMS'] as &$arOneItem)
469 if (empty($arOneItem) || !is_array($arOneItem))
471 if (array_key_exists(
'ID', $arOneItem))
472 unset($arOneItem[
'ID']);
473 if (!array_key_exists(
'ITEM_ID', $arOneItem))
475 $arOneItem[
'ITEM_ID'] = (int)$arOneItem[
'ITEM_ID'];
476 if ($arOneItem[
'ITEM_ID'] <= 0)
478 if (isset($arProductInSet[$arOneItem[
'ITEM_ID']]))
480 self::$arErrors[] =
array(
'id' =>
'ITEM_ID',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_ITEM_ID_DUBLICATE'));
483 $arProductInSet[$arOneItem[
'ITEM_ID']] =
true;
485 if (
false === $intRowID)
487 $arOneItem = array_merge($arDefItem, $arOneItem);
491 $arOneItem[
'ID'] = $intRowID;
493 if (array_key_exists(
'SORT', $arOneItem))
495 $arOneItem[
'SORT'] = (int)$arOneItem[
'SORT'];
496 if ($arOneItem[
'SORT'] <= 0)
497 $arOneItem[
'SORT'] = 100;
499 if (array_key_exists(
'QUANTITY', $arOneItem))
501 $arOneItem[
'QUANTITY'] = doubleval($arOneItem[
'QUANTITY']);
502 if (0 >= $arOneItem[
'QUANTITY'])
504 self::$arErrors[] =
array(
507 self::TYPE_SET == $arCurrent[
'TYPE']
515 if (self::TYPE_SET == $arCurrent[
'TYPE'])
517 if (array_key_exists(
'MEASURE', $arOneItem))
519 $arOneItem[
'MEASURE'] = (int)$arOneItem[
'MEASURE'];
520 if ($arOneItem[
'MEASURE'] < 0)
521 $arOneItem[
'MEASURE'] = 0;
523 if (array_key_exists(
'DISCOUNT_PERCENT', $arOneItem))
525 if (
false !== $arOneItem[
'DISCOUNT_PERCENT'])
527 $arOneItem[
'DISCOUNT_PERCENT'] = doubleval($arOneItem[
'DISCOUNT_PERCENT']);
528 if (0 > $arOneItem[
'DISCOUNT_PERCENT'] || 100 < $arOneItem[
'DISCOUNT_PERCENT'])
530 self::$arErrors[] =
array(
'id' =>
'DISCOUNT_PERCENT',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_DISCOUNT_PERCENT_IS_BAD'));
533 $dblDiscountPercent += $arOneItem[
'DISCOUNT_PERCENT'];
538 if (
false !== $intRowID)
540 if (
false !== $arCurrent[
'ITEMS'][$intRowID][
'DISCOUNT_PERCENT'])
541 $dblDiscountPercent += $arCurrent[
'ITEMS'][$intRowID][
'DISCOUNT_PERCENT'];
546 $arValidItems[] = $arOneItem;
549 if (empty($arValidItems))
551 self::$arErrors[] =
array(
'id' =>
'ITEMS',
'text' =>
Loc::getMessage(
'BT_CAT_SET_ERR_EMPTY_VALID_ITEMS'));
558 unset($arValidItems);
559 if (100 < $dblDiscountPercent)
560 self::$arErrors[] =
array(
'id' =>
'DISCOUNT_PERCENT',
'text' =>
Loc::getMessage(
'BT_CAT_PRODUCT_SET_ERR_ALL_DISCOUNT_PERCENT_IS_BAD'));
563 if (empty(self::$arErrors))
565 if (isset($arProductInSet[$arCurrent[
'ITEM_ID']]))
566 unset($arProductInSet[$arCurrent[
'ITEM_ID']]);
567 if (!self::$disableCheckProduct)
569 if (!static::checkProducts($arCurrent[
'TYPE'], array_keys($arProductInSet)))
571 self::$arErrors[] =
array(
574 $arCurrent[
'TYPE'] == self::TYPE_GROUP
584 if (empty(self::$arErrors))
590 return empty(self::$arErrors);
600 if (self::TYPE_SET == $intSetType)
603 'TYPE' => self::TYPE_SET,
609 'DISCOUNT_PERCENT' =>
false,
617 'TYPE' => self::TYPE_GROUP,
636 'ID',
'DATE_CREATE',
'TIMESTAMP_X'
638 foreach (
$arFields[
'ITEMS'] as &$arOneItem)
640 foreach ($arClear as &$strKey)
642 if (array_key_exists($strKey, $arOneItem))
643 unset($arOneItem[$strKey]);
648 $arOneItem[
'OWNER_ID'] =
$arFields[
'ITEM_ID'];
649 $arOneItem[
'ACTIVE'] =
$arFields[
'ACTIVE'];
650 $arOneItem[
'CREATED_BY'] =
$arFields[
'CREATED_BY'];
651 $arOneItem[
'~DATE_CREATE'] =
$arFields[
'~DATE_CREATE'];
652 $arOneItem[
'MODIFIED_BY'] =
$arFields[
'MODIFIED_BY'];
653 $arOneItem[
'~TIMESTAMP_X'] =
$arFields[
'~TIMESTAMP_X'];
660 $strActive = (isset(
$arFields[
'ACTIVE']) ?
$arFields[
'ACTIVE'] : $arCurrent[
'ACTIVE']);
662 if (self::TYPE_GROUP == $arCurrent[
'TYPE'])
665 'CREATED_BY',
'TYPE',
'SET_ID',
'OWNER_ID',
'ITEM_ID',
'MEASURE',
'DISCOUNT_PERCENT'
671 'CREATED_BY',
'TYPE',
'SET_ID',
'OWNER_ID',
'ITEM_ID'
674 foreach (
$arFields[
'ITEMS'] as &$arOneItem)
676 if (array_key_exists(
'DATE_CREATE', $arOneItem))
677 unset($arOneItem[
'DATE_CREATE']);
679 $arOneItem[
'ACTIVE'] = $strActive;
680 $arOneItem[
'MODIFIED_BY'] =
$arFields[
'MODIFIED_BY'];
681 $arOneItem[
'~TIMESTAMP_X'] =
$arFields[
'~TIMESTAMP_X'];
683 if (array_key_exists(
'ID', $arOneItem))
685 foreach ($arClear as &$strKey)
687 if (array_key_exists($strKey, $arOneItem))
688 unset($arOneItem[$strKey]);
694 $arOneItem[
'TYPE'] = $arCurrent[
'TYPE'];
695 $arOneItem[
'SET_ID'] = $arCurrent[
'ID'];
696 $arOneItem[
'OWNER_ID'] = $arCurrent[
'ITEM_ID'];
698 $arOneItem[
'CREATED_BY'] =
$arFields[
'MODIFIED_BY'];
699 $arOneItem[
'~DATE_CREATE'] =
$arFields[
'~TIMESTAMP_X'];
707 $intSetType = (int)$intSetType;
709 'TYPE',
'SET_ID',
'ITEM_ID',
'OWNER_ID',
'CREATED_BY',
'MEASURE',
'DISCOUNT_PERCENT'
711 if ($intSetType == self::TYPE_SET)
712 $arClear[] =
'QUANTITY';
713 foreach ($arClear as &$strKey)
715 if (array_key_exists($strKey,
$arFields))
731 'DISCOUNT_PERCENT' =>
false,
748 'DISCOUNT_PERCENT' =>
false,
757 foreach ($arItems as &$arOneItem)
759 if ($intItemID === $arOneItem[
'ITEM_ID'])
761 $mxResult = $arOneItem[
'ID'];
782 'select' => [
'ID',
'QUANTITY',
'QUANTITY_TRACE',
'CAN_BUY_ZERO',
'WEIGHT'],
783 'filter' => [
'@ID' => array_keys(
$items)]
785 while ($product = $productIterator->fetch())
787 $product[
'ID'] = (int)$product[
'ID'];
788 if (isset(
$items[$product[
'ID']]))
790 $items[$product[
'ID']] = array_merge(
$items[$product[
'ID']], $product);
798 foreach (
$items as &$oneItem)
800 $oneItem[
'ITEM_ID'] = (int)$oneItem[
'ITEM_ID'];
802 'QUANTITY_IN_SET' => $oneItem[
'QUANTITY']
817 isset($item[
'QUANTITY_TRACE']) && $item[
'QUANTITY_TRACE'] ===
'Y'
818 && isset($item[
'CAN_BUY_ZERO']) && $item[
'CAN_BUY_ZERO'] ===
'N'
825 if (
$type != self::TYPE_SET &&
$type != self::TYPE_GROUP)
828 if (empty($productList))
832 if (empty($productList))
839 if (
$type == self::TYPE_GROUP)
843 'select' =>
array(
'ID',
'TYPE'),
844 'filter' =>
array(
'@ID' => $productList)
846 $productList = array_fill_keys($productList,
true);
847 while ($product = $productIterator->fetch())
849 $id = (int)$product[
'ID'];
850 $productType = (int)$product[
'TYPE'];
851 if (isset($allowTypes[$productType]) && isset($productList[$id]))
852 unset($productList[$id]);
853 unset($productType, $id);
855 unset($product, $productIterator);
857 return (empty($productList));
static getMessage($code, $replace=null, $language=null)
static getList(array $parameters=array())
static normalizeArrayValuesByInt(&$map, $sorted=true)
static Update($id, $fields)
static SetProductType($intID, $intTypeID)
static getEmptySet($intSetType)
static calculateSetParams($productID, $items)
static update($intID, $arFields)
static enableRecalculateSet()
static fillSetItemsParams(&$items)
static setItemFieldsForUpdate(&$arFields, $arCurrent)
static checkFieldsToUpdate($intID, &$arFields)
static searchItem($intItemID, &$arItems)
static deleteAllSetsByProduct($intProductID, $intSetType)
static createSetItemsParamsFromAdd($items)
static checkFields($strAction, &$arFields, $intID=0)
static isProductInSet($intProductID, $intSetType=0)
static disableShowErrors()
static enableShowErrors()
static disableRecalculateSet()
static isEnabledShowErrors()
static deleteFromSet($intID, $arEx)
static getEmptyItemFields()
static getAllSetsByProduct($intProductID, $intSetType)
static $disableCheckProduct
static setItemFieldsForAdd(&$arFields)
static $disableShowErrors
static canCreateSetByProduct($intProductID, $intSetType)
static isTracedItem($item)
static clearFieldsForUpdate(&$arFields, $intSetType)
static clearCheckParams()
static isProductHaveSet($arProductID, $intSetType=0)
static checkFieldsToAdd(&$arFields, $boolCheckNew=false)
static isEnabledRecalculateSet()
static createSetItemsParamsFromUpdate($setID, $getProductID=false)
static checkProducts($type, array $productList)
static setCheckParams($params)
static recalculateSet($setID, $productID=0)
static getSetByID($intID)
static recalculateSetsByProduct($product)
static getSetByID($intID)
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
ExecuteModuleEventEx($arEvent, $arParams=[])
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']