我的目标:
Magento 2.2.5
如果客户选中[添加购物袋]选项,然后单击[继续购买],我会将[购物袋]产品添加到购物车并重定向到确认页面。
源代码:
public function addShoppingBag()
{
$shoppingBagSku = $this->helper->getShoppingBagSku();
$shoppingBagId = $this->productRepository->get($shoppingBagSku)->getId();
$shoppingBagProduct = $this->productFactory->create()->load($shoppingBagId);
$quote = $this->checkoutSession->getQuote();
$params = array(
'product' => $shoppingBagProduct->getId(),
'qty' => 1,
'price' => intval($shoppingBagProduct->getPrice())
);
$request = new \Magento\Framework\DataObject();
$request->setData($params);
$quote->addProduct($shoppingBagProduct, $request);
$quote->getShippingAddress()->setCollectShippingRates(true);
$this->quoteRepository->save($quote);
$quote->collectTotals();
}
问题:
我检查了 quote_item 表,添加了产品,但与价格相关的所有属性均为0。 quote_address_item 表很好,所有价格都是正确的。问题只在于quote_item。
我尝试过的事情
$this->cart->addProduct($shoppingBagProduct, $request);
$this->cart->save();
$this->cart->getQuote()->setTotalsCollectedFlag(false)->collectTotals()->save();
quote_item价格将被更新,但是由于以下代码,它将再次重定向到购物车页面:
/magento2/source/vendor/magento/module-multishipping/Controller/Checkout.php
if ($this->_getCheckoutSession()->getCartWasUpdated(true)
&&
!in_array($action, ['index', 'login', 'register', 'addresses', 'success'])
) {
$this->getResponse()->setRedirect($this->_getHelper()->getCartUrl());
$this->_actionFlag->set('', self::FLAG_NO_DISPATCH, true);
return parent::dispatch($request);
}
当我尝试:
setCartWasUpdated(false)
它会根据需要重定向到“确认”页面,但是quote_item价格仍然为0。
系统>配置>销售>结帐>将产品重定向添加到购物车后设置为否
问题:
我在Google中搜索了很多相同的问题,但是没有运气来存档我的目标。 可能是我在这里缺少什么,任何建议将不胜感激。 谢谢您阅读我的问题。
答案 0 :(得分:0)
添加产品之前,我需要设置multishiping = false。
$quote->setIsMultiShipping(false);
$quote->addProduct($this->getShoppingBagProduct(), $quantity);
答案 1 :(得分:-1)
正如我向您保证的那样,我会尽力为您提供帮助^^ 因此,首先,您应该明确地重构整个方法主体。您要做的事情不止一次^^
我可以在这里向您展示以magento方式进行操作的示例(未经测试的^^)
<?php
class MyCustomAdd
{
/**
* @var \Magento\Quote\Api\Data\CartItemInterfaceFactory
*/
protected $cartItemInterfaceFactory;
/**
* @var \Magento\Quote\Api\CartItemRepositoryInterface
*/
protected $cartItemRepository;
/**
* I assume, that this is this class!
* @var \Magento\Checkout\Model\Cart
*/
protected $cart;
public function __construct(
\Magento\Quote\Api\Data\CartItemInterfaceFactory $cartItemInterfaceFactory,
\Magento\Quote\Api\CartItemRepositoryInterface $cartItemRepository
) {
$this->cartItemInterfaceFactory = $cartItemInterfaceFactory;
$this->cartItemRepository = $cartItemRepository;
}
/**
* @throws \Magento\Framework\Exception\NoSuchEntityException The specified cart does not exist.
* @throws \Magento\Framework\Exception\CouldNotSaveException The specified item could not be saved to the cart.
* @throws \Magento\Framework\Exception\InputException The specified item or cart is not valid.
*/
public function addShoppingBagToCart()
{
$shippingBagSku = "coole_product_sku";
$quoteId = $this->cart->getQuote()->getId();
$cartItem = $this->cartItemInterfaceFactory->create(['data' => [
\Magento\Quote\Api\Data\CartItemInterface::KEY_SKU => $shippingBagSku,
\Magento\Quote\Api\Data\CartItemInterface::KEY_QTY => 1,
\Magento\Quote\Api\Data\CartItemInterface::KEY_QUOTE_ID => $quoteId
]]);
$this->cartItemRepository->save($cartItem);
}
}
您可以像在Github Issue中那样为CartItemRepository实施我的自定义修复程序。
Greetz, 乌尔夫