Magento 2: So laden Sie Zitat für Zitat-ID

12

Wie kann ich ein Angebot in Magento 2 anhand der Angebots-ID laden ?

Krupali
quelle

Antworten:

19

Sie können in Ihre Klasse eine Instanz von injizieren \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Dann können Sie verwenden:

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

Dies sollte vorerst funktionieren, aber bald wird die loadMethode verschwinden und Sie müssen einen Servicevertrag verwenden.
So können Sie verwenden \Magento\Quote\Api\CartRepositoryInterface.
Fügen Sie wie oben eine Instanz dieser Klasse in Ihre Klasse ein:

protected $quoteRepository;

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

und benutze dies:

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

Wenn Sie sehen möchten, wie der Code aussieht, \Magento\Quote\Api\CartRepositoryInterfacelautet die Implementierung für\Magento\Quote\Model\QuoteRepository

Marius
quelle
Hallo @Marius, funktioniert dies auch bei mehreren Store-Ansichten?
Manini
Ich denke, es wird funktionieren
Marius
13

Zuerst müssen Sie ein \Magento\Quote\Model\QuoteFactoryin Ihren Klassenkonstruktor einfügen:

protected $_quoteFactory;

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

Dann können Sie in Ihrer Klasse Folgendes tun:

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

Nebenbei bemerkt können Sie auch die folgenden Methoden verwenden, um ein Angebot zu laden:

  • loadActive($quoteId)wo es das entsprechende aktive Anführungszeichen lädt (wobei is_active= 1)
  • loadByCustomerId($customerId) Dort wird das aktive Angebot geladen, das der Kunden-ID entspricht.

NB: Sie können den Objektmanager auch direkt verwenden, dies wird jedoch nicht empfohlen :

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);
Raphael beim digitalen Pianismus
quelle
1
\Magento\Quote\Model\Quoteist eine nicht injizierbare Klasse. Ich meine, Sie können es injizieren, aber es ist nicht die beste Idee, dies zu tun. Wenn Sie diese Klasse in zwei andere Klassen einfügen, erhalten Sie sie als Singleton im DI-Container. Wenn Sie sie loadeinmal in einer der Klassen aufrufen , wird sie auch in Ihrer anderen Klasse "geladen". Höchstwahrscheinlich willst du das nicht. Verwenden Sie stattdessen Fabriken.
Marius
@Marius Folgendes passiert, wenn Sie gleichzeitig an M1- und M2-Projekten arbeiten. Sie neigen dazu, alles zu verwechseln. Vielen Dank für das Enlight und +1 für Ihre Lösung, definitiv der richtige Weg für Serviceverträge
Raphael bei Digital Pianism
Anstelle von $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);können $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Sie aus dem gleichen Grund wie oben angegeben verwenden. Das Aufrufen getdes OM führt zu einem Singleton.
Marius
@Marius Ich finde, dass getvs createoffensichtlicher ist als die Verwendung von Singletons von M1, aber ich neige immer noch dazu, sie zu missbrauchen
Raphael bei Digital Pianism
Mach dir keine Sorgen. Kenne ich schon. :)
Marius