Задача:
При изменении корзины (удаление/восстановление/изменение количества товара) отделить 1 позицию товара в корзине и вывести ее отдельной позицией визуально.
Если уже есть отдельная позиция не делить.
Например, в корзине:
ТоварN x 3 штуки
Поменять на:
ТоварN x 2 штуки
ТоварN x 1 штука
Попробовал сделать в событии OnSaleBasketSaved.
Отнимаю от общего количества товара единицу и добавляю дополнительную позицию.
Проблема в том, что при этом визуально видно, что количество пытается уменьшится, но потом возвращается обратно.
Как-будто добавляются сразу 2 штуки, 1 отдельная позиция товара и одна обратно к общему количеству.
И еще одна проблема как увидеть новую добавленную позицию в самой корзине (обновить корзину визуально)?
В логе событие отрабатывает дважды.
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleBasketSaved',
'OnSaleBasketSavedHandler'
);
function OnSaleBasketSavedHandler(Main\Event $event) {
...
$freeBasketRecordId = 0;
foreach($orderableItems as $item){
if( $item->getField('PRODUCT_ID') == $freeProductId && $item->getField('QUANTITY') == 1 ) {
$freeBasketRecordId = $item->getField('ID');
}
}
if(!$freeBasketRecordId)
foreach($orderableItems as $item){
if( $item->getField('PRODUCT_ID') == $freeProductId ) {
if( $item->getField('QUANTITY') > 1 ){ //значит сет и его надо делить
//отнять один
$item->setField('QUANTITY', $item->getQuantity() - 1);
$item->save();
//добавить новую запись с $freeProductId
$newBasketItem = $basket->createItem('catalog', $freeProductId);
$newBasketItem->setFields(array(
'QUANTITY' => 1,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => SITE_ID,
'PRODUCT_PROVIDER_CLASS' =>\Bitrix\Catalog\Product\Basket::getDefaultProviderName(),
));
$newBasketItem->save();
}
}
}
...
При изменении корзины (удаление/восстановление/изменение количества товара) отделить 1 позицию товара в корзине и вывести ее отдельной позицией визуально.
Если уже есть отдельная позиция не делить.
Например, в корзине:
ТоварN x 3 штуки
Поменять на:
ТоварN x 2 штуки
ТоварN x 1 штука
Попробовал сделать в событии OnSaleBasketSaved.
Отнимаю от общего количества товара единицу и добавляю дополнительную позицию.
Проблема в том, что при этом визуально видно, что количество пытается уменьшится, но потом возвращается обратно.
Как-будто добавляются сразу 2 штуки, 1 отдельная позиция товара и одна обратно к общему количеству.
И еще одна проблема как увидеть новую добавленную позицию в самой корзине (обновить корзину визуально)?
В логе событие отрабатывает дважды.
use Bitrix\Main;
Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleBasketSaved',
'OnSaleBasketSavedHandler'
);
function OnSaleBasketSavedHandler(Main\Event $event) {
...
$freeBasketRecordId = 0;
foreach($orderableItems as $item){
if( $item->getField('PRODUCT_ID') == $freeProductId && $item->getField('QUANTITY') == 1 ) {
$freeBasketRecordId = $item->getField('ID');
}
}
if(!$freeBasketRecordId)
foreach($orderableItems as $item){
if( $item->getField('PRODUCT_ID') == $freeProductId ) {
if( $item->getField('QUANTITY') > 1 ){ //значит сет и его надо делить
//отнять один
$item->setField('QUANTITY', $item->getQuantity() - 1);
$item->save();
//добавить новую запись с $freeProductId
$newBasketItem = $basket->createItem('catalog', $freeProductId);
$newBasketItem->setFields(array(
'QUANTITY' => 1,
'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
'LID' => SITE_ID,
'PRODUCT_PROVIDER_CLASS' =>\Bitrix\Catalog\Product\Basket::getDefaultProviderName(),
));
$newBasketItem->save();
}
}
}
...