Tentei alterar o preço dos meus produtos assim:
Controller.php:
[EDITAR]
<?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;
}
}
}
(EDIT) Com o novo código, o preço muda, mas o subtotal não! Como você pode ver aqui:
Desde já, obrigado!
quote
decheckoutSession
. Eu estou um pouco confuso.Respostas:
Entendi, acho que você está no caminho certo, mas acho que você precisa salvar a cotação. Se você der uma olhada nesta classe:
\Magento\Checkout\Controller\Cart\Add
você pode ver na Linha 114:Eu mudo o preço do evento chamado no final do
addProduct()
método, e o Magento salva o carrinho no final. Portanto, no seu caso, você deve salvar a cotação no seu controlador.fonte
Fiz um trecho que permite alterar o preço. Na verdade, ele altera o preço depois de adicionar o produto à sua cesta. Em outras palavras, ele altera os preços de seus itens em sua cotação. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a
Espero que ajude.
fonte
Você deseja atualizar o total da linha e não o subtotal, use o método
$item->setRowTotal()
ou$item->setBaseRowTotal()
. Além disso, pode ser útil adicionar$item->save()
antes do final do loop.Subtotal é o subtotal do pedido / carrinho.
fonte
@ Felix, você precisa definir
setSubtotal()
uma cotação. Definir o subtotal fora de for loop
.como isso
Nota: Código testado
fonte
Para atualizar o preço do carrinho, você deve usar o carrinho de modelo em vez da sessão de checkout. Carregue o item do carrinho e atualize-o.
fonte
Experimente o código abaixo:
você precisa modificar a
process()
função para sua exigência.NOTA: Não modifique os arquivos principais do magento. Crie um plugin para isso.
Eu espero que isso ajude...!!!
fonte