Magento 2: Comment charger un devis par identifiant de devis


Réponses:


19

vous pouvez injecter dans votre classe une instance de \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Ensuite, vous pouvez utiliser:

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

Cela devrait fonctionner pour l'instant, mais bientôt, la loadméthode va disparaître et vous devez utiliser un contrat de service.
Vous pouvez donc utiliser \Magento\Quote\Api\CartRepositoryInterface.
Comme ci-dessus, injectez une instance de cette classe dans votre classe:

protected $quoteRepository;

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

et utilisez ceci:

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

Si vous voulez voir à quoi ressemble le code, l'implémentation de \Magento\Quote\Api\CartRepositoryInterfaceest\Magento\Quote\Model\QuoteRepository


Bonjour @Marius, cela fonctionnera-t-il également en cas de vues de plusieurs magasins?
manini

Je pense que ça va marcher
Marius

13

Vous devez d'abord injecter un \Magento\Quote\Model\QuoteFactorydans votre constructeur de classe:

protected $_quoteFactory;

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

Ensuite, dans votre classe, vous pouvez faire:

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

En passant, vous pouvez également utiliser les méthodes suivantes pour charger un devis:

  • loadActive($quoteId)où il charge le devis actif correspondant (où is_active= 1)
  • loadByCustomerId($customerId) où il charge le devis actif correspondant à l'identifiant client.

NB: vous pouvez également utiliser le gestionnaire d'objets directement pour le faire mais ce n'est pas recommandé :

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

1
\Magento\Quote\Model\Quoteest une classe non injectable. Je veux dire que vous pouvez l'injecter, mais ce n'est pas la meilleure idée de le faire. Si vous injectez cette classe dans 2 autres classes, vous l'obtiendrez en tant que singleton dans le conteneur DI et si vous appelez loadune fois dans l'une des classes, vous l'aurez également "chargée" dans votre autre classe. Vous ne voulez probablement pas cela. Utilisez plutôt des usines.
Marius

@Marius, voici ce qui se passe lorsque vous travaillez simultanément sur des projets M1 et M2. Vous avez tendance à tout mélanger. Merci pour l'illumination et +1 pour votre solution, certainement la bonne façon de procéder avec les contrats de service
Raphael au Digital Pianism

Au lieu de $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);vous pouvez utiliser $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);pour la même raison indiquée ci-dessus. faire appel getà l'OM se traduira par un singleton.
Marius

@Marius, je trouve que getvs createest plus évident que l'utilisation de singletons de M1 mais j'ai toujours tendance à en abuser
Raphael au Digital Pianism

Ne t'inquiète pas. J'y suis allé, j'ai fait ça. :)
Marius
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.