Magento 2: Cara memuat kutipan dengan kutipan id

12

Bagaimana saya bisa memuat kutipan di magento 2 dengan kutipan id ?

Krupali
sumber

Jawaban:

19

Anda dapat menyuntikkan di kelas Anda contoh \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Maka Anda dapat menggunakan:

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

Ini seharusnya berfungsi untuk saat ini, tetapi segera, loadmetode ini akan hilang dan Anda perlu menggunakan kontrak layanan.
Jadi bisa digunakan \Magento\Quote\Api\CartRepositoryInterface.
Sama seperti di atas, masukkan instance kelas ini di kelas Anda:

protected $quoteRepository;

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

dan gunakan ini:

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

Jika Anda ingin melihat seperti apa kode itu, implementasinya \Magento\Quote\Api\CartRepositoryInterfaceadalah\Magento\Quote\Model\QuoteRepository

Marius
sumber
Hai @Marius, apakah ini akan berfungsi jika terjadi beberapa tampilan toko juga?
manini
Saya pikir ini akan berhasil
Marius
13

Pertama, Anda perlu menyuntikkan \Magento\Quote\Model\QuoteFactorykonstruktor kelas Anda:

protected $_quoteFactory;

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

Kemudian di kelas Anda, Anda dapat melakukan:

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

Di samping catatan Anda juga dapat menggunakan metode berikut untuk memuat penawaran:

  • loadActive($quoteId)di mana ia memuat kuotasi aktif yang sesuai (di mana is_active= 1)
  • loadByCustomerId($customerId) di mana ia memuat kutipan aktif yang sesuai dengan id pelanggan.

NB: Anda juga bisa menggunakan object manager secara langsung untuk melakukannya tetapi tidak disarankan :

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);
Raphael di Digital Pianism
sumber
1
\Magento\Quote\Model\Quoteadalah kelas yang tidak dapat disuntikkan. Maksud saya Anda bisa menyuntikkannya, tetapi itu bukan ide terbaik untuk melakukannya. Jika Anda menyuntikkan kelas ini dalam 2 kelas lain, Anda akan mendapatkannya sebagai singleton dalam wadah DI dan jika Anda memanggil loadsatu kali di salah satu kelas, Anda akan memilikinya "dimuat" di kelas Anda yang lain juga. Kemungkinan besar Anda tidak menginginkannya. Gunakan pabrik sebagai gantinya.
Marius
@Marius inilah yang terjadi ketika Anda mengerjakan proyek M1 dan M2 secara bersamaan. Anda cenderung mencampur semuanya. Terima kasih atas pencerahan dan +1 untuk solusi Anda, jelas cara yang tepat untuk pergi dengan kontrak layanan
Raphael di Digital Pianism
Alih-alih $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);Anda dapat menggunakan $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Untuk alasan yang sama disebutkan di atas. memanggil getOM akan menghasilkan singleton.
Marius
@Marius Saya menemukan bahwa getvs createlebih jelas daripada penggunaan lajang M1 tapi saya masih cenderung menyalahgunakan mereka
Raphael di Digital Pianism
Jangan khawatir. Pernah ke sana, melakukan itu. :)
Marius