Ich habe versucht, den Preis meiner Produkte folgendermaßen zu ändern:
Controller.php:
[BEARBEITEN]
<?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;
}
}
}
(BEARBEITEN) Mit dem neuen Code ändert sich der Preis, die Zwischensumme jedoch nicht! Wie Sie hier sehen können:
Danke im Voraus!
quote
von dercheckoutSession
. Ich bin etwas verwirrt.Antworten:
Ich verstehe, ich denke, Sie sind auf dem richtigen Weg, aber ich denke, Sie müssen das Zitat speichern. Wenn Sie sich diese Klasse ansehen:
\Magento\Checkout\Controller\Cart\Add
Sie können in Zeile 114 sehen:Ich ändere den Preis von dem Ereignis, das am Ende der
addProduct()
Methode aufgerufen wird, und Magento speichert den Wagen am Ende. In Ihrem Fall müssen Sie das Angebot also in Ihrem Controller speichern.quelle
Ich habe einen Ausschnitt gemacht, mit dem Sie den Preis ändern können. Tatsächlich ändert sich der Preis, nachdem Sie das Produkt in Ihren Warenkorb gelegt haben. Mit anderen Worten, es ändert die Preise Ihrer Artikel in Ihrem Angebot. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a
Ich hoffe es hilft.
quelle
Sie möchten die Zeilensumme und nicht die Zwischensumme aktualisieren, verwenden Sie die Methode
$item->setRowTotal()
oder$item->setBaseRowTotal()
. Es kann auch hilfreich sein,$item->save()
vor dem Ende der Schleife hinzuzufügen .Zwischensumme ist die Zwischensumme für Bestellung / Warenkorb.
quelle
@ felix, du musst
setSubtotal()
ein Angebot machen. Zwischensumme außerhalb f setzenor loop
.so was
Hinweis: Code getestet
quelle
Für den Upadate-Warenkorbpreis müssen Sie anstelle der Checkout-Sitzung den Modellwagen verwenden. Laden Sie den Artikel aus dem Warenkorb und aktualisieren Sie ihn.
quelle
Versuchen Sie den folgenden Code:
Sie müssen die
process()
Funktion für Ihre Anforderung ändern .HINWEIS: Ändern Sie keine Magento-Kerndateien. Plugin dafür erstellen.
Ich hoffe es wird helfen ... !!!
quelle