Magento 2 - Làm thế nào để có được tất cả các mặt hàng trong giỏ hàng?


23

Tại trang thanh toán ( chekout/cart) Tôi muốn chỉnh sửa đích url của nút thanh toán dựa trên các mục giỏ hàng ( link.phtml).

Làm thế nào tôi có thể nhận được tất cả các mặt hàng trong giỏ hàng? Tôi muốn làm điều này mà không cần sử dụng API. Cảm ơn.

Câu trả lời:


26

Tôi sẽ trả lời câu hỏi theo hai phần:

I. Bạn nên thay đổi URL thanh toán ở đâu?

Điểm đến trong link.phtml$block->getCheckoutUrl(). Bạn không nên thay đổi mẫu để thay đổi chức năng, nhưng thay đổi khối Magento\Checkout\Block\Onepage\Linkthay thế. Để làm như vậy, hãy tạo một plugin cho nó bằng một phương thức afterGetCheckoutUrl()để thay đổi giá trị trả về.

II. Làm thế nào để có được tất cả các mặt hàng trong giỏ hàng?

Kể từ các hợp đồng dịch vụ trong Magento_Checkout và Magento_Quote chưa cung cấp các phương thức cần thiết, vì vậy chúng tôi sử dụng mô hình giỏ hàng. Trong plugin của bạn tiêm nó như thế này:

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

Bây giờ bạn có quyền truy cập vào giỏ hàng, bạn có thể truy xuất các mục theo nhiều cách, về cơ bản giống như trong Magento 1 :

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

    Trả về một bộ sưu tập mục trích dẫn với tất cả các mục liên quan đến báo giá hiện tại.

  • $this->cart->getItems()

    Đây là một lối tắt cho phương thức trên, nhưng nếu không có trích dẫn, nó sẽ trả về một mảng trống, vì vậy bạn không thể dựa vào việc lấy một thể hiện của bộ sưu tập.

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

    Tải bộ sưu tập mục, sau đó trả về một mảng của tất cả các mục không được đánh dấu là đã xóa (nghĩa là đã bị xóa trong yêu cầu hiện tại).

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

    Tải bộ sưu tập mục, sau đó trả về một mảng của tất cả các mục không được đánh dấu là đã xóa VÀ không có cha mẹ (nghĩa là bạn nhận được các mục cho các sản phẩm được đóng gói và có thể định cấu hình nhưng không phải là con liên quan của chúng). Mỗi mục mảng tương ứng với một hàng được hiển thị trong trang giỏ hàng.

Chọn những gì phù hợp với nhu cầu của bạn tốt nhất. Trong hầu hết các trường hợp, phương pháp cuối cùng là những gì bạn cần.


sử dụng mô hình Giỏ hàng và phương thức nhận AllItems()hoặc getAllVisibleItems()sẽ trả lại tất cả các mặt hàng trong tất cả các giỏ hàng của bất kỳ ai ghé thăm cửa hàng từ tất cả các mô hình báo giá hoạt động? Hoặc chỉ một cái từ giỏ hàng của tôi (tôi đặt cược cho điều này tôi muốn sử dụng đối tượng phiên thanh toán và nhận đối tượng qutoe từ nó)? Sự khác biệt rất quan trọng, vì tôi muốn sử dụng phiên thanh toán trong lớp khối, nhưng thực sự qutoe trống khi vào bên trong khối.
Bartosz Kubicki

Nó luôn luôn chỉ là giỏ hàng của phiên hiện tại.
Fabian Schmengler

Và làm thế nào để có được danh mục hàng hóa?
Hãy để chúng tôi

21

Việc sử dụng Magento \ Checkout \ Model \ Cart không được chấp nhận.

Bạn nên sử dụng phiên để có được báo giá và các mặt hàng giỏ hàng của bạn.

use Magento\Checkout\Model\Session;

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

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

Tôi chắc chắn rằng Magento sẽ sớm thêm một số loại kho lưu trữ cho phiên.

Theo như tôi có thể nói với bạn, bạn không thể thực sự nhận được báo giá hiện tại bằng cách sử dụng Magento \ Trích dẫn \ Api \ CartRep repositoryInterface hoặc Magento \ Trích dẫn \ Api \ CartManloymentInterface, tuy nhiên, nếu bạn có ID khách hàng, bạn có thể sử dụng một trong hai tải báo giá (mà tôi tưởng tượng là cách Magento muốn bạn làm điều đó) và từ đó nhận được các mục báo giá / giỏ hàng.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)

4
Tôi tin rằng cách thích hợp là sử dụng phiên thanh toán ngay bây giờ 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 />";            
  }

Và làm thế nào để có được danh mục hàng hóa?
Hãy để chúng tôi

0

Trong các phiên bản mới hơn, bạn có thể sử dụng API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.