• Модуль: catalog
  • Путь к файлу: ~/bitrix/modules/catalog/lib/product/catalogprovider.php
  • Класс: BitrixCatalogProductCatalogProvider
  • Вызов: CatalogProvider::getProductListStores
public function getProductListStores(array $products)
	{
		$result = new SaleResult();

		//without store control stores are used for information purposes only
		if (!CatalogConfigState::isUsedInventoryManagement())
		{
			return $result;
		}

		$storeIds = $this->getStoreIds();
		if (empty($storeIds))
		{
			return $result;
		}

		$resultList = [];
		$productGetIdList = [];
		foreach (array_keys($products) as $productId)
		{
/*				$cacheId = md5($productId);

			$storeProductDataList = static::getHitCache(self::CACHE_STORE_PRODUCT, $cacheId);
			if (!empty($storeProductDataList))
			{
				$resultList[$productId] = $storeProductDataList;
			}
			else
			{
				$productGetIdList[$productId] = $productId;
			} */
			// remove cache because need clear cache after modify stores
			if (
				isset($products[$productId]['PRODUCT']['USED_STORE_INVENTORY'])
				&& !$products[$productId]['PRODUCT']['USED_STORE_INVENTORY']
			) // product types without stores
			{
				continue;
			}
			$productGetIdList[$productId] = $productId;
		}

		if (!empty($productGetIdList))
		{
			$emptyProductStores = [];
			$iterator = CatalogStoreTable::getList([
				'select' => [
					'ID',
					'TITLE',
				],
				'filter' => [
					'@ID' => $storeIds,
				],
				'order' => [
					'ID' => 'ASC',
				],
			]);
			while ($row = $iterator->fetch())
			{
				$id = (int)$row['ID'];
				$emptyProductStores[$id] = [
					'ID' => 0,
					'PRODUCT_ID' => 0,
					'STORE_ID' => $row['ID'],
					'AMOUNT' => 0,
					'QUANTITY_RESERVED' => 0,
					'STORE_NAME' => $row['TITLE'],
				];
			}
			unset($row, $iterator);

			foreach (array_chunk($productGetIdList, 500) as $pageIds)
			{
				foreach ($pageIds as $productId)
				{
					$rows = $emptyProductStores;
					foreach (array_keys($rows) as $storeId)
					{
						$rows[$storeId]['PRODUCT_ID'] = $productId;
					}
					$resultList[$productId] = $rows;
					unset($rows);
				}
				unset($productId);
				$iterator = CatalogStoreProductTable::getList([
					'select' => [
						'ID',
						'PRODUCT_ID',
						'STORE_ID',
						'AMOUNT',
						'QUANTITY_RESERVED',
					],
					'filter' => [
						'=PRODUCT_ID' => $pageIds,
						'@STORE_ID' => $storeIds,
					],
					'order' => [
						'PRODUCT_ID' => 'ASC',
						'STORE_ID' => 'ASC',
					]
				]);
				while ($row = $iterator->fetch())
				{
					$row['ID'] = (int)$row['ID'];
					$row['PRODUCT_ID'] = (int)$row['PRODUCT_ID'];
					$row['STORE_ID'] = (int)$row['STORE_ID'];
					if (!isset($resultList[$row['PRODUCT_ID']]))
					{
						$resultList[$row['PRODUCT_ID']] = [];
					}
					$resultList[$row['PRODUCT_ID']][$row['STORE_ID']]['ID'] = $row['ID'];
					$resultList[$row['PRODUCT_ID']][$row['STORE_ID']]['AMOUNT'] = (float)$row['AMOUNT'];
					$resultList[$row['PRODUCT_ID']][$row['STORE_ID']]['QUANTITY_RESERVED'] = (float)$row['QUANTITY_RESERVED'];
				}
				unset($iterator, $row);
			}
			unset($pageIds);

/*				foreach ($productGetIdList as $productId)
			{
				if (!empty($resultList[$productId]))
				{
					$cacheId = md5($productId);
					static::setHitCache(self::CACHE_STORE_PRODUCT, $cacheId, $resultList[$productId]);
				}
			} */
		}

		if (!empty($resultList))
		{
			$result->setData([
				'PRODUCT_STORES_LIST' => $resultList,
			]);
		}

		return $result;
	}