Задача: в магазине 20 складов, на всех есть остатки но нужно ограничить покупку товара только остатками на двух складах, не меняя параметр "Доступное количество" и не включая складской учет.
Получить остаток товара на определенных складах API Битрикс
Для начала ограничим ввод количества товара в карточке товара. Для этого в result_modifier.php шаблона добавляем:
$arResult['HAS_QANTITY'] = 0;
$storeRes = CCatalogStoreProduct::GetList(
false,
array(
"PRODUCT_ID" => $arResult['ID'],
'STORE_ID' => array(
6,
13
)
),
false,
false,
array(
"AMOUNT"
)
);
while ($arStoreParam = $storeRes->Fetch()) {
$arResult['HAS_QANTITY'] += (int)$arStoreParam['AMOUNT'];
}
Создали ключ $arResult['HAS_QANTITY'] с нулевым значением и с помощью метода CCatalogStoreProduct::GetList получили количество товара на складах с ID 6 и 13 и суммировали его в $arResult['HAS_QANTITY']
В template.php, там где планируем выводить кнопки добавления в корзину или показа остатков используем этот ключ. Простой пример, подгоняйте под себя:
<?if ($arResult['HAS_QANTITY'] > 0) { ?>
<input type="number" max="<?=$arResult['HAS_QANTITY']?>">
<button>в корзину</button>
<? } else {?>
Нет в наличии
<?}?>
Изменить максимальное количество для покупки в корзине
Теперь, нужно сделать серверную проверку количества в корзине. Так чтобы не получилось что пользователь закинет товаров, в нее, больше чем разрешено.
В result_modifier.php корзины добавляем:
foreach ($arResult['BASKET_ITEM_RENDER_DATA'] as $item) {
$itemCanBye = 0;
$storeRes = CCatalogStoreProduct::GetList(
false,
array(
"PRODUCT_ID" => $item['PRODUCT_ID'],
'STORE_ID' => array(6, 13)
),
false, false,
array("AMOUNT")
);
while ($arStoreParam = $storeRes->Fetch()) {
$itemCanBye += $arStoreParam['AMOUNT'];
}
if ($item['QUANTITY'] > $itemCanBye) {
$arFields = array(
"QUANTITY" => $itemCanBye,
);
$ID = CSaleBasket::Update(
$item['ID'],
$arFields
);
}
}
Тем же методом CCatalogStoreProduct::GetList получаем остатки каждого товара, находящегося в корзине, на определенных складах.
Если в корзине оказалось товаров больше чем доступно на разрешенных складах- методом CSaleBasket::Update обновляем количество на максимально разрешенное, при загрузке страницы с корзиной.
Меняем AVAILABLE_QUANTITY в корзине
В корзине все еще можно увеличивать количество товара сверх "лимита" доступных складов. Для этого нужно перебить параметр AVAILABLE_QUANTITY каждого товара- который отвечает за максимально возможное количество.
В mutator.php шаблона корзины, в обходе цикла каждого товара, добавляем (обязательно до формирования массива $rowData):
$row['AVAILABLE_QUANTITY'] = 0;
$storeRes = CCatalogStoreProduct::GetList(
array(
"SORT" => "ASC"
),
array(
"PRODUCT_ID" => $row['PRODUCT_ID'],
'STORE_ID' => array(
6,
13
)
),
false,
false,
array(
"AMOUNT"
)
);
while ($arStoreParam = $storeRes->Fetch()) {
$row['AVAILABLE_QUANTITY'] += (int)$arStoreParam['AMOUNT'];
}
Теперь не получится увеличить количество каждого товара больше чем есть на остатках складов 6 и 12.