Magento 2 - Como obter todos os itens no carrinho?

23

Na página de finalização da compra ( chekout/cart), desejo editar o destino da URL do botão de finalização da compra com base nos itens do carrinho ( link.phtml).

Como posso obter todos os itens no carrinho? Eu quero fazer isso sem usar a API. Obrigado.

lalokuyo
fonte

Respostas:

26

Vou responder a pergunta em duas partes:

I. Onde você deve alterar o URL do checkout?

O destino em link.phtmlé $block->getCheckoutUrl(). Você não deve alterar o modelo para alterar a funcionalidade, mas alterar o bloco Magento\Checkout\Block\Onepage\Link. Para fazer isso, crie um plugin para ele com um método afterGetCheckoutUrl()para alterar o valor de retorno.

II Como obter todos os itens no carrinho?

A partir do os contratos de serviço no Magento_Checkout e Magento_Quote ainda não fornecem os métodos necessários; portanto, usamos o modelo de carrinho. No seu plugin, injete-o assim:

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

Agora que você tem acesso ao carrinho, pode recuperar os itens de várias maneiras, o que é basicamente o mesmo que no Magento 1 :

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

    Retorna uma coleção de itens de cotação com todos os itens associados à cotação atual.

  • $this->cart->getItems()

    Este é um atalho para o método acima, mas se não houver aspas, ele retornará uma matriz vazia; portanto, você não pode confiar em obter uma instância de coleção.

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

    Carrega a coleção de itens e, em seguida, retorna uma matriz de todos os itens que não estão marcados como excluídos (ou seja, foram removidos na solicitação atual).

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

    Carrega a coleção de itens e, em seguida, retorna uma matriz de todos os itens que não estão marcados como excluídos E não têm um pai (ou seja, você obtém itens para produtos configuráveis ​​e em pacote configurável, mas não seus filhos associados). Cada item da matriz corresponde a uma linha exibida na página do carrinho.

Escolha o que melhor se adapta às suas necessidades. Na maioria dos casos, o último método é o que você precisa.

Fabian Schmengler
fonte
usando o modelo e o método do carrinho obtém AllItems()ou getAllVisibleItems()retornará todos os itens em todos os carros de qualquer pessoa que visite a loja a partir de todos os modelos de cotação ativos? Ou apenas um do meu carrinho (eu aposto que eu prefiro usar o objeto da sessão de checkout e obter o objeto qutoe dele)? A diferença é importante, porque eu queria usar a sessão de checkout na classe de bloco, mas na verdade o qutoe está vazio quando entra no bloco.
Bartosz Kubicki
É sempre apenas o carrinho da sessão atual.
Fabian Schmengler
E como obter a categoria de mercadorias?
Рома Лытарь 22/03
21

O uso do Magento \ Checkout \ Model \ Cart foi descontinuado.

Você deve usar a sessão para obter a cotação e os itens do carrinho.

use Magento\Checkout\Model\Session;

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

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

Tenho certeza de que o Magento em breve adicionará algum tipo de repositório para a sessão.

Até onde eu sei, você não pode apenas obter a cotação atual usando Magento \ Quote \ Api \ CartRepositoryInterface ou Magento \ Quote \ Api \ CartManagementInterface, no entanto, se você tiver o ID do cliente, poderá usar um desses dois para carregue a cotação (que eu imagino é a maneira que o Magento deseja que você faça) e a partir daí obtenha itens de cotação / carrinho.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
Frank
fonte
4
Acredito que a maneira correta é usar a sessão de checkout agora 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
fonte
E como obter a categoria de mercadorias?
Рома Лытарь 22/03
0

Nas versões mais recentes, você pode usar a API:

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