Réponses:
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 load
mé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\CartRepositoryInterface
est\Magento\Quote\Model\QuoteRepository
Vous devez d'abord injecter un \Magento\Quote\Model\QuoteFactory
dans 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')->loadByIdWithoutStore($quoteId);
\Magento\Quote\Model\Quote
est 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 load
une 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.
$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.
get
vs create
est plus évident que l'utilisation de singletons de M1 mais j'ai toujours tendance à en abuser