Na stronie kasy ( chekout/cart
) chcę edytować miejsce docelowe adresu URL przycisku kasy w oparciu o elementy koszyka ( link.phtml
).
Jak mogę dostać wszystkie przedmioty do koszyka? Chcę to zrobić bez użycia interfejsu API. Dzięki.
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.
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.Korzystanie z Magento \ Checkout \ Model \ Cart jest przestarzałe.
Skorzystaj z sesji, aby uzyskać wycenę i przedmioty z koszyka.
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.
źródło
Magento\Checkout\Model\Session::getQuote()
.źródło
W nowszych wersjach możesz użyć interfejsu API:
źródło