Magento 2 - Comment obtenir tous les articles dans le panier?

23

À la page de paiement ( chekout/cart), je souhaite modifier la destination de l'URL du bouton de paiement en fonction des articles du panier ( link.phtml).

Comment puis-je mettre tous les articles dans le panier? Je veux le faire sans utiliser l'API. Merci.

lalokuyo
la source

Réponses:

26

Je répondrai à la question en deux parties:

I. Où devez-vous modifier l'URL de paiement?

La destination en link.phtmlest $block->getCheckoutUrl(). Vous ne devez pas modifier le modèle pour modifier les fonctionnalités, mais modifier le bloc à la Magento\Checkout\Block\Onepage\Linkplace. Pour ce faire, créez un plugin pour celui-ci avec une méthode afterGetCheckoutUrl()pour modifier la valeur de retour.

II. Comment obtenir tous les articles dans le panier?

Depuis les contrats de service dans Magento_Checkout et Magento_Quote ne fournissent pas encore les méthodes nécessaires, nous utilisons donc le modèle de panier. Dans votre plugin, injectez-le comme ceci:

public function __construct(\Magento\Checkout\Model\Cart $cart)
{
    $this->cart = $cart;
}

Maintenant que vous avez accès au panier, vous pouvez récupérer les articles de plusieurs manières, ce qui est essentiellement le même que dans Magento 1 :

  • $this->cart->getQuote()->getItemsCollection()

    Renvoie une collection d' articles de devis avec tous les articles associés au devis actuel.

  • $this->cart->getItems()

    Il s'agit d'un raccourci pour la méthode ci-dessus, mais s'il n'y a pas de guillemet, il renvoie un tableau vide, vous ne pouvez donc pas compter sur l'obtention d'une instance de collection.

  • $this->cart->getQuote()->getAllItems()

    Charge la collection d'éléments, puis retourne un tableau de tous les éléments qui ne sont pas marqués comme supprimés (c'est-à-dire qui ont été supprimés dans la demande actuelle).

  • $this->cart->getQuote()->getAllVisibleItems()

    Charge la collection d'éléments, puis retourne un tableau de tous les éléments qui ne sont pas marqués comme supprimés ET n'ont pas de parent (c'est-à-dire que vous obtenez des éléments pour les produits groupés et configurables mais pas leurs enfants associés). Chaque élément du tableau correspond à une ligne affichée dans la page du panier.

Choisissez ce qui correspond le mieux à vos besoins. Dans la plupart des cas, la dernière méthode est celle dont vous avez besoin.

Fabian Schmengler
la source
en utilisant le modèle et la méthode du panier, obtenir AllItems()ou getAllVisibleItems()retournera tous les articles dans tous les chariots de toute personne visitant le magasin à partir de tous les modèles de devis actifs? Ou juste un de mon panier (je parie que je préfère utiliser un objet de session de paiement et en obtenir un objet qutoe)? La différence est importante, car je voulais utiliser la session de paiement dans la classe de bloc, mais en fait qutoe est vide quand on entre dans le bloc.
Bartosz Kubicki
Ce n'est toujours que le panier de la session en cours.
Fabian Schmengler
Et comment obtenir la catégorie de marchandises?
Рома Лытарь
21

L'utilisation de Magento \ Checkout \ Model \ Cart est déconseillée.

Vous devez utiliser la session pour obtenir le devis et les articles de votre panier.

use Magento\Checkout\Model\Session;

public function __construct(
        ...
        Session $session
        ...
    ) {
        ...
        $this->_session = $session;
        ...
    }

public function yourFunction()
{
    $items = $this->_session->getQuote()->getAllVisibleItems();
}

Je suis sûr que Magento ajoutera bientôt une sorte de référentiel pour la session.

Pour autant que je sache, vous ne pouvez pas vraiment obtenir le devis actuel en utilisant Magento \ Quote \ Api \ CartRepositoryInterface ou Magento \ Quote \ Api \ CartManagementInterface cependant, si vous avez l'ID client, vous pouvez utiliser l'un des deux pour charger le devis (ce que j'imagine est la façon dont Magento veut que vous le fassiez) et à partir de là, obtenir des articles de devis / panier.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
Franc
la source
4
Je crois que la bonne façon est d'utiliser la session de paiement maintenant Magento\Checkout\Model\Session::getQuote().
Giel Berkers
10
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); 

// retrieve quote items collection
$itemsCollection = $cart->getQuote()->getItemsCollection();

// get array of all items what can be display directly
$itemsVisible = $cart->getQuote()->getAllVisibleItems();

// retrieve quote items array
 $items = $cart->getQuote()->getAllItems();

foreach($items as $item) {
     echo 'ID: '.$item->getProductId().'<br />';
      echo 'Name: '.$item->getName().'<br />';
       echo 'Sku: '.$item->getSku().'<br />';
       echo 'Quantity: '.$item->getQty().'<br />';
      echo 'Price: '.$item->getPrice().'<br />';
    echo "<br />";            
  }
Rahul Katoch
la source
Et comment obtenir la catégorie de marchandises?
Рома Лытарь
0

Dans les versions plus récentes, vous pouvez utiliser l'API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
diazwatson
la source