Ottenere lo SKU del prodotto nel mini-carrello dell'intestazione


10

Voglio essere in grado di visualizzare il prodotto SKUnel mini-carrello di un sito Magento 2. Ma non sono sicuro di come utilizzare KnockoutJSper ottenere ulteriori informazioni sul prodotto. Il modello che viene chiamato è qui:

vendor / Magento / module-out / view / frontend / web / template / minicart / item / default.html

E contiene codice come:

<strong class="product-item-name">
    <!-- ko if: product_has_url -->
    <a data-bind="attr: {href: product_url}, text: product_name"></a>
    <!-- /ko -->
    <!-- ko ifnot: product_has_url -->
        <!-- ko text: product_name --><!-- /ko -->
    <!-- /ko -->
</strong>

Quindi la mia domanda diretta sarebbe: dove sono i valori per il set di prodotti e come posso cambiarli per aggiungere o rimuovere i dettagli del prodotto?

Risposte:


12

Per quanto ne so, la minicart dell'intestazione otterrà i dati dai dati dei clienti

vendor / magento / module-out / view / frontend / web / js / vista / minicart.js

define([
    'uiComponent',
    'Magento_Customer/js/customer-data',
    'jquery',
    'ko',
    'sidebar'
], function (Component, customerData, $, ko) {
    'use strict';
    ......
    this.cart = customerData.get('cart');
    ......
}

Esaminare i dati dei clienti js vendor/magento/module-customer/view/frontend/web/js/customer-data.js, possiamo ottenere i dati dei clienti dalla memoria locale. Ad esempio, nella tua console del browser, esegui la riga:, localStorage.getItem('mage-cache-storage')possiamo anche ottenere le informazioni del carrello. inserisci qui la descrizione dell'immagine

{
  "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
      }
    ],
    .......
  }
}

Vai 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-out / CustomerData / AbstractItem.php

/**
 * {@inheritdoc}
 */
public function getItemData(Item $item)
{
    $this->item = $item;
    return \array_merge(
        ['product_type' => $item->getProductType()],
        $this->doGetItemData()
    );
}

Per ottenere l'elemento SKU, penso che dobbiamo aggiungere dati a getItemData()(Dovrei provare con il plugin ). E quindi sovrascrivere il modello html vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html

 <div class="product-item-details">

                    <!-- ko text: product_sku --><!-- /ko -->

Aggiorna la versione Magento 2.1.0

In Magento 2.1.0, devi solo eseguire l'override default.html. Questo perché il metodo doGetItemDataha già lo sku di prodotto.


Grazie! Riempito una tonnellata di "come" su questa domanda!
cerchi il

@Khoa TruongDinh grazie per l'ottima risposta. Funziona perfettamente. Potete per favore dirmi come possiamo fare lo stesso nella sezione di riepilogo del checkout. Ho trovato molto, ma non riesco a trovare una posizione in cui aggiungere il nuovo attributo anziché il nome nel riepilogo del checkout.
Rohit Goel,

1
Fai attenzione, se hai prodotti configurabili, devi scavalcare anche questa classe: Magento\ConfigurableProduct\CustomerData\ConfigurableIteme per i prodotti raggruppati:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier

@FranckGarnier Ho appena verificato che non abbiamo bisogno di scavalcare queste classi. Aggiungi solo !-- ko text: product_sku --><!-- /ko -->, lo sku mostrerà il prodotto configurabile. La mia versione di Magento è 2.1.5.
Khoa TruongDinh

1
Adatto a product_sku, ma se hai bisogno di aggiungere informazioni extra non presenti in modo nativo, fai attenzione a queste classi, prova invece a usare i plugin.
Franck Garnier,

7

Innanzitutto, un'ottima spiegazione di @Khoa TruongDinh sul flusso di acquisizione degli oggetti nel modello di minicart.

come posso cambiarli per aggiungere o rimuovere i dettagli del prodotto?

Ho trovato un modo per estendere il modello di minicart con attributi personalizzati del prodotto. Per farlo, devi prima sostituire fornitore / magento / module-checkout / CustomerData / DefaultItem.php con le preferenze DI

Crea app / codice / fornitore / modulo / etc / di.xml o sovrascrivi l'oggetto DefaultItem

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Checkout\CustomerData\DefaultItem" type="Vendor\Module\Preferences\MiniCartItem" />
</config>

Quindi creare un nuovo oggetto per sovrascrivere il metodo doGetItemData () e aggiungere custom_attribute con la chiave product_custom_attribute

File: app / codice / fornitore / modulo / preferenze / MiniCartItem.php

namespace Vendor\Module\Preferences;

class MiniCartItem extends \Magento\Checkout\CustomerData\DefaultItem
{

    public function __construct(
        \Magento\Catalog\Helper\Image $imageHelper,
        \Magento\Msrp\Helper\Data $msrpHelper,
        \Magento\Framework\UrlInterface $urlBuilder,
        \Magento\Catalog\Helper\Product\ConfigurationPool $configurationPool,
        \Magento\Checkout\Helper\Data $checkoutHelper,
        \Magento\Catalog\Helper\Output $helper,
        \Magento\Catalog\Model\Product $productModel
    ) {
        $this->configurationPool = $configurationPool;
        $this->imageHelper = $imageHelper;
        $this->msrpHelper = $msrpHelper;
        $this->urlBuilder = $urlBuilder;
        $this->checkoutHelper = $checkoutHelper;
        $this->helper = $helper;
        $this->productModel = $productModel;
    }

    /**
     * {@inheritdoc}
     */
    protected function doGetItemData()
    {
        $imageHelper = $this->imageHelper->init($this->getProductForThumbnail(), 'mini_cart_product_thumbnail');
        $product = $this->productModel->load($this->item->getProduct()->getId());
        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(),
            'product_price' => $this->checkoutHelper->formatPrice($this->item->getCalculationPrice()),
            'product_image' => [
                'src' => $imageHelper->getUrl(),
                'alt' => $imageHelper->getLabel(),
                'width' => $imageHelper->getWidth(),
                'height' => $imageHelper->getHeight(),
            ],
            'product_custom_attribute' => $this->helper->productAttribute($product, $product->getCustomAttribute(), 'custom_attribute'),
            'canApplyMsrp' => $this->msrpHelper->isShowBeforeOrderConfirm($this->item->getProduct())
                && $this->msrpHelper->isMinimalPriceLessMsrp($this->item->getProduct()),
        ];
    }
}

Si noti che sto iniettando

\ Magento \ Catalog \ Model \ Product $ productModel

al metodo di costruzione perché devo caricare i dati completi del prodotto per accedere al mio custom_attribute. Se c'è un modo migliore, per favore, dimmelo.

E infine puoi visualizzare il nuovo attributo in

view / frontend / web / template / minicart / item / default.html:

 <div class="product-item-details">

                    <!-- ko text: product_custom_attribute --><!-- /ko -->

Usare 'product_sku' => $this->item->getProduct()->getSku()funziona per attirare lo sku, quindi mentre non ho bisogno \Magento\Catalog\Model\Product $productModeldi afferrarlo, lo userò per prendere altre informazioni sul prodotto. Finalmente ho avuto la preferenza attiva e funzionante, quindi il tuo metodo funziona come un incantesimo!
cerchi il

1
Per gli attributi personalizzati è necessario $productModelcaricare il prodotto con tutti gli attributi e quindi recuperarli con $this->helper. Se funziona puoi votare la mia risposta.
Miroslav Petroff,

1
L'ho fatto e mi hanno permesso di votare una sola volta. Se potessi contrassegnare la tua risposta come corretta e Khoa lo farei. Pubblicherò in giro e vedrò se possiamo ottenere più voti per te, poiché devo ancora vedere nessuno rispondere a questo problema in qualsiasi altro luogo e questo lo mette fuori gioco.
cerchi il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.