Magento 2 - Come ottenere tutti gli articoli nel carrello?


23

Alla pagina di pagamento ( chekout/cart) Voglio modificare la destinazione dell'URL del pulsante di pagamento in base agli articoli del carrello ( link.phtml).

Come posso ottenere tutti gli articoli nel carrello? Voglio farlo senza usare l'API. Grazie.

Risposte:


26

Risponderò alla domanda in due parti:

I. Dove dovresti cambiare l'URL del checkout?

La destinazione link.phtmlè $block->getCheckoutUrl(). Non è necessario modificare il modello per modificare la funzionalità, ma modificare Magento\Checkout\Block\Onepage\Linkinvece il blocco . Per fare ciò, crea un plug-in per esso con un metodo afterGetCheckoutUrl()per modificare il valore restituito.

II. Come ottenere tutti gli articoli nel carrello?

A partire da i contratti di servizio in Magento_Checkout e Magento_Quote non forniscono ancora i metodi necessari, quindi utilizziamo il modello di carrello. Nel tuo plugin iniettalo in questo modo:

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

Ora che hai accesso al carrello, puoi recuperare gli articoli in diversi modi, che è sostanzialmente lo stesso di Magento 1 :

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

    Restituisce una raccolta di articoli di preventivo con tutti gli articoli associati al preventivo corrente.

  • $this->cart->getItems()

    Questa è una scorciatoia per il metodo sopra, ma se non è presente alcuna citazione restituisce un array vuoto, quindi non puoi fare affidamento su come ottenere un'istanza di raccolta.

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

    Carica la raccolta di articoli, quindi restituisce un array di tutti gli elementi che non sono contrassegnati come eliminati (ovvero sono stati rimossi nella richiesta corrente).

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

    Carica la raccolta di articoli, quindi restituisce un array di tutti gli articoli che non sono contrassegnati come eliminati E non hanno un genitore (ovvero si ottengono articoli per prodotti raggruppati e configurabili ma non i loro figli associati). Ogni articolo dell'array corrisponde a una riga visualizzata nella pagina del carrello.

Scegli ciò che si adatta meglio alle tue esigenze. Nella maggior parte dei casi l'ultimo metodo è quello di cui hai bisogno.


utilizzando il modello e il metodo del carrello ottieni AllItems()o getAllVisibleItems()restituirai tutti gli articoli in tutti i carrelli di chiunque visiti il ​​negozio da tutti i modelli di preventivi attivi? O solo uno dal mio carrello (scommetto per questo preferirei usare l'oggetto sessione di checkout e ottenere l'oggetto qutoe da esso)? La differenza è importante, perché volevo usare la sessione di checkout nella classe di blocco, ma in realtà qutoe è vuoto quando si entra nel blocco.
Bartosz Kubicki,

È sempre solo il carrello della sessione corrente.
Fabian Schmengler,

E come ottenere la categoria di prodotti?
Рома Лытарь

21

L'uso di Magento \ Checkout \ Model \ Cart è obsoleto.

È necessario utilizzare la sessione per ottenere il preventivo e gli articoli del carrello.

use Magento\Checkout\Model\Session;

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

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

Sono sicuro che Magento aggiungerà presto una sorta di repository per la sessione.

Per quanto posso dire, non puoi semplicemente ottenere il preventivo corrente utilizzando Magento \ Quote \ Api \ CartRepositoryInterface o Magento \ Quote \ Api \ CartManagementInterface, tuttavia, se hai l'ID cliente puoi utilizzare uno di questi due per carica il preventivo (che immagino sia il modo in cui Magento vuole che tu lo faccia) e da lì ottieni articoli preventivo / carrello.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)

4
Credo che il modo corretto sia utilizzare la sessione di pagamento ora 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 />";            
  }

E come ottenere la categoria di prodotti?
Рома Лытарь

0

Nelle versioni più recenti è possibile utilizzare l'API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.