Я пытался изменить цену своих продуктов следующим образом:
controller.php:
[РЕДАКТИРОВАТЬ]
<?php
namespace MassiveArt\ShoppingCart\Controller\Index;
use Magento\Catalog\Model\ProductFactory;
use Magento\Checkout\Model\Cart;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Controller\Result\JsonFactory;
use Magento\Framework\Data\Form\FormKey;
class Index extends Action
{
/**
* @var FormKey
*/
protected $formKey;
/**
* @var Session
*/
protected $checkoutSession;
/**
* @var Cart
*/
protected $cart;
/**
* @var ProductFactory
*/
protected $productFactory;
/**
* Constructor.
*
* @param Context $context
* @param \Magento\Checkout\Model\Session $checkoutSession
* @param \Magento\Customer\Model\Session $customerSession
* @param JsonFactory $resultJsonFactory
* @param FormKey $formKey
* @param Cart $cart
* @param ProductFactory $productFactory
*/
public function __construct(
Context $context,
\Magento\Checkout\Model\Session $checkoutSession,
\Magento\Customer\Model\Session $customerSession,
JsonFactory $resultJsonFactory,
FormKey $formKey,
Cart $cart,
ProductFactory $productFactory
) {
$this->checkoutSession = $checkoutSession;
$this->customerSession = $customerSession;
$this->formKey = $formKey;
$this->resultJsonFactory = $resultJsonFactory;
$this->cart = $cart;
$this->productFactory = $productFactory;
parent::__construct($context);
}
public function execute()
{
try {
// Set result data and pass back
$result = $this->resultJsonFactory->create();
$allItems = $this->checkoutSession->getQuote()->getAllVisibleItems();
foreach ($allItems as $item) {
$item = ( $item->getParentItem() ? $item->getParentItem() : $item );
$price = 100; //set your price here
$item->setCustomPrice($price);
$item->setOriginalCustomPrice($price);
$item->setSubtotal($price);
$item->getProduct()->setIsSuperMode(true);
}
$this->checkoutSession->setTotalsCollectedFlag(false);
$this->checkoutSession->getQuote()->save();
$this->checkoutSession->getQuote()->setTotalsCollectedFlag(false);
$this->setTotalsCollectedFlag(false);
$result->setData(['message' => __("Products added succesfully")]);
return $result;
} catch (\Exception $e) {
$result->setData(['error' => __($e->getMessage())]);
return $result;
}
}
}
(РЕДАКТИРОВАТЬ) С новым кодом цена меняется, но промежуточный итог нет! Как вы можете видеть здесь:
Заранее спасибо!
quote
изcheckoutSession
. Я немного смущен.Ответы:
Я понял, я думаю, что вы на правильном пути, но я думаю, что вы должны сохранить цитату. Если вы посмотрите на этот класс:
\Magento\Checkout\Controller\Cart\Add
вы можете увидеть в строке 114:Я изменяю цену с события, которое вызывается в конце
addProduct()
метода, а Magento сохраняет корзину в конце. Так что в вашем случае вы должны сохранить цитату в вашем контроллере.источник
Я сделал фрагмент, который позволяет изменить цену. На самом деле, это меняет цену после добавления товара в корзину. Другими словами, это меняет цены ваших товаров в вашей цитате. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a
Надеюсь, поможет.
источник
Вы хотите обновить общее количество строк, а не промежуточный итог, используйте метод
$item->setRowTotal()
или$item->setBaseRowTotal()
. Кроме того, это может помочь добавить$item->save()
до конца цикла.Промежуточный итог - промежуточный итог заказа / корзины.
источник
@ felix, нужно выставить
setSubtotal()
цитату. Установите Промежуточный итог за пределами for loop
.нравится
Примечание: код протестирован
источник
В качестве цены корзины Upadate вы должны использовать модель корзины вместо сеанса оформления заказа. Загрузите товар из корзины и обновите его.
источник
Попробуйте код ниже:
вам нужно изменить
process()
функцию по вашему требованию.ПРИМЕЧАНИЕ. Не изменяйте файлы ядра magento. Создать плагин для этого.
Надеюсь, это поможет...!!!
источник