Traté de cambiar el precio de mis productos de esta manera:
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;
}
}
}
(EDITAR) Con el nuevo código, el precio cambia, ¡pero el subtotal no! Como puedes ver aquí:
¡Gracias por adelantado!
quote
desdecheckoutSession
. Estoy un poco confundido.Respuestas:
Lo entiendo, creo que estás en el camino correcto, pero creo que tienes que guardar la cotización. Si echa un vistazo a esta clase:
\Magento\Checkout\Controller\Cart\Add
puede ver en la línea 114:Cambio el precio del evento que se llama al final del
addProduct()
método, y Magento guarda el carrito al final. Entonces, en su caso, debe guardar la cotización en su controlador.fuente
Hice un fragmento que le permite cambiar el precio. En realidad, cambia el precio después de agregar el producto a su cesta. En otras palabras, cambia los precios de sus artículos en su presupuesto. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a
Espero eso ayude.
fuente
Desea actualizar el total de la fila y no el subtotal, utilice el método
$item->setRowTotal()
o$item->setBaseRowTotal()
. Además, podría ser útil agregar$item->save()
antes del final del ciclo.Subtotal es el subtotal del pedido / carrito.
fuente
@ felix, debes establecer
setSubtotal()
una cotización. Establecer subtotal fuera de for loop
.Me gusta esto
Nota: Código probado
fuente
Para el precio del carrito Upadate, debe usar el modelo de carrito en lugar de la sesión de pago. Cargue el artículo del carrito y actualícelo.
fuente
Pruebe el siguiente código:
necesita modificar la
process()
función para su requerimiento.NOTA: No modifique los archivos principales de magento. Crea un complemento para esto.
Espero que ayude ... !!!
fuente