Respuestas:
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.
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)
Magento\Checkout\Model\Session::getQuote()
.
$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 />";
}
En versiones más recientes, puede usar la API:
public function __construct(\Magento\Checkout\Model\Cart\CartInterface $cart)
{
$this->cart = $cart;
}
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.