• Модуль: sale
  • Путь к файлу: ~/bitrix/modules/sale/lib/helpers/admin/blocks/orderbasket.php
  • Класс: BitrixSaleHelpersAdminBlocksOrderBasket
  • Вызов: OrderBasket::getOffersSkuParamsMode
static function getOffersSkuParamsMode(array $productsParams, array $visibleColumns = array(), $mode = 0)
{
	if(!empty($productsParams["ITEMS"]) && is_array($productsParams["ITEMS"]))
	{
		if (self::$catalogIncluded === null)
			self::$catalogIncluded = MainLoader::includeModule('catalog');
		if (!self::$catalogIncluded)
			return $productsParams;

		$iblockPropsUsed = array();
		$productIds = array();
		$existOffers = array();
		$skuFilter = array('ID' => array());
		$propFilter = array('ID' => array());
		$ibs = array();

		foreach($productsParams["ITEMS"] as $params)
		{
			if($params['MODULE'] != 'catalog')
				continue;

			$productIds[] = $params['PRODUCT_ID'];

			if ($mode == self::VIEW_MODE)
			{
				if ((int)$params['OFFER_ID'] > 0)
				{
					$skuFilter['ID'][] = $params['OFFER_ID'];
				}
			}

			if (!isset($ibs[$params["IBLOCK_ID"]]))
			{
				$props = static::getSkuProps(true, $params["IBLOCK_ID"]);
				if (!empty($props))
				{
					foreach($props as $prop)
					{
						$propFilter['ID'][] = $prop['ID'];
					}
				}

				$ibs[$params["IBLOCK_ID"]] = true;
			}

			if($params["PRODUCT_ID"] != $params["OFFER_ID"])
				$existOffers[] = $params["OFFER_ID"];
		}

		$skuFilter['ID'] = array_unique($skuFilter['ID']);
		$productIds = array_unique($productIds);
		$propFilter['ID'] = array_unique($propFilter['ID']);

		$allOffers = CCatalogSKU::getOffersList(
			$productIds,
			0,
			$skuFilter,
			array('NAME',  "ACTIVE", 'CATALOG_QUANTITY'),
			$propFilter
		);

		$tmpPropsOff = array();

		if(!empty($allOffers))
			$tmpPropsOff = static::getPropsFromOffers2($allOffers, $existOffers);

		unset($skuFilter, $propFilter, $existOffers, $productIds);

		foreach($productsParams["ITEMS"] as &$params)
		{
			if($params['MODULE'] != 'catalog')
				continue;

			if (!isset(self::$productsOffersSkuParams[$params["PRODUCT_ID"]]))
			{
				if(isset($tmpPropsOff[$params["PRODUCT_ID"]]))
				{
					self::$productsOffersSkuParams[$params["PRODUCT_ID"]] = $tmpPropsOff[$params["PRODUCT_ID"]];

					foreach($tmpPropsOff[$params["PRODUCT_ID"]] as $offerId => $propsList)
					{
						foreach($propsList as $propId => $propValue)
						{
							if(!isset($iblockPropsUsed[$propId]))
								$iblockPropsUsed[$propId] = array();

							if(is_array($propValue))
							{
								$iblockPropsUsed[$propId] = array_merge(
									$iblockPropsUsed[$propId],
									array_diff(
										$propValue,
										$iblockPropsUsed[$propId]
									)
								);
							}
							else
							{
								if(!in_array($propValue, $iblockPropsUsed[$propId]))
									$iblockPropsUsed[$propId][] = $propValue;
							}
						}
					}
				}
			}
		}

		unset($allOffers, $tmpPropsOff);
		$possibleSkuParams = array();

		foreach($productsParams["ITEMS"] as &$params)
		{
			if($params['MODULE'] != 'catalog')
				continue;

			$possibleSku = array();

			if(intval($params["OFFERS_IBLOCK_ID"]) > 0 && !isset(self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]]))
			{
				self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]] = static::getPropsParams(
					$params["OFFERS_IBLOCK_ID"],
					array(),
					$iblockPropsUsed
				);
			}

			if (!empty(self::$productsOffersSkuParams[$params["PRODUCT_ID"]][$params["OFFER_ID"]]))
			{
				$params["SKU_PROPS"] = self::$productsOffersSkuParams[$params["PRODUCT_ID"]][$params["OFFER_ID"]];
			}

			if (
				isset($params["SKU_PROPS"])
				&& is_array($params["SKU_PROPS"])
			)
			{
				foreach ($params["SKU_PROPS"] as $id => $skuProps)
				{
					if(is_array($skuProps))
					{
						unset($params["SKU_PROPS"][$id]);
						continue;
					}

					$params["SKU_PROPS"][$id] = array(
						'ID' => $skuProps,
						'NAME' => self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]][$id]['NAME'],
						'VALUE' => self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]][$id]['VALUES'][$skuProps],
						'CODE' => self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]][$id]['CODE'],
						'SORT' => self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]][$id]['SORT']
					);

					$possibleSku[$id] = self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]][$id]['VALUES'][$skuProps]['ID'];
				}
			}

			if($mode == self::EDIT_MODE && $params['PRODUCT_ID'] != $params['OFFER_ID'])
			{
				if(is_array(self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]]))
					$skuOrder = array_keys(self::$iblockPropsParams[$params["OFFERS_IBLOCK_ID"]]);
				else
					$skuOrder = array_keys($possibleSku);

				$possibleSkuParams[$params['OFFER_ID']] = array(
					'PRODUCT_ID' => $params['PRODUCT_ID'],
					'OFFER_ID' => $params['OFFER_ID'],
					'SKU_PROPS' => $possibleSku,
					'SKU_ORDER' => $skuOrder
				);
			}
		}

		unset($params, $iblockPropsUsed);

		if($mode == self::EDIT_MODE && !empty($possibleSkuParams))
		{
			$possibleSkuProps = SaleHelpersAdminSkuProps::getPossibleSkuPropsValues($possibleSkuParams);

			if(!empty($possibleSkuProps))
			{
				foreach($productsParams["ITEMS"] as $key => $params)
				{
					if($params['MODULE'] != 'catalog')
						continue;

					$productsParams["ITEMS"][$key]["SKU_PROPS_POSSIBLE_VALUES"] = $possibleSkuProps[$params['OFFER_ID']] ?? [];
				}

				unset($possibleSkuParams);
			}
		}

		$productsParams["IBLOCKS_SKU_PARAMS"] = self::$iblockPropsParams;

		foreach(self::$iblockPropsParams as $iBlockId => $props)
			self::$iblockPropsParamsOrder[$iBlockId] = array_keys($props);
	}

	$productsParams["IBLOCKS_SKU_PARAMS_ORDER"] = self::$iblockPropsParamsOrder;
	return $productsParams;
}