- Модуль: catalog
- Путь к файлу: ~/bitrix/modules/catalog/lib/product/sku.php
- Класс: BitrixCatalogProductSku
- Вызов: Sku::updateAvailable
static function updateAvailable($productId, $iblockId = 0, array $productFields = array())
{
if (!self::allowedUpdateAvailable())
return true;
static::disableUpdateAvailable();
$result = true;
$process = true;
$iblockData = false;
$fields = array();
$parentId = 0;
$parentIblockId = 0;
$productId = (int)$productId;
if ($productId <= 0)
{
$process = false;
$result = false;
}
if ($process)
{
$iblockId = (int)$iblockId;
if ($iblockId <= 0)
$iblockId = (int)CIBlockElement::GetIBlockByID($productId);
if ($iblockId <= 0)
{
$process = false;
$result = false;
}
}
if ($process)
{
$iblockData = CCatalogSku::GetInfoByIBlock($iblockId);
if (empty($iblockData))
{
$process = false;
$result = false;
}
}
if ($process)
{
switch ($iblockData['CATALOG_TYPE'])
{
case CCatalogSku::TYPE_PRODUCT:
$fields = (self::isSeparateSkuMode()
? static::getParentDataAsProduct($productId, $productFields)
: static::getParentProductFieldsByState(static::getOfferState($productId, $iblockId))
);
break;
case CCatalogSku::TYPE_FULL:
$offerState = static::getOfferState($productId, $iblockId);
if ($offerState !== self::OFFERS_ERROR)
{
switch ($offerState)
{
case self::OFFERS_AVAILABLE:
case self::OFFERS_NOT_AVAILABLE:
$fields = (self::isSeparateSkuMode()
? static::getParentDataAsProduct($productId, $productFields)
: static::getParentProductFieldsByState($offerState)
);
break;
case self::OFFERS_NOT_EXIST:
$product = CatalogModelProduct::getCacheItem($productId, true);
if (!empty($product))
{
switch ($product['TYPE'])
{
case CatalogProductTable::TYPE_SKU:
$fields = static::getDefaultParentSettings($offerState, false);
break;
case CatalogProductTable::TYPE_EMPTY_SKU:
$fields = static::getParentProductFieldsByState($offerState);
break;
case CatalogProductTable::TYPE_PRODUCT:
case CatalogProductTable::TYPE_SET:
$fields['AVAILABLE'] = CatalogProductTable::calculateAvailable($product);
break;
default:
break;
}
}
unset($product);
break;
}
}
break;
case CCatalogSku::TYPE_OFFERS:
$parent = CCatalogSku::getProductList($productId, $iblockId);
if (!isset($parent[$productId]))
{
$fields = [
'TYPE' => CatalogProductTable::TYPE_FREE_OFFER,
];
}
else
{
$fields = [
'TYPE' => CatalogProductTable::TYPE_OFFER,
];
$parentId = $parent[$productId]['ID'];
$parentIblockId = $parent[$productId]['IBLOCK_ID'];
}
$fields = array_merge(
self::getProductAvailable($productId, $productFields),
$fields
);
break;
case CCatalogSku::TYPE_CATALOG:
$fields = self::getProductAvailable($productId, $productFields);
break;
}
}
if (
$process
&& !empty($fields)
)
{
$updateResult = CatalogProductTable::update($productId, $fields);
if (!$updateResult->isSuccess())
{
$process = false;
$result = false;
}
unset($updateResult);
}
if (
$process
&& $parentId > 0
&& $parentIblockId > 0
)
{
$result = self::updateParentAvailable($parentId, $parentIblockId);
if (!$result)
$process = false;
}
unset($parentIblockId, $parentId, $fields, $iblockData);
unset($process);
static::enableUpdateAvailable();
return $result;
}