Câu trả lời:
Tôi sẽ trả lời câu hỏi theo hai phần:
Điểm đến trong link.phtml
là $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\Link
thay 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ề.
Kể từ magento-2.0, 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.
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)
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 />";
}
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;
}
AllItems()
hoặcgetAllVisibleItems()
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.