Magento 2 - Jak zdobyć wszystkie przedmioty w koszyku?

23

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.

lalokuyo
źródło

Odpowiedzi:

26

Odpowiem na pytanie w dwóch częściach:

I. Gdzie należy zmienić adres URL kasy?

Miejsce docelowe link.phtmlto $block->getCheckoutUrl(). Nie należy zmieniać szablonu w celu zmiany funkcjonalności, ale Magento\Checkout\Block\Onepage\Linkzamiast tego zmienić blok . Aby to zrobić, utwórz dla niego wtyczkę z metodą afterGetCheckoutUrl()zmiany wartości zwracanej.

II. Jak zdobyć wszystkie przedmioty w koszyku?

Od 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.

Fabian Schmengler
źródło
za pomocą modelu i metody koszyka otrzymujesz AllItems()lub getAllVisibleItems()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.
Bartosz Kubicki,
To zawsze tylko koszyk bieżącej sesji.
Fabian Schmengler
A jak uzyskać kategorię towarów?
Рома Лытарь
21

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)
Szczery
źródło
4
Uważam, że właściwym sposobem jest teraz skorzystanie z sesji kasy 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
źródło
A jak uzyskać kategorię towarów?
Рома Лытарь
0

W nowszych wersjach możesz użyć interfejsu API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
diazwatson
źródło