Magento 2: Comment charger un devis par identifiant de devis

12

Comment puis-je charger un devis dans magento 2 par identifiant de devis ?

Krupali
la source

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

Marius
la source
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);
Raphael chez Digital Pianism
la source
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