Добавить товары в корзину программно по индивидуальной цене: Magento 2

У меня есть модуль, который создает цитаты с помощью модуля цитаты Magento.

Теперь я хочу перейти к оформлению заказа, которое должно добавить элементы цитаты в корзину, и страница оформления заказа должна отображаться пользователю с теми элементами, которые были в цитате.

Здесь я создаю цитаты как:

$quote = $this->quoteFactory->create()->load($quoteId);

Кавычки создаются нормально, и я получаю элементы в цитате как:

$items = $quote->getAllItems();

Я добавляю продукты в корзину, как показано ниже,

$items = $quote->getAllItems();

foreach ($items as $item) {
    $formatedPrice = $item->getPrice();
    $quantity = $item['qty'];
    $productId = $item->getProductId();

    $params = array(
          'form_key' => $this->formKey->getFormKey(),
          'product' => $productId, //product Id
          'qty' => $quantity, //quantity of product
          'price' => $formatedPrice //product price
    );

    $_product = $this->_productRepository->getById($productId);

    if ($_product) {
        $this->cart->addProduct($_product, $params);
    }
}
try {
    $this->cart->save();
    $this->messageManager->addSuccess(__('Added to cart successfully.'));
} catch (\Magento\Framework\Exception\LocalizedException $e) {
    $this->messageManager->addException($e, __('%1', $e->getMessage()));
}

Проблема здесь заключается в том, что товары добавляются в корзину, но в случае, если есть товары с индивидуальной ценой, мне нужно добавить эти товары в корзину по цене, отличной от той, которая настроена для продукта в каталоге.

Эта пользовательская цена определяется в

$formatedPrice = $item->getPrice();

Кроме того, у меня возникает проблема, когда всякий раз, когда я создаю новую цитату и добавляю предыдущую цитату в корзину, она отображает элементы для последней созданной цитаты. Как это может произойти, если здесь указан верный идентификатор котировки.

На самом деле я хочу сделать что-то подобное в Magento 2: программно добавить товар в корзину с изменением цены

Пожалуйста, кто-нибудь может помочь в этом разобраться?

1 ответ

Это работало для меня в Magento 2.2.8:

В контроллере:

        $price = rand(0,1000);

        $this->product->setData('custom_overwrite_price', $price);

        $params = [
            'form_key' => $this->formKey->getFormKey(),
            'qty' => 1,
            'options' => ...
        ];

        $this->cart->addProduct($this->product, $params);
        $this->cart->save();

В checkout_cart_product_add_after

public function execute(\Magento\Framework\Event\Observer $observer) {
    $item = $observer->getEvent()->getData('quote_item');
    $item = ( $item->getParentItem() ? $item->getParentItem() : $item );

    $price = $item->getProduct()->getData(AddController::PRODUCT_OVERWRITE_PRICE);

    $item->setCustomPrice($price);
    $item->setOriginalCustomPrice($price);
    $item->getProduct()->setIsSuperMode(true);
}

Рабочее решение и действительно легко, если вы думаете об этом:

$params = array(
  'form_key' => $this->_formKey->getFormKey(),
  'product' => $productId,
  'qty'   => $qty
);

$product = $this->_product->load($productId); 
$product->setPrice($customPrice); // without save this does the trick
$this->cart->addProduct($product, $params);
$this->cart->save();

Недостающие части не стесняйтесь заполнить их.

Другие вопросы по тегам