Magento 2 - Wie bekomme ich alle Artikel in den Warenkorb?

23

Auf der Checkout-Seite ( chekout/cart) möchte ich das URL-Ziel der Checkout-Schaltfläche basierend auf den Warenkorbelementen ( link.phtml) bearbeiten .

Wie kann ich alle Artikel im Warenkorb bekommen? Ich möchte dies tun, ohne die API zu verwenden. Vielen Dank.

lalokuyo
quelle

Antworten:

26

Ich werde die Frage in zwei Teilen beantworten:

I. Wo sollten Sie die Checkout-URL ändern?

Das Ziel in link.phtmlist $block->getCheckoutUrl(). Sie sollten die Vorlage nicht ändern, um die Funktionalität zu ändern, sondern Magento\Checkout\Block\Onepage\Linkstattdessen den Block ändern . Erstellen Sie dazu ein Plugin mit einer Methode afterGetCheckoutUrl(), um den Rückgabewert zu ändern.

II. Wie bekomme ich alle Artikel in den Warenkorb?

Ab bieten die Serviceverträge in Magento_Checkout und Magento_Quote noch nicht die erforderlichen Methoden, daher verwenden wir das Warenkorbmodell. In deinem Plugin spritze es so ein:

public function __construct(\Magento\Checkout\Model\Cart $cart)
{
    $this->cart = $cart;
}

Nachdem Sie nun Zugriff auf den Warenkorb haben, können Sie die Artikel auf verschiedene Arten abrufen. Dies ist im Grunde dasselbe wie in Magento 1 :

  • $this->cart->getQuote()->getItemsCollection()

    Gibt eine Angebotseintragssammlung mit allen Einträgen zurück, die dem aktuellen Angebot zugeordnet sind.

  • $this->cart->getItems()

    Dies ist eine Abkürzung für die obige Methode. Wenn jedoch kein Anführungszeichen vorhanden ist, wird ein leeres Array zurückgegeben, sodass Sie sich nicht darauf verlassen können, eine Auflistungsinstanz abzurufen.

  • $this->cart->getQuote()->getAllItems()

    Lädt die Elementauflistung und gibt dann ein Array aller Elemente zurück, die nicht als gelöscht markiert sind (dh in der aktuellen Anforderung entfernt wurden).

  • $this->cart->getQuote()->getAllVisibleItems()

    Lädt die Artikelsammlung und gibt dann ein Array aller Artikel zurück, die nicht als gelöscht markiert sind UND keine übergeordneten Artikel haben (dh Sie erhalten Artikel für gebündelte und konfigurierbare Produkte, aber nicht die zugehörigen untergeordneten Artikel). Jedes Array-Element entspricht einer angezeigten Zeile auf der Warenkorbseite.

Wählen Sie, was Ihren Bedürfnissen am besten entspricht. In den meisten Fällen ist die letzte Methode die, die Sie benötigen.

Fabian Schmengler
quelle
mit Warenkorb - Modell und Methode get AllItems()oder getAllVisibleItems()alle Einzelteil in allen Wagen von jeder Rückkehr Shop von allen aktiven Zitaten Modell zu besuchen? Oder nur eines aus meinem Einkaufswagen (ich wette, ich verwende lieber ein Checkout-Sitzungsobjekt und hole mir ein QUTOE-Objekt daraus)? Der Unterschied ist wichtig, weil ich die Checkout-Sitzung in der Blockklasse verwenden wollte, aber tatsächlich ist qutoe leer, wenn ich in den Block komme.
Bartosz Kubicki
Es ist immer nur der Einkaufswagen der aktuellen Sitzung.
Fabian Schmengler
Und wie bekommt man die Warengruppe?
Рома Лытарь
21

Die Verwendung von Magento \ Checkout \ Model \ Cart ist veraltet.

Sie sollten die Sitzung verwenden, um das Angebot und Ihre Einkaufswagenartikel zu erhalten.

use Magento\Checkout\Model\Session;

public function __construct(
        ...
        Session $session
        ...
    ) {
        ...
        $this->_session = $session;
        ...
    }

public function yourFunction()
{
    $items = $this->_session->getQuote()->getAllVisibleItems();
}

Ich bin mir sicher, dass Magento demnächst eine Art Repository für die Sitzung hinzufügen wird.

Soweit ich weiß, können Sie das aktuelle Angebot nicht einfach über Magento \ Quote \ Api \ CartRepositoryInterface oder Magento \ Quote \ Api \ CartManagementInterface abrufen. Wenn Sie jedoch die Kundennummer haben, können Sie eine dieser beiden Optionen verwenden Laden Sie das Angebot (was meiner Meinung nach so ist, wie es von Magento gewünscht wird) und erhalten Sie von dort Angebote / Warenkorb-Artikel.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
Frank
quelle
4
Ich glaube, der richtige Weg ist, die Checkout-Sitzung jetzt zu verwenden 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
quelle
Und wie bekommt man die Warengruppe?
Рома Лытарь
0

In neueren Versionen können Sie die API verwenden:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
Diazwatson
quelle