Magento 2: Come caricare un preventivo per ID preventivo


Risposte:


19

puoi inserire nella tua classe un'istanza di \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Quindi puoi usare:

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

Questo dovrebbe funzionare per ora, ma presto il loadmetodo sparirà e sarà necessario utilizzare un contratto di assistenza.
Quindi puoi usare \Magento\Quote\Api\CartRepositoryInterface.
Come sopra, iniettare un'istanza di questa classe nella tua classe:

protected $quoteRepository;

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

e usa questo:

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

Se vuoi vedere come appare il codice, l'implementazione \Magento\Quote\Api\CartRepositoryInterfaceè\Magento\Quote\Model\QuoteRepository


Ciao @Marius, funzionerà anche in caso di più punti vendita?
Manini,

Penso che funzionerà
Marius

13

Per prima cosa devi iniettare a \Magento\Quote\Model\QuoteFactorynel costruttore della tua classe:

protected $_quoteFactory;

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

Quindi nella tua classe puoi fare:

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

In una nota a margine puoi anche usare i seguenti metodi per caricare un preventivo:

  • loadActive($quoteId)dove carica la quota attiva corrispondente (dove is_active= 1)
  • loadByCustomerId($customerId) dove carica il preventivo attivo corrispondente all'ID cliente.

NB: puoi anche usare direttamente il gestore oggetti per farlo ma non è raccomandato :

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

1
\Magento\Quote\Model\Quoteè una classe non iniettabile. Voglio dire che puoi iniettarlo, ma non è l'idea migliore per farlo. Se inietti questa classe in altre 2 classi, la otterrai come singleton nel contenitore DI e se chiami loaduna volta in una delle classi, la avrai "caricata" anche nell'altra classe. Molto probabilmente non lo vuoi. Usa invece le fabbriche.
Marius

@Marius ecco cosa succede quando lavori su progetti M1 e M2 contemporaneamente. Tendi a confondere tutto. Grazie per l'illuminazione e +1 per la tua soluzione, sicuramente la strada giusta da percorrere con i contratti di servizio
Raffaello al Pianismo digitale,

Invece di $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);te puoi usare $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Per lo stesso motivo indicato sopra. chiamando getl'OM risulterà un singleton.
Marius

@Marius Trovo che il getvs createsia più ovvio dell'uso dei singoli di M1 ma tendo ancora ad
abusarli

Non ti preoccupare. Ci sono stato, l'ho fatto. :)
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.