Magento 2: Как загрузить цитату по идентификатору цитаты

Ответы:

19

Вы можете добавить в свой класс экземпляр \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Тогда вы можете использовать:

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

Пока это должно работать, но скоро loadметод уйдет, и вам нужно будет заключить договор на обслуживание.
Так что вы можете использовать \Magento\Quote\Api\CartRepositoryInterface.
То же, что и выше, добавить экземпляр этого класса в ваш класс:

protected $quoteRepository;

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

и используйте это:

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

Если вы хотите увидеть , как выглядит код, реализация для \Magento\Quote\Api\CartRepositoryInterfaceIS\Magento\Quote\Model\QuoteRepository

Мариус
источник
Привет @Marus, это будет работать в случае нескольких просмотров магазина?
Манини
Я думаю, что это сработает
Мариус
13

Сначала вам нужно добавить \Magento\Quote\Model\QuoteFactoryв конструктор вашего класса:

protected $_quoteFactory;

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

Тогда в вашем классе вы можете сделать:

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

Кроме того, вы можете использовать следующие методы для загрузки цитаты:

  • loadActive($quoteId)куда он загружает соответствующую активную цитату (где is_active= 1)
  • loadByCustomerId($customerId) где он загружает активную квоту, соответствующую идентификатору клиента.

NB: вы также можете напрямую использовать диспетчер объектов, но это не рекомендуется :

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);
Рафаэль в цифровом пианизме
источник
1
\Magento\Quote\Model\Quoteэто неинъекционный класс. Я имею в виду, что вы можете сделать это, но это не лучшая идея. Если вы внедрите этот класс в 2 других класса, вы получите его как одиночный объект в контейнере DI, и если вы вызовете loadодин раз в одном из классов, он будет «загружен» и в ваш другой класс. Скорее всего, вы этого не хотите. Вместо этого используйте фабрики.
Мариус
@Marius, вот что происходит, когда вы работаете над проектами M1 и M2 одновременно. Вы склонны все путать. Спасибо за освещение и +1 за ваше решение, безусловно, правильный путь к заключению контрактов на обслуживание
Рафаэль на Digital Pianism
Вместо этого $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);вы можете использовать по $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);той же причине, указанной выше. вызов getОМ приведет к одиночке.
Мариус
@Marus Я считаю, что getпротив createболее очевидна, чем использование синглетонов M1, но я все еще склонен злоупотреблять ими
Рафаэль на Digital Pianism
Не беспокойся Был там, сделал это. :)
Мариус