/
bitrix-dev
/
Starter-kit
Обзор
Документация
Войти
/
bitrix-dev
/
Starter-kit
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
main
local/php_interface/classes/mwi/Basket.php
322 строки
11 KB
Alexey Karizhenskiy
Первая сборка (из ранее используемого)
19 янв 2026, 21:00
19 янв 2026, 21:00
d843e36
Код
Авторство
О чём код?
<?php namespace MWI; class Basket { protected static $_instance; protected static $arProductIds; private function __construct() { } public static function getInstance() { if (self::$_instance === null) { self::$_instance = new self; } return self::$_instance; } public static function getProductIds(bool $isCache = true): array { $self = self::getInstance(); if (!is_array($self->arProductIds) || !$isCache) { $self->arProductIds = []; if (\Bitrix\Main\Loader::includeModule("sale")) { $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite()); foreach ($basket as $basketItem) { $self->arProductIds[] = $basketItem->getField('PRODUCT_ID'); } } } return $self->arProductIds; } public static function getQuantityList(): array { $arQuantityList = []; if (\Bitrix\Main\Loader::includeModule("sale")) { $basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite()); $arQuantityList = $basket->getQuantityList(); } return $arQuantityList; } public static function getCount(): int { return count(self::getQuantityList()); } /** * Изменяет количество товара в корзине * @param int $productId ID товара * @param float $quantity Новое количество * @param int|null $basketItemId ID товара в корзине * @return bool */ public static function setQuantity(int $productId, float $quantity, ?int $basketItemId = null): bool { if (!\Bitrix\Main\Loader::includeModule("sale")) { return false; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); if ($basketItemId !== null) { $item = $basket->getItemById($basketItemId); } else { $item = $basket->getExistsItem('catalog', $productId); } if ($item) { $item->setField('QUANTITY', $quantity); $basket->save(); return true; } return false; } /** * Увеличивает количество товара в корзине на единицу измерения * @param int $productId ID товара * @param int|null $basketItemId ID товара в корзине * @return bool */ public static function increaseQuantity(int $productId, ?int $basketItemId = null): bool { if (!\Bitrix\Main\Loader::includeModule("sale") || !\Bitrix\Main\Loader::includeModule("catalog")) { return false; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); if ($basketItemId !== null) { $item = $basket->getItemById($basketItemId); } else { $item = $basket->getExistsItem('catalog', $productId); } if ($item) { $product = \Bitrix\Catalog\ProductTable::getList([ 'select' => ['MEASURE'], 'filter' => ['=ID' => $productId] ])->fetch(); $measure = $product['MEASURE'] ?? 1; $item->setField('QUANTITY', $item->getQuantity() + $measure); $item->save(); //$basket->save(); return true; } return false; } /** * Уменьшает количество товара в корзине на единицу измерения * @param int $productId ID товара * @param int|null $basketItemId ID товара в корзине * @return bool */ public static function decreaseQuantity(int $productId, ?int $basketItemId = null): bool { if (!\Bitrix\Main\Loader::includeModule("sale") || !\Bitrix\Main\Loader::includeModule("catalog")) { return false; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); if ($basketItemId !== null) { $item = $basket->getItemById($basketItemId); } else { $item = $basket->getExistsItem('catalog', $productId); } if ($item) { $product = \Bitrix\Catalog\ProductTable::getList([ 'select' => ['MEASURE'], 'filter' => ['=ID' => $productId] ])->fetch(); $measure = $product['MEASURE'] ?? 1; $quantity = $item->getQuantity(); if ($quantity > $measure) { $item->setField('QUANTITY', $quantity - $measure); $item->save(); //$basket->save(); return true; } } return false; } /** * Удаляет товар из корзины * @param int $productId ID товара * @param int|null $basketItemId ID товара в корзине * @return bool */ public static function remove(int $productId, ?int $basketItemId = null): bool { if (!\Bitrix\Main\Loader::includeModule("sale") || !\Bitrix\Main\Loader::includeModule("catalog")) { return false; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); if ($basketItemId !== null) { $item = $basket->getItemById($basketItemId); } else { $item = $basket->getExistsItem('catalog', $productId); } if ($item) { $item->delete(); $result = $basket->save(); return $result->isSuccess(); } return false; } /** * Очищает корзину * @return bool */ public static function clear(): bool { if (!\Bitrix\Main\Loader::includeModule("sale")) { return false; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); foreach ($basket as $item) { $item->delete(); } $result = $basket->save(); return $result->isSuccess(); } /** * Добавляет товар в корзину * @param int $productId ID товара * @param float $quantity Количество * @param array $props Свойства товара * @return bool */ public static function add(int $productId, float $quantity = 1, array $props = []): array { $successfulAdd = false; $errorMsg = ''; if (!\Bitrix\Main\Loader::includeModule("sale")) { return [$successfulAdd, 'Модуль sale не найден']; } $basket = \Bitrix\Sale\Basket::loadItemsForFUser( \Bitrix\Sale\Fuser::getId(), \Bitrix\Main\Context::getCurrent()->getSite() ); // Проверяем существующие товары в корзине $found = false; foreach ($basket as $basketItem) { if ($basketItem->getProductId() == $productId) { // Сравниваем свойства $currentProps = $basketItem->getPropertyCollection()->getPropertyValues(); $propsMatch = true; foreach ($props as $prop) { $code = $prop['CODE']; if (!isset($currentProps[$code]) || $currentProps[$code]['VALUE'] !== $prop['VALUE']) { $propsMatch = false; break; } } if ($propsMatch) { // Если товар с такими же свойствами найден - увеличиваем количество $basketItem->setField('QUANTITY', $basketItem->getQuantity() + $quantity); $basketResult = $basket->save(); if ($basketResult->isSuccess()) { $successfulAdd = true; } else { $errorMsg = implode('; ', $basketResult->getErrorMessages()); $successfulAdd = false; } $found = true; break; } } } if (!$found) { if (!empty($props)) { // Проверяем и обновляем названия свойств, если NAME равен CODE foreach ($props as &$prop) { if ($prop['NAME'] === $prop['CODE']) { // Получаем ID инфоблока товара $element = \CIBlockElement::GetByID($productId)->Fetch(); if ($element) { $propertyIterator = \CIBlockProperty::GetList( [], [ 'CODE' => $prop['CODE'], 'IBLOCK_ID' => $element['IBLOCK_ID'] ] ); if ($property = $propertyIterator->Fetch()) { $prop['NAME'] = $property['NAME']; } } } } unset($prop); } // Добавляем новый товар через фабричный метод $basketResult = \Bitrix\Catalog\Product\Basket::addProduct([ 'PRODUCT_ID' => $productId, 'QUANTITY' => $quantity, 'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(), 'LID' => \Bitrix\Main\Context::getCurrent()->getSite(), 'PROPS' => $props ]); if ($basketResult->isSuccess()) { $successfulAdd = true; } else { $errorMsg = implode('; ', $basketResult->getErrorMessages()); $successfulAdd = false; } } return array($successfulAdd, $errorMsg); } }