Magento 2 - Bagaimana cara mendapatkan semua item dalam troli?

23

Di halaman checkout ( chekout/cart) saya ingin mengedit tombol url tujuan checkout berdasarkan item keranjang ( link.phtml).

Bagaimana saya bisa mendapatkan semua barang dalam keranjang? Saya ingin melakukan ini tanpa menggunakan API. Terima kasih.

lalokuyo
sumber

Jawaban:

26

Saya akan menjawab pertanyaan dalam dua bagian:

I. Di mana Anda harus mengubah URL checkout?

Tujuan di link.phtmladalah $block->getCheckoutUrl(). Anda seharusnya tidak mengubah templat untuk mengubah fungsionalitas, tetapi mengubah blok Magento\Checkout\Block\Onepage\Linksebagai gantinya. Untuk melakukannya, buat plugin untuknya dengan metode afterGetCheckoutUrl()untuk mengubah nilai balik.

II Bagaimana cara mendapatkan semua barang di troli?

Pada kontrak layanan di Magento_Checkout dan Magento_Quote belum menyediakan metode yang diperlukan, jadi kami menggunakan model kereta. Di plugin Anda suntikkan seperti ini:

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

Sekarang Anda memiliki akses ke troli, Anda dapat mengambil item dalam beberapa cara, yang pada dasarnya sama dengan di Magento 1 :

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

    Mengembalikan koleksi item penawaran dengan semua item yang terkait dengan penawaran saat ini.

  • $this->cart->getItems()

    Ini adalah jalan pintas untuk metode di atas, tetapi jika tidak ada penawaran, ia mengembalikan array kosong, jadi Anda tidak bisa mengandalkan mendapatkan contoh koleksi.

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

    Memuat koleksi item, lalu mengembalikan array semua item yang tidak ditandai sebagai dihapus (yaitu telah dihapus dalam permintaan saat ini).

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

    Memuat koleksi item, lalu mengembalikan array semua item yang tidak ditandai sebagai dihapus DAN tidak memiliki orang tua (yaitu Anda mendapatkan item untuk produk yang dibundel dan dapat dikonfigurasi tetapi bukan anak-anak yang terkait). Setiap item array sesuai dengan baris yang ditampilkan di halaman keranjang.

Pilih yang paling sesuai dengan kebutuhan Anda. Dalam kebanyakan kasus, metode terakhir adalah apa yang Anda butuhkan.

Fabian Schmengler
sumber
menggunakan model dan metode Keranjang dapatkan AllItems()atau getAllVisibleItems()akan mengembalikan semua barang di semua gerobak orang yang mengunjungi toko dari semua model penawaran aktif? Atau hanya satu dari keranjang saya (saya bertaruh untuk ini saya lebih suka menggunakan objek sesi checkout dan mendapatkan objek qutoe dari itu)? Perbedaan itu penting, karena saya ingin menggunakan sesi checkout di kelas blok, tetapi sebenarnya qutoe kosong ketika masuk ke dalam blok.
Bartosz Kubicki
Selalu hanya kereta dari sesi saat ini.
Fabian Schmengler
Dan bagaimana cara mendapatkan kategori barang?
Рома Лытарь
21

Penggunaan Magento \ Checkout \ Model \ Cart sudah tidak digunakan lagi.

Anda harus menggunakan sesi ini untuk mendapatkan penawaran dan item keranjang Anda.

use Magento\Checkout\Model\Session;

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

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

Saya yakin Magento akan segera menambahkan semacam repositori untuk sesi.

Sejauh yang saya tahu Anda tidak bisa benar-benar mendapatkan kutipan saat ini menggunakan Magento \ Quote \ Api \ CartRepositoryInterface atau Magento \ Quote \ Api \ CartManagementInterface, jika Anda memiliki ID pelanggan, Anda dapat menggunakan salah satu dari keduanya untuk memuat kutipan (yang saya bayangkan adalah cara Magento ingin Anda melakukannya) dan dari sana dapatkan item kutipan / keranjang.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
jujur
sumber
4
Saya percaya cara yang tepat adalah dengan menggunakan sesi checkout sekarang 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
sumber
Dan bagaimana cara mendapatkan kategori barang?
Рома Лытарь
0

Dalam versi yang lebih baru Anda dapat menggunakan API:

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