• Модуль: 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;
}