Magento 2: Cómo cargar presupuesto por ID de presupuesto

Respuestas:

19

puedes inyectar en tu clase una instancia de \Magento\Quote\Model\QuoteFactory.

protected $quoteFactory;

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

Entonces puedes usar:

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

Esto debería funcionar por ahora, pero pronto, el loadmétodo desaparecerá y deberá usar un contrato de servicio.
Entonces puedes usar \Magento\Quote\Api\CartRepositoryInterface.
Igual que el anterior, inyecte una instancia de esta clase en su clase:

protected $quoteRepository;

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

y usa esto:

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

Si desea ver cómo se ve el código, la implementación \Magento\Quote\Api\CartRepositoryInterfacees\Magento\Quote\Model\QuoteRepository

Marius
fuente
Hola @Marius, ¿funcionará esto también en el caso de varias visitas a la tienda?
manini
Creo que funcionará
Marius
13

Primero debes inyectar un \Magento\Quote\Model\QuoteFactoryen el constructor de tu clase:

protected $_quoteFactory;

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

Luego en tu clase puedes hacer:

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

En una nota al margen, también puede usar los siguientes métodos para cargar una cotización:

  • loadActive($quoteId)donde carga la cotización activa correspondiente (donde is_active= 1)
  • loadByCustomerId($customerId) donde carga la cotización activa correspondiente a la identificación del cliente.

NB: también puede usar el administrador de objetos directamente para hacerlo, pero no se recomienda :

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);
Raphael en Digital Pianism
fuente
1
\Magento\Quote\Model\QuoteEs una clase no inyectable. Quiero decir que puedes inyectarlo, pero no es la mejor idea hacerlo. Si inyecta esta clase en otras 2 clases, la obtendrá como un singleton en el contenedor DI y si llama loaduna vez en una de las clases, también la tendrá "cargada" en su otra clase. Lo más probable es que no quieras eso. Use fábricas en su lugar.
Marius
@Marius, esto es lo que sucede cuando trabajas en proyectos M1 y M2 al mismo tiempo. Tiendes a mezclar todo. Gracias por la luz y +1 por su solución, definitivamente la forma correcta de ir con los contratos de servicio
Raphael en Digital Pianism
En lugar de $this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);usted puede usarlo $this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);por la misma razón indicada anteriormente. llamar getal OM dará como resultado un singleton.
Marius
@Marius Me parece que getvs createes más obvio que el uso de singletons de M1, pero todavía tiendo a usarlos mal
Raphael en Digital Pianism
No te preocupes He estado allí, hecho eso. :)
Marius