При программном добавлении нового товара в существующую корзину в Magento 2 цена товара составляет 0 - PullRequest
0 голосов
/ 07 ноября 2018

Моя цель:

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 / источник / продавец / Magento / модуль-multishipping / контроллер / 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, но мне не удалось заархивировать свою цель. Может быть, я что-то здесь упускаю, любое предложение будет оценено. Спасибо, что прочитали мою проблему.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Мне нужно установить multishiping = false, прежде чем добавлять продукт.

$quote->setIsMultiShipping(false);
$quote->addProduct($this->getShoppingBagProduct(), $quantity);
0 голосов
/ 07 ноября 2018

как я и обещал вам, я постараюсь помочь вам здесь ^^ Итак, во-первых, вы должны определенно рефакторинг, вы весь тело метода. Вы делаете много вещей более одного раза ^^

Я могу показать вам пример того, как это делается в пурпурном (не проверено ^^)

<?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);
    }
}

Вы можете реализовать мое собственное исправление для CartItemRepository, как я это делал в выпуске Github.

Greetz, Ульф

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...