Magento 2: Cách tải quote bằng quote id


Câu trả lời:


19

bạn có thể tiêm vào lớp của bạn một ví dụ \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

public function __construct(
    ...
    \Magento\Quote\Model\QuoteFactory $quoteFactory,
    ....
) {
    ....
    $this->quoteFactory = $quoteFactory;
    ....
}

Sau đó, bạn có thể sử dụng:

$quote = $this->quoteFactory->create()->load($quoteId);

Điều này sẽ hoạt động ngay bây giờ, nhưng sớm thôi, loadphương pháp sẽ biến mất và bạn cần sử dụng hợp đồng dịch vụ.
Vì vậy, bạn có thể sử dụng \Magento\Quote\Api\CartRepositoryInterface.
Tương tự như trên, thêm một thể hiện của lớp này vào lớp của bạn:

protected $quoteRepository;

public function __construct(
    ...
    \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
    ....
) {
    ....
    $this->quoteRepository = $quoteRepository;
    ....
}

và sử dụng cái này:

$this->quoteRepository->get($quoteId);

Nếu bạn muốn xem mã trông như thế nào, thì việc thực hiện \Magento\Quote\Api\CartRepositoryInterface\Magento\Quote\Model\QuoteRepository


Xin chào @Marius, điều này có hoạt động trong trường hợp nhiều lượt xem cửa hàng không?
manini

Tôi nghĩ nó sẽ hoạt động
Marius

13

Trước tiên, bạn cần tiêm một hàm tạo \Magento\Quote\Model\QuoteFactorytrong lớp:

protected $_quoteFactory;

public function __construct(
    ...
    \Magento\Quote\Model\QuoteFactory $quoteFactory
) {
    $this->_quoteFactory = $quoteFactory;
    parent::__construct(...);
}

Sau đó, trong lớp học của bạn, bạn có thể làm:

$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);

Ngoài ra, bạn cũng có thể sử dụng các phương pháp sau để tải báo giá:

  • loadActive($quoteId)nơi nó tải báo giá hoạt động tương ứng (trong đó is_active= 1)
  • loadByCustomerId($customerId) nơi nó tải báo giá hoạt động tương ứng với id khách hàng.

NB: bạn cũng có thể sử dụng trình quản lý đối tượng trực tiếp để làm điều đó nhưng không được khuyến khích :

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);

1
\Magento\Quote\Model\Quotelà một lớp không tiêm. Ý tôi là bạn có thể tiêm nó, nhưng đó không phải là ý tưởng tốt nhất để làm điều đó. Nếu bạn tiêm lớp này vào 2 lớp khác, bạn sẽ nhận được nó dưới dạng đơn lẻ trong thùng chứa DI và nếu bạn gọi loadmột lần trong một trong các lớp, bạn cũng sẽ có "lớp" đó trong lớp khác của mình. Hầu hết có lẽ bạn không muốn điều đó. Sử dụng các nhà máy thay thế.
Marius

@Marius đây là những gì xảy ra khi bạn làm việc trên các dự án M1 và M2 cùng một lúc. Bạn có xu hướng trộn lẫn tất cả mọi thứ. Cảm ơn sự giác ngộ và +1 cho giải pháp của bạn, chắc chắn là cách phù hợp với hợp đồng dịch vụ
Raphael tại Digital Pianism

Thay vì $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);bạn có thể sử dụng $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Vì lý do tương tự đã nêu ở trên. kêu gọi getOM sẽ dẫn đến một singleton.
Marius

@Marius Tôi thấy rằng getvs createrõ ràng hơn so với việc sử dụng singletons của M1 nhưng tôi vẫn có xu hướng lạm dụng chúng
Raphael tại Digital Pianism

Đừng lo lắng. Đã từng trải qua rồi. :)
Marius
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.