%PDF- %PDF-
Direktori : /home/bitrix/www/bitrix/modules/catalog/general/ |
Current File : /home/bitrix/www/bitrix/modules/catalog/general/product_set.php |
<? use Bitrix\Main, Bitrix\Main\Localization\Loc, Bitrix\Catalog; Loc::loadMessages(__FILE__); class CCatalogProductSetAll { const TYPE_SET = 1; const TYPE_GROUP = 2; protected static $arErrors = array(); protected static $disableShowErrors = 0; protected static $disableCheckProduct = false; protected static $recalculateSet = 0; public static function enableShowErrors() { self::$disableShowErrors++; } public static function disableShowErrors() { self::$disableShowErrors--; } public static function isEnabledShowErrors() { return (self::$disableShowErrors >= 0); } public static function enableRecalculateSet() { self::$recalculateSet++; } public static function disableRecalculateSet() { self::$recalculateSet--; } public static function isEnabledRecalculateSet() { return (self::$recalculateSet >= 0); } public static function getErrors() { return self::$arErrors; } public static function setCheckParams($params) { if (!empty($params) && is_array($params)) { if (isset($params['CHECK_PRODUCT'])) { self::$disableCheckProduct = ('N' == $params['CHECK_PRODUCT']); } } } public static function clearCheckParams() { self::$disableCheckProduct = false; } public static function checkFields($strAction, &$arFields, $intID = 0) { self::$arErrors = array(); $strAction = strtoupper($strAction); if ('ADD' != $strAction && 'UPDATE' != $strAction && 'TEST' != $strAction) return false; if (empty($arFields) || !is_array($arFields)) return false; if (array_key_exists('ID', $arFields)) unset($arFields['ID']); if (array_key_exists('DATE_CREATE', $arFields)) unset($arFields['DATE_CREATE']); if (array_key_exists('TIMESTAMP_X', $arFields)) unset($arFields['TIMESTAMP_X']); $boolCheck = ('UPDATE' != $strAction ? self::checkFieldsToAdd($arFields, 'TEST' == $strAction) : self::checkFieldsToUpdate($intID, $arFields)); if (!$boolCheck || !empty(self::$arErrors)) { if (self::$disableShowErrors >= 0) { global $APPLICATION; $obError = new CAdminException(self::$arErrors); $APPLICATION->ResetException(); $APPLICATION->ThrowException($obError); } return false; } return true; } public static function add($arFields) { return false; } public static function update($intID, $arFields) { return false; } public static function delete($intID) { return false; } public static function isProductInSet($intProductID, $intSetType = 0) { return false; } public static function isProductHaveSet($arProductID, $intSetType = 0) { return false; } public static function canCreateSetByProduct($intProductID, $intSetType) { $intProductID = (int)$intProductID; if ($intProductID <= 0) return false; if (self::isProductInSet($intProductID, $intSetType)) return false; if (CCatalogSku::IsExistOffers($intProductID)) return false; return true; } public static function getAllSetsByProduct($intProductID, $intSetType) { return false; } public static function getSetByID($intID) { return false; } public static function deleteAllSetsByProduct($intProductID, $intSetType) { global $DB; $intProductID = (int)$intProductID; if (0 >= $intProductID) return false; $intSetType = (int)$intSetType; if (self::TYPE_SET != $intSetType && self::TYPE_GROUP != $intSetType) return false; foreach (GetModuleEvents('catalog', 'OnBeforeProductAllSetsDelete', true) as $arEvent) { if (ExecuteModuleEventEx($arEvent, array($intProductID, $intSetType)) === false) return false; } $strSql = 'delete from b_catalog_product_sets where OWNER_ID='.$intProductID.' and TYPE='.$intSetType; $DB->Query($strSql, false, 'File: '.__FILE__.'<br>Line: '.__LINE__); switch ($intSetType) { case self::TYPE_SET: CCatalogProduct::SetProductType($intProductID, Catalog\ProductTable::TYPE_PRODUCT); break; case self::TYPE_GROUP: if (!static::isProductHaveSet($intProductID, self::TYPE_GROUP)) CCatalogProduct::Update($intProductID, array('BUNDLE' => Catalog\ProductTable::STATUS_NO)); break; } foreach (GetModuleEvents('catalog', 'OnProductAllSetsDelete', true) as $arEvent) ExecuteModuleEventEx($arEvent, array($intProductID, $intSetType)); return true; } public static function recalculateSetsByProduct($product) { } public static function recalculateSet($setID, $productID = 0) { $setID = (int)$setID; $productID = (int)$productID; if ($setID > 0) { if ($productID > 0) { $setParams = static::createSetItemsParamsFromUpdate($setID, false); } else { $extSetParams = static::createSetItemsParamsFromUpdate($setID, true); $productID = $extSetParams['ITEM_ID']; $setParams = $extSetParams['ITEMS']; unset($extSetParams); } static::fillSetItemsParams($setParams); static::calculateSetParams($productID, $setParams); } } protected static function checkFieldsToAdd(&$arFields, $boolCheckNew = false) { global $DB; global $USER; $boolCheckNew = !!$boolCheckNew; $intCurrentUser = 0; if (CCatalog::IsUserExists()) $intCurrentUser = (int)$USER->GetID(); if ($intCurrentUser <= 0) $intCurrentUser = false; $strTimeFunc = $DB->GetNowFunction(); $arProductInSet = array(); $dblDiscountPercent = 0; $arDefItem = self::getEmptyItemFields(); $arFields = array_merge(self::getEmptyFields(), $arFields); if (empty(self::$arErrors)) { $arFields['ITEM_ID'] = (int)$arFields['ITEM_ID']; if (!$boolCheckNew) { if (0 >= $arFields['ITEM_ID']) self::$arErrors[] = array('id' => 'ITEM_ID', 'text' => Loc::getMessage('BT_CAT_SET_ERR_PRODUCT_ID_IS_BAD')); } else { if (0 > $arFields['ITEM_ID']) self::$arErrors[] = array('id' => 'ITEM_ID', 'text' => Loc::getMessage('BT_CAT_SET_ERR_PRODUCT_ID_IS_BAD')); } $arFields['TYPE'] = (int)$arFields['TYPE']; if (self::TYPE_SET != $arFields['TYPE'] && self::TYPE_GROUP != $arFields['TYPE']) self::$arErrors[] = array('id' => 'TYPE', 'text' => Loc::getMessage('BT_CAT_SET_ERR_TYPE_IS_BAD')); if (empty($arFields['ITEMS']) || !is_array($arFields['ITEMS'])) self::$arErrors[] = array('id' => 'ITEMS', 'text' => Loc::getMessage('BT_CAT_SET_ERR_ITEMS_IS_ABSENT')); } if (empty(self::$arErrors)) { $arFields['QUANTITY'] = false; $arFields['MEASURE'] = false; $arFields['DISCOUNT_PERCENT'] = false; } if (empty(self::$arErrors)) { if (0 < $arFields['ITEM_ID']) $arProductInSet[$arFields['ITEM_ID']] = true; $arValidItems = array(); foreach ($arFields['ITEMS'] as &$arOneItem) { if (empty($arOneItem) || !is_array($arOneItem)) continue; $arOneItem = array_merge($arDefItem, $arOneItem); $arOneItem['ITEM_ID'] = (int)$arOneItem['ITEM_ID']; if (0 >= $arOneItem['ITEM_ID']) continue; if (isset($arProductInSet[$arOneItem['ITEM_ID']])) { self::$arErrors[] = array('id' => 'ITEM_ID', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_ITEM_ID_DUBLICATE')); continue; } $arProductInSet[$arOneItem['ITEM_ID']] = true; $arOneItem['QUANTITY'] = doubleval($arOneItem['QUANTITY']); if (0 >= $arOneItem['QUANTITY']) { self::$arErrors[] = array( 'id' => 'QUANTITY', 'text' => ( self::TYPE_SET == $arFields['TYPE'] ? Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_QUANTITY_IS_BAD') : Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_QUANTITY_GROUP_IS_BAD') ) ); continue; } if (self::TYPE_SET == $arFields['TYPE']) { $arOneItem['MEASURE'] = (int)$arOneItem['MEASURE']; if (0 > $arOneItem['MEASURE']) $arOneItem['MEASURE'] = 0; if (false !== $arOneItem['DISCOUNT_PERCENT']) { $arOneItem['DISCOUNT_PERCENT'] = doubleval($arOneItem['DISCOUNT_PERCENT']); if (0 > $arOneItem['DISCOUNT_PERCENT'] || 100 < $arOneItem['DISCOUNT_PERCENT']) { self::$arErrors[] = array('id' => 'DISCOUNT_PERCENT', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_DISCOUNT_PERCENT_IS_BAD')); continue; } $dblDiscountPercent += $arOneItem['DISCOUNT_PERCENT']; } } else { $arOneItem['MEASURE'] = false; $arOneItem['DISCOUNT_PERCENT'] = false; } $arValidItems[] = $arOneItem; } unset($arOneItem); if (empty($arValidItems)) self::$arErrors[] = array('id' => 'ITEMS', 'text' => Loc::getMessage('BT_CAT_SET_ERR_EMPTY_VALID_ITEMS')); else $arFields['ITEMS'] = $arValidItems; unset($arValidItems); if (100 < $dblDiscountPercent) self::$arErrors[] = array('id' => 'DISCOUNT_PERCENT', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_ALL_DISCOUNT_PERCENT_IS_BAD')); } if (empty(self::$arErrors)) { $arProductList = array_keys($arProductInSet); if (!self::$disableCheckProduct) { if ($arFields['TYPE'] == self::TYPE_GROUP) { $checkProductList = $arProductInSet; if ($arFields['ITEM_ID'] > 0) unset($checkProductList[$arFields['ITEM_ID']]); $checkProductList = array_keys($checkProductList); } else { $checkProductList = $arProductList; } if (!static::checkProducts($arFields['TYPE'], $checkProductList)) { self::$arErrors[] = array( 'id' => 'ITEMS', 'text' => ( $arFields['TYPE'] == self::TYPE_GROUP ? Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_BAD_ITEMS_IN_GROUP') : Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_BAD_ITEMS_IN_SET') ) ); } unset($checkProductList); } } if (empty(self::$arErrors)) { $arFields['ACTIVE'] = ('N' != $arFields['ACTIVE'] ? 'Y' : 'N'); $arFields['SORT'] = (int)$arFields['SORT']; if (0 >= $arFields['SORT']) $arFields['SORT'] = 100; $arFields['SET_ID'] = 0; $arFields['OWNER_ID'] = $arFields['ITEM_ID']; $arFields['~DATE_CREATE'] = $strTimeFunc; $arFields['~TIMESTAMP_X'] = $strTimeFunc; $arFields['CREATED_BY'] = (!array_key_exists('CREATED_BY', $arFields) ? 0 : (int)$arFields['CREATED_BY']); if (0 >= $arFields['CREATED_BY']) $arFields['CREATED_BY'] = $intCurrentUser; $arFields['MODIFIED_BY'] = (!array_key_exists('MODIFIED_BY', $arFields) ? 0 : (int)$arFields['MODIFIED_BY']); if (0 >= $arFields['MODIFIED_BY']) $arFields['MODIFIED_BY'] = $intCurrentUser; self::setItemFieldsForAdd($arFields); } return empty(self::$arErrors); } protected static function checkFieldsToUpdate($intID, &$arFields) { global $DB; global $USER; $intCurrentUser = 0; if (CCatalog::IsUserExists()) $intCurrentUser = (int)$USER->GetID(); if ($intCurrentUser <= 0) $intCurrentUser = false; $strTimeFunc = $DB->GetNowFunction(); $arDefItem = self::getEmptyItemFields(); $arProductInSet = array(); $dblDiscountPercent = 0; $boolItems = false; $intID = (int)$intID; if ($intID <= 0) self::$arErrors[] = array('id' => 'ID', 'text' => Loc::getMessage('BT_CAT_SET_ERR_ID_IS_BAD')); $arCurrent = array(); if (empty(self::$arErrors)) { $arCurrent = CCatalogProductSet::getSetByID($intID); if (empty($arCurrent)) self::$arErrors[] = array('id' => 'ID', 'text' => Loc::getMessage('BT_CAT_SET_ERR_ID_IS_BAD')); } if (empty(self::$arErrors)) { self::clearFieldsForUpdate($arFields, $arCurrent['TYPE']); if (array_key_exists('ACTIVE', $arFields)) $arFields['ACTIVE'] = ('N' != $arFields['ACTIVE'] ? 'Y' : 'N'); if (array_key_exists('SORT', $arFields)) { $arFields['SORT'] = (int)$arFields['SORT']; if ($arFields['SORT'] <= 0) $arFields['SORT'] = 100; } $arFields['MODIFIED_BY'] = (!array_key_exists('MODIFIED_BY', $arFields) ? 0 : (int)$arFields['MODIFIED_BY']); if ($arFields['MODIFIED_BY'] <= 0) $arFields['MODIFIED_BY'] = $intCurrentUser; $arFields['~TIMESTAMP_X'] = $strTimeFunc; } if (empty(self::$arErrors)) { $arProductInSet[$arCurrent['ITEM_ID']] = true; if (array_key_exists('ITEMS', $arFields)) { if (empty($arFields['ITEMS']) || !is_array($arFields['ITEMS'])) { self::$arErrors[] = array('id' => 'ITEMS', 'text' => Loc::getMessage('BT_CAT_SET_ERR_ITEMS_IS_ABSENT')); } else { $arValidItems = array(); foreach ($arFields['ITEMS'] as &$arOneItem) { if (empty($arOneItem) || !is_array($arOneItem)) continue; if (array_key_exists('ID', $arOneItem)) unset($arOneItem['ID']); if (!array_key_exists('ITEM_ID', $arOneItem)) continue; $arOneItem['ITEM_ID'] = (int)$arOneItem['ITEM_ID']; if ($arOneItem['ITEM_ID'] <= 0) continue; if (isset($arProductInSet[$arOneItem['ITEM_ID']])) { self::$arErrors[] = array('id' => 'ITEM_ID', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_ITEM_ID_DUBLICATE')); continue; } $arProductInSet[$arOneItem['ITEM_ID']] = true; $intRowID = self::searchItem($arOneItem['ITEM_ID'], $arCurrent['ITEMS']); if (false === $intRowID) { $arOneItem = array_merge($arDefItem, $arOneItem); } else { $arOneItem['ID'] = $intRowID; } if (array_key_exists('SORT', $arOneItem)) { $arOneItem['SORT'] = (int)$arOneItem['SORT']; if ($arOneItem['SORT'] <= 0) $arOneItem['SORT'] = 100; } if (array_key_exists('QUANTITY', $arOneItem)) { $arOneItem['QUANTITY'] = doubleval($arOneItem['QUANTITY']); if (0 >= $arOneItem['QUANTITY']) { self::$arErrors[] = array( 'id' => 'QUANTITY', 'text' => ( self::TYPE_SET == $arCurrent['TYPE'] ? Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_QUANTITY_IS_BAD') : Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_QUANTITY_GROUP_IS_BAD') ) ); continue; } } if (self::TYPE_SET == $arCurrent['TYPE']) { if (array_key_exists('MEASURE', $arOneItem)) { $arOneItem['MEASURE'] = (int)$arOneItem['MEASURE']; if ($arOneItem['MEASURE'] < 0) $arOneItem['MEASURE'] = 0; } if (array_key_exists('DISCOUNT_PERCENT', $arOneItem)) { if (false !== $arOneItem['DISCOUNT_PERCENT']) { $arOneItem['DISCOUNT_PERCENT'] = doubleval($arOneItem['DISCOUNT_PERCENT']); if (0 > $arOneItem['DISCOUNT_PERCENT'] || 100 < $arOneItem['DISCOUNT_PERCENT']) { self::$arErrors[] = array('id' => 'DISCOUNT_PERCENT', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_DISCOUNT_PERCENT_IS_BAD')); continue; } $dblDiscountPercent += $arOneItem['DISCOUNT_PERCENT']; } } else { if (false !== $intRowID) { if (false !== $arCurrent['ITEMS'][$intRowID]['DISCOUNT_PERCENT']) $dblDiscountPercent += $arCurrent['ITEMS'][$intRowID]['DISCOUNT_PERCENT']; } } } $arValidItems[] = $arOneItem; } unset($arOneItem); if (empty($arValidItems)) { self::$arErrors[] = array('id' => 'ITEMS', 'text' => Loc::getMessage('BT_CAT_SET_ERR_EMPTY_VALID_ITEMS')); } else { $arFields['ITEMS'] = $arValidItems; $boolItems = true; } unset($arValidItems); if (100 < $dblDiscountPercent) self::$arErrors[] = array('id' => 'DISCOUNT_PERCENT', 'text' => Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_ALL_DISCOUNT_PERCENT_IS_BAD')); } } if (empty(self::$arErrors)) { if (isset($arProductInSet[$arCurrent['ITEM_ID']])) unset($arProductInSet[$arCurrent['ITEM_ID']]); if (!self::$disableCheckProduct) { if (!static::checkProducts($arCurrent['TYPE'], array_keys($arProductInSet))) { self::$arErrors[] = array( 'id' => 'ITEMS', 'text' => ( $arCurrent['TYPE'] == self::TYPE_GROUP ? Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_BAD_ITEMS_IN_GROUP') : Loc::getMessage('BT_CAT_PRODUCT_SET_ERR_BAD_ITEMS_IN_SET') ) ); } } } } if (empty(self::$arErrors)) { if ($boolItems) self::setItemFieldsForUpdate($arFields, $arCurrent); } return empty(self::$arErrors); } protected static function getSetID($intID) { return false; } protected static function getEmptySet($intSetType) { if (self::TYPE_SET == $intSetType) { return array( 'TYPE' => self::TYPE_SET, 'SET_ID' => 0, 'ITEM_ID' => 0, 'ACTIVE' => '', 'QUANTITY' => 0, 'MEASURE' => false, 'DISCOUNT_PERCENT' => false, 'SORT' => 0, 'ITEMS' => array() ); } else { return array( 'TYPE' => self::TYPE_GROUP, 'SET_ID' => 0, 'ITEM_ID' => 0, 'ACTIVE' => '', 'QUANTITY' => 0, 'SORT' => 0, 'ITEMS' => array() ); } } protected static function deleteFromSet($intID, $arEx) { return false; } protected static function setItemFieldsForAdd(&$arFields) { $arClear = array( 'ID', 'DATE_CREATE', 'TIMESTAMP_X' ); foreach ($arFields['ITEMS'] as &$arOneItem) { foreach ($arClear as &$strKey) { if (array_key_exists($strKey, $arOneItem)) unset($arOneItem[$strKey]); } unset($strKey); $arOneItem['TYPE'] = $arFields['TYPE']; $arOneItem['OWNER_ID'] = $arFields['ITEM_ID']; $arOneItem['ACTIVE'] = $arFields['ACTIVE']; $arOneItem['CREATED_BY'] = $arFields['CREATED_BY']; $arOneItem['~DATE_CREATE'] = $arFields['~DATE_CREATE']; $arOneItem['MODIFIED_BY'] = $arFields['MODIFIED_BY']; $arOneItem['~TIMESTAMP_X'] = $arFields['~TIMESTAMP_X']; } unset($arOneItem); } protected static function setItemFieldsForUpdate(&$arFields, $arCurrent) { $strActive = (isset($arFields['ACTIVE']) ? $arFields['ACTIVE'] : $arCurrent['ACTIVE']); if (self::TYPE_GROUP == $arCurrent['TYPE']) { $arClear = array( 'CREATED_BY', 'TYPE', 'SET_ID', 'OWNER_ID', 'ITEM_ID', 'MEASURE', 'DISCOUNT_PERCENT' ); } else { $arClear = array( 'CREATED_BY', 'TYPE', 'SET_ID', 'OWNER_ID', 'ITEM_ID' ); } foreach ($arFields['ITEMS'] as &$arOneItem) { if (array_key_exists('DATE_CREATE', $arOneItem)) unset($arOneItem['DATE_CREATE']); $arOneItem['ACTIVE'] = $strActive; $arOneItem['MODIFIED_BY'] = $arFields['MODIFIED_BY']; $arOneItem['~TIMESTAMP_X'] = $arFields['~TIMESTAMP_X']; if (array_key_exists('ID', $arOneItem)) { foreach ($arClear as &$strKey) { if (array_key_exists($strKey, $arOneItem)) unset($arOneItem[$strKey]); } unset($strKey); } else { $arOneItem['TYPE'] = $arCurrent['TYPE']; $arOneItem['SET_ID'] = $arCurrent['ID']; $arOneItem['OWNER_ID'] = $arCurrent['ITEM_ID']; $arOneItem['CREATED_BY'] = $arFields['MODIFIED_BY']; $arOneItem['~DATE_CREATE'] = $arFields['~TIMESTAMP_X']; } } unset($arOneItem); } protected static function clearFieldsForUpdate(&$arFields, $intSetType) { $intSetType = (int)$intSetType; $arClear = array( 'TYPE', 'SET_ID', 'ITEM_ID', 'OWNER_ID', 'CREATED_BY', 'MEASURE', 'DISCOUNT_PERCENT' ); if ($intSetType == self::TYPE_SET) $arClear[] = 'QUANTITY'; foreach ($arClear as &$strKey) { if (array_key_exists($strKey, $arFields)) unset($arFields[$strKey]); } unset($strKey); } protected static function getEmptyFields() { return array( 'TYPE' => 0, 'SET_ID' => 0, 'ACTIVE' => 'Y', 'OWNER_ID' => 0, 'ITEM_ID' => 0, 'QUANTITY' => false, 'MEASURE' => false, 'DISCOUNT_PERCENT' => false, 'SORT' => 100, 'XML_ID' => false, 'ITEMS' => array() ); } protected static function getEmptyItemFields() { return array( 'TYPE' => 0, 'SET_ID' => 0, 'ACTIVE' => 'Y', 'OWNER_ID' => 0, 'ITEM_ID' => 0, 'QUANTITY' => false, 'MEASURE' => false, 'DISCOUNT_PERCENT' => false, 'SORT' => 100, 'XML_ID' => false, ); } protected static function searchItem($intItemID, &$arItems) { $mxResult = false; foreach ($arItems as &$arOneItem) { if ($intItemID === $arOneItem['ITEM_ID']) { $mxResult = $arOneItem['ID']; break; } } unset($arOneItem); return $mxResult; } protected static function calculateSetParams($productID, $items) { return false; } protected static function fillSetItemsParams(&$items) { $productIterator = CCatalogProduct::GetList( array(), array('=ID' => array_keys($items)), false, false, array('ID', 'QUANTITY', 'QUANTITY_TRACE', 'CAN_BUY_ZERO', 'WEIGHT') ); while ($product = $productIterator->Fetch()) { $product['ID'] = (int)$product['ID']; if (isset($items[$product['ID']])) { $items[$product['ID']] = array_merge($items[$product['ID']], $product); } } } protected static function createSetItemsParamsFromAdd($items) { $result = array(); foreach ($items as &$oneItem) { $oneItem['ITEM_ID'] = (int)$oneItem['ITEM_ID']; $result[$oneItem['ITEM_ID']] = array( 'QUANTITY_IN_SET' => $oneItem['QUANTITY'] ); } unset($oneItem); return $result; } protected static function createSetItemsParamsFromUpdate($setID, $getProductID = false) { return array(); } protected static function isTracedItem($item) { return ( isset($item['QUANTITY_TRACE']) && $item['QUANTITY_TRACE'] === 'Y' && isset($item['CAN_BUY_ZERO']) && $item['CAN_BUY_ZERO'] === 'N' ); } protected static function checkProducts($type, array $productList) { $type = (int)$type; if ($type != self::TYPE_SET && $type != self::TYPE_GROUP) return false; if (empty($productList)) return false; Main\Type\Collection::normalizeArrayValuesByInt($productList); if (empty($productList)) return false; $allowTypes = array( Catalog\ProductTable::TYPE_PRODUCT => true, Catalog\ProductTable::TYPE_OFFER => true ); if ($type == self::TYPE_GROUP) $allowTypes[Catalog\ProductTable::TYPE_SET] = true; $productIterator = Catalog\ProductTable::getList(array( 'select' => array('ID', 'TYPE'), 'filter' => array('@ID' => $productList) )); $productList = array_fill_keys($productList, true); while ($product = $productIterator->fetch()) { $id = (int)$product['ID']; $productType = (int)$product['TYPE']; if (isset($allowTypes[$productType]) && isset($productList[$id])) unset($productList[$id]); unset($productType, $id); } unset($product, $productIterator); return (empty($productList)); } }