Soweit ich weiß, erhält der Header-Minicart die Daten aus Kundendaten
Hersteller / Magento / Modul-Checkout / Ansicht / Frontend / Web / js / Ansicht / minicart.js
define([
'uiComponent',
'Magento_Customer/js/customer-data',
'jquery',
'ko',
'sidebar'
], function (Component, customerData, $, ko) {
'use strict';
......
this.cart = customerData.get('cart');
......
}
Schauen Sie in die Kundendaten js vendor/magento/module-customer/view/frontend/web/js/customer-data.js
, wir können die Kundendaten aus dem lokalen Speicher erhalten. Führen Sie beispielsweise in Ihrer Browserkonsole die Zeile aus : localStorage.getItem('mage-cache-storage')
, können wir auch die Warenkorbinformationen abrufen.
{
"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
}
],
.......
}
}
Navigieren Sie zu
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()
);
}
Um das SKU-Element zu erhalten, müssen wir meiner Meinung nach Daten hinzufügen getItemData()
(sollte es mit dem Plugin versuchen ). Und dann überschreiben Sie die Vorlage HTML vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html
<div class="product-item-details">
<!-- ko text: product_sku --><!-- /ko -->
Aktualisieren Sie die Magento 2.1.0-Version
In Magento 2.1.0 müssen Sie nur überschreiben default.html
. Dies liegt daran, dass die Methode doGetItemData
bereits die Produkt-SKU hat.
Magento\ConfigurableProduct\CustomerData\ConfigurableItem
und für gruppierte Produkte:Magento\GroupedProduct\CustomerData\GroupedItem
!-- ko text: product_sku --><!-- /ko -->
, die SKU wird für konfigurierbare Produkte angezeigt. Meine Magento-Version ist 2.1.5.Erstens eine sehr gute Erklärung von @Khoa TruongDinh über den Ablauf des Abrufens von Elementen in einer Minicart-Vorlage.
Ich habe einen Weg gefunden, wie Sie die Minicart-Vorlage mit benutzerdefinierten Attributen des Produkts erweitern können. Dazu müssen Sie zuerst vendor / magento / module-checkout / CustomerData / DefaultItem.php mit den DI-Einstellungen überschreiben
Erstellen Sie app / code / Vendor / Module / etc / di.xml, um das DefaultItem-Objekt zu überschreiben
Erstellen Sie dann ein neues Objekt, um die Methode doGetItemData () zu überschreiben, und fügen Sie custom_attribute mit dem Schlüssel product_custom_attribute hinzu
Datei: app / code / Vendor / Module / Preferences / MiniCartItem.php
Beachten Sie, dass ich spritze
auf die Konstruktmethode, da ich vollständige Produktdaten laden muss, um auf mein custom_attribute zuzugreifen. Wenn es einen besseren Weg gibt, sag es mir bitte.
Und schließlich können Sie das neue Attribut in anzeigen
quelle
'product_sku' => $this->item->getProduct()->getSku()
funktioniert, um den SKU einzuziehen. Obwohl ich den nicht brauche\Magento\Catalog\Model\Product $productModel
, um ihn zu greifen, werde ich ihn verwenden, um einige andere Produktinformationen zu erhalten. Ich habe endlich die Präferenz zum Laufen gebracht, also funktioniert deine Methode wie ein Zauber!$productModel
das Produkt mit allen Attributen laden und dann mit abrufen$this->helper
. Wenn es funktioniert, können Sie meine Antwort positiv bewerten.