Respostas:
Vou responder a pergunta em duas partes:
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.
A partir do magento-2.0, 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.
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)
Magento\Checkout\Model\Session::getQuote()
.
$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 />";
}
Nas versões mais recentes, você pode usar a API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
AllItems()
ougetAllVisibleItems()
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.