Hasta donde yo sé, el minicart de encabezado obtendrá los datos de los datos del cliente
vendor / magento / module-checkout / view / frontend / web / js / view / minicart.js
define([
'uiComponent',
'Magento_Customer/js/customer-data',
'jquery',
'ko',
'sidebar'
], function (Component, customerData, $, ko) {
'use strict';
......
this.cart = customerData.get('cart');
......
}
Mire los datos del cliente js vendor/magento/module-customer/view/frontend/web/js/customer-data.js
, podemos obtener los datos del cliente del almacenamiento local. Por ejemplo, en la consola de su navegador, ejecute la línea: localStorage.getItem('mage-cache-storage')
también podemos obtener la información del carrito.
{
"cart": {
"summary_count": 1,
....
"items": [
{
......
"qty": 1,
"item_id": "11728",
"configure_url": "http://magento2-demo/checkout/cart/configure/id/11728/product_id/1817/",
"is_visible_in_site_visibility": true,
"product_name": "Breathe-Easy Tank",
"product_url": "http://magento2-demo/breathe-easy-tank.html",
"product_has_url": true,
"canApplyMsrp": false
}
],
.......
}
}
Navegue a
vendor / magento / module-checkout / CustomerData / DefaultItem.php
protected function doGetItemData()
{
.......
return [
'options' => $this->getOptionList(),
'qty' => $this->item->getQty() * 1,
'item_id' => $this->item->getId(),
'configure_url' => $this->getConfigureUrl(),
'is_visible_in_site_visibility' => $this->item->getProduct()->isVisibleInSiteVisibility(),
'product_name' => $this->item->getProduct()->getName(),
'product_url' => $this->getProductUrl(),
'product_has_url' => $this->hasProductUrl(),
.....
}
vendor / magento / module-checkout / CustomerData / AbstractItem.php
/**
* {@inheritdoc}
*/
public function getItemData(Item $item)
{
$this->item = $item;
return \array_merge(
['product_type' => $item->getProductType()],
$this->doGetItemData()
);
}
Para obtener el elemento SKU, creo que necesitamos agregar datos a getItemData()
(Debería intentarlo con el complemento ). Y luego anular la plantilla html vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html
<div class="product-item-details">
<!-- ko text: product_sku --><!-- /ko -->
Actualización de la versión Magento 2.1.0
En Magento 2.1.0, solo necesita anular default.html
. Esto se debe a que el método doGetItemData
ya tiene el producto sku.
Magento\ConfigurableProduct\CustomerData\ConfigurableItem
y para productos agrupados:Magento\GroupedProduct\CustomerData\GroupedItem
!-- ko text: product_sku --><!-- /ko -->
, el sku se mostrará para el producto configurable. Mi versión de Magento es 2.1.5.En primer lugar, una muy buena explicación de @Khoa TruongDinh sobre el flujo de obtener el elemento en la plantilla de minicart.
Encontré una manera de extender la plantilla de minicart con atributos personalizados del producto. Para hacer eso primero, debe anular vendor / magento / module-checkout / CustomerData / DefaultItem.php con DI Preferences
Crear aplicación / código / Proveedor / Módulo / etc / di.xml para anular el objeto DefaultItem
Luego, cree un nuevo objeto para anular el método doGetItemData () y agregue custom_attribute con la clave product_custom_attribute
Archivo: app / code / Vendor / Module / Preferences / MiniCartItem.php
Note que estoy inyectando
al método de construcción porque necesito cargar datos completos del producto para acceder a mi atributo personalizado. Si hay una mejor manera, por favor dígame.
Y finalmente puede mostrar el nuevo atributo en
fuente
'product_sku' => $this->item->getProduct()->getSku()
funciona para extraer el sku, por lo que, aunque no necesito\Magento\Catalog\Model\Product $productModel
usarlo, lo usaré para obtener otra información del producto. Finalmente conseguí la preferencia en funcionamiento, ¡así que su método funciona de maravilla!$productModel
cargar el producto con todos los atributos y luego recuperarlos$this->helper
. Si funciona, puedes votar mi respuesta.