Files
2026-09-15 10:26:34 +08:00

181 lines
6.5 KiB
PHP

<?php
namespace Stemcell\Checkout\Model;
use Magento\Catalog\Model\Product;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\DataObject;
use Magento\Framework\Exception\LocalizedException;
use Psr\Log\LoggerInterface;
class Cart extends \Magento\Checkout\Model\Cart
{
/**
* Update cart items information
*
* @param array $data
* @return $this
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
*/
public function updateItems($data)
{
$infoDataObject = new \Magento\Framework\DataObject($data);
$this->_eventManager->dispatch(
'checkout_cart_update_items_before',
['cart' => $this, 'info' => $infoDataObject]
);
$qtyRecalculatedFlag = false;
foreach ($data as $itemId => $itemInfo) {
$item = $this->getQuote()->getItemById($itemId);
if (!$item) {
continue;
}
if (!empty($itemInfo['remove']) || isset($itemInfo['qty']) && $itemInfo['qty'] == '0') {
$this->removeItem($itemId);
continue;
}
$qty = isset($itemInfo['qty']) ? (double)$itemInfo['qty'] : false;
if ($qty > 0) {
$item->clearMessage();
$item->setHasError(false);
$item->setQty($qty);
if ($item->getHasError()) {
throw new \Magento\Framework\Exception\LocalizedException(__($item->getMessage()));
}
if (isset($itemInfo['before_suggest_qty']) && $itemInfo['before_suggest_qty'] != $qty) {
$qtyRecalculatedFlag = true;
$this->messageManager->addNoticeMessage(
__('Quantity was recalculated from %1 to %2', $itemInfo['before_suggest_qty'], $qty),
'quote_item' . $item->getId()
);
}
}
if (isset($itemInfo['extension_attributes']) && is_array($itemInfo['extension_attributes'])) {
foreach ($itemInfo['extension_attributes'] as $attribute => $val) {
if ($val!='' || $val!=null) {
$item->setData($attribute, $val);
}
}
}
if (!empty($itemInfo['discount_percent'])) {
$item->setDiscountAmount($item->getRowTotal()*$itemInfo['discount_percent']);
$item->setDiscountPercent($itemInfo['discount_percent']);
}
// $item->setRowTotal($item->getRowTotal());
// $item->setDiscountPercent($itemInfo['discount_percent']);
}
isset($data['salesperson_id']) && $this->getQuote()->setData('salesperson_id', $data['salesperson_id']);
isset($data['customer_note']) && $this->getQuote()->setCustomerNote($data['customer_note']);
if ($qtyRecalculatedFlag) {
$this->messageManager->addNoticeMessage(
__('We adjusted product quantities to fit the required increments.')
);
}
$this->_eventManager->dispatch(
'checkout_cart_update_items_after',
['cart' => $this, 'info' => $infoDataObject]
);
return $this;
}
/**
* Get request quantity
*
* @param Product $product
* @param \Magento\Framework\DataObject|int|array $request
* @return int|DataObject
* @throws LocalizedException
*/
protected function getQtyRequest($product, $request = 0)
{
$request = $this->_getProductRequest($request);
$stockItem = $this->stockRegistry->getStockItem($product->getId(), $product->getStore()->getWebsiteId());
$minimumQty = $stockItem->getMinSaleQty();
//If product quantity is not specified in request and there is set minimal qty for it
if ($minimumQty
&& $minimumQty > 0
&& !$request->getQty()
) {
$request->setQty($minimumQty);
}
return $request;
}
/**
* Add product to shopping cart (quote)
*
* @param int|Product $productInfo
* @param \Magento\Framework\DataObject|int|array $requestInfo
* @return $this
* @throws \Magento\Framework\Exception\LocalizedException
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
*/
public function addProduct($productInfo, $requestInfo = null)
{
$product = $this->_getProduct($productInfo);
$productId = $product->getId();
if ($productId) {
$request = $this->getQtyRequest($product, $requestInfo);
try {
$this->_eventManager->dispatch(
'checkout_cart_product_add_before',
['info' => $requestInfo, 'product' => $product]
);
$result = $this->getQuote()->addProduct($product, $request);
} catch (\Magento\Framework\Exception\LocalizedException $e) {
$this->_checkoutSession->setUseNotice(false);
$result = $e->getMessage();
}
/**
* String we can get if prepare process has error
*/
if (is_string($result)) {
if ($product->hasOptionsValidationFail()) {
$redirectUrl = $product->getUrlModel()->getUrl(
$product,
['_query' => ['startcustomization' => 1]]
);
} else {
$redirectUrl = $product->getProductUrl();
}
$this->_checkoutSession->setRedirectUrl($redirectUrl);
if ($this->_checkoutSession->getUseNotice() === null) {
$this->_checkoutSession->setUseNotice(true);
}
throw new \Magento\Framework\Exception\LocalizedException(__($result));
}
} else {
throw new \Magento\Framework\Exception\LocalizedException(__('The product does not exist.'));
}
$this->_eventManager->dispatch(
'checkout_cart_product_add_after',
['quote_item' => $result, 'product' => $product]
);
$this->_checkoutSession->setLastAddedProductId($productId);
return $this;
}
public function truncate()
{
$this->getQuote()->removeAllItems();
$this->getQuote()->setCustomerNote(null)->setData('salesperson_id', 0);
return $this;
}
}