Magento 2 - ¿Cómo obtener todos los artículos en el carrito?

23

En la página de pago ( chekout/cart) quiero editar el destino de la URL del botón de pago basado en los artículos del carrito ( link.phtml).

¿Cómo puedo obtener todos los artículos en el carrito? Quiero hacer esto sin usar la API. Gracias.

lalokuyo
fuente

Respuestas:

26

Contestaré la pregunta en dos partes:

I. ¿Dónde debe cambiar la URL de pago?

El destino en link.phtmles $block->getCheckoutUrl(). No debe cambiar la plantilla para cambiar la funcionalidad, sino cambiar el bloque en su Magento\Checkout\Block\Onepage\Linklugar. Para hacerlo, cree un complemento con un método afterGetCheckoutUrl()para cambiar el valor de retorno.

II ¿Cómo obtener todos los artículos en el carrito?

A partir de los contratos de servicio en Magento_Checkout y Magento_Quote todavía no proporcionan los métodos necesarios, por lo que utilizamos el modelo de carrito. Inyecte su plugin así:

public function __construct(\Magento\Checkout\Model\Cart $cart)
{
    $this->cart = $cart;
}

Ahora que tiene acceso al carrito, puede recuperar los artículos de varias maneras, que es básicamente lo mismo que en Magento 1 :

  • $this->cart->getQuote()->getItemsCollection()

    Devuelve una colección de artículos de cotización con todos los artículos asociados a la cotización actual.

  • $this->cart->getItems()

    Este es un acceso directo para el método anterior, pero si no hay comillas, devuelve una matriz vacía, por lo que no puede confiar en obtener una instancia de colección.

  • $this->cart->getQuote()->getAllItems()

    Carga la colección de elementos, luego devuelve una matriz de todos los elementos que no están marcados como eliminados (es decir, se han eliminado en la solicitud actual).

  • $this->cart->getQuote()->getAllVisibleItems()

    Carga la colección de elementos, luego devuelve una matriz de todos los elementos que no están marcados como eliminados Y no tienen un elemento primario (es decir, obtiene elementos para productos agrupados y configurables pero no sus elementos secundarios asociados). Cada elemento de la matriz corresponde a una fila mostrada en la página del carrito.

Elija lo que mejor se adapte a sus necesidades. En la mayoría de los casos, el último método es lo que necesita.

Fabian Schmengler
fuente
utilizando el modelo y el método del carrito, ¿obtiene AllItems()o getAllVisibleItems()devolverá todos los artículos en todos los carritos de cualquier persona que visite la tienda de todos los modelos de cotizaciones activos? ¿O solo uno de mi carrito (apuesto por esto prefiero usar el objeto de sesión de pago y obtener el objeto qutoe de él)? La diferencia es importante, porque quería usar la sesión de pago en la clase de bloque, pero en realidad qutoe está vacío cuando ingreso al bloque.
Bartosz Kubicki
Siempre es solo el carrito de la sesión actual.
Fabian Schmengler
¿Y cómo obtener la categoría de bienes?
Рома Лытарь
21

El uso de Magento \ Checkout \ Model \ Cart está en desuso.

Debe usar la sesión para obtener el presupuesto y los artículos de su carrito.

use Magento\Checkout\Model\Session;

public function __construct(
        ...
        Session $session
        ...
    ) {
        ...
        $this->_session = $session;
        ...
    }

public function yourFunction()
{
    $items = $this->_session->getQuote()->getAllVisibleItems();
}

Estoy seguro de que Magento pronto agregará algún tipo de repositorio para la sesión.

Por lo que puedo decir, no puedes obtener la cotización actual usando Magento \ Quote \ Api \ CartRepositoryInterface o Magento \ Quote \ Api \ CartManagementInterface, sin embargo, si tienes la ID de cliente, puedes usar cualquiera de esos dos para cargue la cotización (que imagino es la forma en que Magento quiere que lo haga) y desde allí obtenga cotizaciones / artículos de carrito.

CartManagementInterface getCartForCustomer($customerId)
CartRepositoryInterface getForCustomer($customerId)
Franco
fuente
44
Creo que la forma correcta es usar la sesión de pago ahora Magento\Checkout\Model\Session::getQuote().
Giel Berkers
10
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
 $cart = $objectManager->get('\Magento\Checkout\Model\Cart'); 

// retrieve quote items collection
$itemsCollection = $cart->getQuote()->getItemsCollection();

// get array of all items what can be display directly
$itemsVisible = $cart->getQuote()->getAllVisibleItems();

// retrieve quote items array
 $items = $cart->getQuote()->getAllItems();

foreach($items as $item) {
     echo 'ID: '.$item->getProductId().'<br />';
      echo 'Name: '.$item->getName().'<br />';
       echo 'Sku: '.$item->getSku().'<br />';
       echo 'Quantity: '.$item->getQty().'<br />';
      echo 'Price: '.$item->getPrice().'<br />';
    echo "<br />";            
  }
Rahul Katoch
fuente
¿Y cómo obtener la categoría de bienes?
Рома Лытарь
0

En versiones más recientes, puede usar la API:

public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
    $this->cart = $cart;
}
diazwatson
fuente