Risposte:
Risponderò alla domanda in due parti:
La destinazione link.phtml
è $block->getCheckoutUrl()
. Non è necessario modificare il modello per modificare la funzionalità, ma modificare Magento\Checkout\Block\Onepage\Link
invece il blocco . Per fare ciò, crea un plug-in per esso con un metodo afterGetCheckoutUrl()
per modificare il valore restituito.
A partire da magento-2.0 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.
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)
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 />";
}
Nelle versioni più recenti è possibile utilizzare l'API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
AllItems()
ogetAllVisibleItems()
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.