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