J'ai essayé de changer le prix de mes produits comme ceci:
Controller.php:
[ÉDITER]
<?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) Avec le nouveau code, le prix change, mais pas le sous-total! Comme vous pouvez le voir ici:
Merci d'avance!
quote
ducheckoutSession
. Je suis un peu confus.Réponses:
Je comprends, je pense que vous êtes dans la bonne voie, mais je pense que vous devez enregistrer la citation. Si vous jetez un œil à cette classe:
\Magento\Checkout\Controller\Cart\Add
vous pouvez voir à la ligne 114:Je modifie le prix de l'événement qui est appelé à la fin de la
addProduct()
méthode et Magento enregistre le panier à la fin. Donc, dans votre cas, vous devez enregistrer le devis dans votre contrôleur.la source
J'ai fait un extrait qui vous permet de changer le prix. En fait, cela change le prix après avoir ajouté un produit dans votre panier. En d'autres termes, cela modifie les prix de vos articles dans votre devis. https://gist.github.com/0-Sony/d9d2ea792b5533bfeaff28827e6f207a
J'espère que cela aide.
la source
Vous souhaitez mettre à jour le total des lignes et non le sous-total, utilisez la méthode
$item->setRowTotal()
ou$item->setBaseRowTotal()
. En outre, il peut être utile d'ajouter$item->save()
avant la fin de la boucle.Le sous-total est le sous-total de la commande / du panier.
la source
@ felix, vous devez définir
setSubtotal()
un devis. Définir le sous-total à l'extérieur for loop
.comme ça
Remarque: Code testé
la source
Pour le prix du panier Upadate, vous devez utiliser le panier modèle à la place de la session de paiement. Chargez l'article du panier et mettez-le à jour.
la source
Essayez le code ci-dessous:
vous devez modifier la
process()
fonction selon vos besoins.REMARQUE: ne modifiez pas les fichiers de base de magento. Créez un plugin pour cela.
J'espère que cela aidera...!!!
la source