Magento 2: Como carregar aspas por id de aspas


Respostas:


19

você pode injetar na sua classe uma instância de \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Então você pode usar:

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

Isso deve funcionar por enquanto, mas em breve o loadmétodo desaparecerá e você precisará usar um contrato de serviço.
Então você pode usar \Magento\Quote\Api\CartRepositoryInterface.
O mesmo que acima, injete uma instância desta classe em sua classe:

protected $quoteRepository;

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

e use isto:

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

Se você quiser ver como é o código, a implementação para \Magento\Quote\Api\CartRepositoryInterfaceé\Magento\Quote\Model\QuoteRepository


Olá @Marius, isso também funcionará no caso de várias visualizações da loja?
manini 16/07/2018

Eu acho que vai funcionar
Marius

13

Primeiro você precisa injetar um \Magento\Quote\Model\QuoteFactoryno construtor de sua classe:

protected $_quoteFactory;

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

Então, na sua turma, você pode fazer:

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

Em uma nota lateral, você também pode usar os seguintes métodos para carregar uma cotação:

  • loadActive($quoteId)onde carrega a cotação ativa correspondente (em que is_active= 1)
  • loadByCustomerId($customerId) onde ele carrega a cotação ativa correspondente ao ID do cliente.

Nota: você também pode usar o gerenciador de objetos diretamente para fazê-lo, mas não é recomendado :

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

11
\Magento\Quote\Model\Quoteé uma classe não injetável. Quero dizer, você pode injetar, mas não é a melhor ideia para fazê-lo. Se você injetar essa classe em outras 2 classes, você a receberá como um singleton no contêiner DI e se você ligar loaduma vez em uma das classes, também a terá "carregada" na outra classe. Muito provavelmente você não quer isso. Use fábricas em seu lugar.
Marius

@ Marius, aqui está o que acontece quando você está trabalhando em projetos M1 e M2 ao mesmo tempo. Você tende a misturar tudo. Obrigado pela enlight e um para a sua solução, definitivamente, o caminho certo para ir com contratos de serviços
Raphael em Digital pianismo

Em vez de $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);você pode usar $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);Pelo mesmo motivo indicado acima. chamar geto OM resultará em um singleton.
Marius

@Marius Acho que getvs createé mais óbvio do que o uso de singletons de M1 mas eu ainda tendem a abusar deles
Raphael em Digital pianismo

Não se preocupe. Estive lá, fiz isso. :)
Marius
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.