Odpowiedzi:
Odpowiem na pytanie w dwóch częściach:
Miejsce docelowe link.phtml
to $block->getCheckoutUrl()
. Nie należy zmieniać szablonu w celu zmiany funkcjonalności, ale Magento\Checkout\Block\Onepage\Link
zamiast tego zmienić blok . Aby to zrobić, utwórz dla niego wtyczkę z metodą afterGetCheckoutUrl()
zmiany wartości zwracanej.
Od magento-2.0 umowy serwisowe w Magento_Checkout i Magento_Quote nie zapewniają jeszcze niezbędnych metod, dlatego używamy modelu koszyka. Wstaw wtyczkę w następujący sposób:
public function __construct(\Magento\Checkout\Model\Cart $cart)
{
$this->cart = $cart;
}
Teraz, gdy masz dostęp do koszyka, możesz odzyskać przedmioty na kilka sposobów, co w zasadzie jest takie samo jak w Magento 1 :
$this->cart->getQuote()->getItemsCollection()
Zwraca kolekcję pozycji wyceny ze wszystkimi pozycjami związanymi z bieżącą wyceną.
$this->cart->getItems()
Jest to skrót do powyższej metody, ale jeśli nie ma cudzysłowu, zwraca pustą tablicę, więc nie można polegać na uzyskaniu instancji kolekcji.
$this->cart->getQuote()->getAllItems()
Ładuje kolekcję elementów, a następnie zwraca tablicę wszystkich elementów, które nie są oznaczone jako usunięte (tj. Zostały usunięte w bieżącym żądaniu).
$this->cart->getQuote()->getAllVisibleItems()
Wczytuje kolekcję elementów, a następnie zwraca tablicę wszystkich elementów, które nie są oznaczone jako usunięte ORAZ nie mają elementu nadrzędnego (tzn. Otrzymujesz elementy dla produktów w pakiecie i konfigurowalnych, ale nie powiązane z nimi elementy podrzędne). Każdy element tablicy odpowiada wyświetlanemu wierszowi na stronie koszyka.
Wybierz to, co najlepiej odpowiada Twoim potrzebom. W większości przypadków potrzebna jest ostatnia metoda.
Korzystanie z Magento \ Checkout \ Model \ Cart jest przestarzałe.
Skorzystaj z sesji, aby uzyskać wycenę i przedmioty z koszyka.
use Magento\Checkout\Model\Session;
public function __construct(
...
Session $session
...
) {
...
$this->_session = $session;
...
}
public function yourFunction()
{
$items = $this->_session->getQuote()->getAllVisibleItems();
}
Jestem pewien, że Magento wkrótce doda jakieś repozytorium do sesji.
O ile mogę powiedzieć, nie można tak naprawdę uzyskać bieżącej wyceny za pomocą Magento \ Quote \ Api \ CartRepositoryInterface lub Magento \ Quote \ Api \ CartManagementInterface, jednak jeśli masz identyfikator klienta, możesz użyć jednego z tych dwóch, aby załaduj wycenę (co wyobrażam sobie, że Magento chce, żebyś to zrobił) i stamtąd otrzymaj wycenę / koszyk.
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 />";
}
W nowszych wersjach możesz użyć interfejsu API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
AllItems()
lubgetAllVisibleItems()
zwróci wszystkie przedmioty we wszystkich wózkach osoby odwiedzającej sklep z wszystkich aktywnych modeli wycen? Lub tylko jeden z mojego koszyka (założę się, że wolałbym użyć obiektu sesji kasy i uzyskać z niego obiekt qutoe)? Różnica jest ważna, ponieważ chciałem użyć sesji kasy w klasie bloków, ale tak naprawdę qutoe jest pusty, kiedy dostaję się do bloku.