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.
Contestaré la pregunta en dos partes:
El destino en link.phtml
es $block->getCheckoutUrl()
. No debe cambiar la plantilla para cambiar la funcionalidad, sino cambiar el bloque en su Magento\Checkout\Block\Onepage\Link
lugar. Para hacerlo, cree un complemento con un método afterGetCheckoutUrl()
para cambiar el valor de retorno.
A partir de magento-2.0, 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.
AllItems()
ogetAllVisibleItems()
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.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.
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.
fuente
Magento\Checkout\Model\Session::getQuote()
.fuente
En versiones más recientes, puede usar la API:
fuente