Jawaban:
Saya akan menjawab pertanyaan dalam dua bagian:
Tujuan di link.phtml
adalah $block->getCheckoutUrl()
. Anda seharusnya tidak mengubah templat untuk mengubah fungsionalitas, tetapi mengubah blok Magento\Checkout\Block\Onepage\Link
sebagai gantinya. Untuk melakukannya, buat plugin untuknya dengan metode afterGetCheckoutUrl()
untuk mengubah nilai balik.
Pada magento-2.0 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.
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)
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 />";
}
Dalam versi yang lebih baru Anda dapat menggunakan API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
AllItems()
ataugetAllVisibleItems()
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.