Umieszczenie SKU produktu w mini-wózku nagłówka

10

Chcę móc wyświetlać produkt SKUw mini-koszyku strony Magento 2. Ale nie jestem pewien, jak użyć, KnockoutJSaby pobrać dodatkowe informacje o produkcie. Wywoływany szablon znajduje się tutaj:

vendor / magento / module-checkout / view / frontend / web / template / minicart / item / default.html

I zawiera kod taki jak:

<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>

Moje bezpośrednie pytanie brzmiałoby: gdzie są wartości zestawu produktów i jak mogę je zmieniać, aby dodać lub usunąć szczegóły produktu?

circlesix
źródło

Odpowiedzi:

12

O ile mi wiadomo, minicart nagłówka pobierze dane z danych klientów

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');
    ......
}

Spójrz na dane klienta js vendor/magento/module-customer/view/frontend/web/js/customer-data.js, możemy uzyskać dane klienta z lokalnego magazynu. Na przykład w konsoli przeglądarki uruchom wiersz: localStorage.getItem('mage-cache-storage')możemy również uzyskać informacje o koszyku. wprowadź opis zdjęcia tutaj

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

Przejdź do dostawcy / 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()
    );
}

Aby uzyskać element SKU, myślę, że musimy dodać dane do getItemData()(należy spróbować z wtyczką ). A następnie zastąp szablon HTML vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html

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

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

Zaktualizuj wersję Magento 2.1.0

W Magento 2.1.0 wystarczy tylko przesłonić default.html. Wynika to z tego, że metoda doGetItemDatama już SKU produktu.

Khoa TruongDinh
źródło
Dziękuję Ci! Wypełniono tonę „hows” tego pytania!
circlesix
@Khoa TruongDinh dzięki za świetną odpowiedź. To działa idealnie. Czy możesz mi powiedzieć, jak możemy to zrobić w sekcji podsumowania płatności. Znalazłem dużo, ale nie mogę znaleźć lokalizacji, w której mogę dodać nowy atrybut zamiast nazwy w podsumowaniu kasy.
Rohit Goel
1
Bądź ostrożny, jeśli masz produktów konfigurowalne, trzeba zastąpić tej klasy także: Magento\ConfigurableProduct\CustomerData\ConfigurableItemi zgrupowane produktu:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier
@FranckGarnier Właśnie sprawdziłem, czy nie musimy przesłonić tych klas. Dodaj tylko !-- ko text: product_sku --><!-- /ko -->, że SKU pokaże konfigurowalny produkt. Moja wersja Magento to 2.1.5.
Khoa TruongDinh
1
Odpowiedni dla product_sku, ale jeśli potrzebujesz dodać dodatkowe informacje, których nie ma natywnie, uważaj na te klasy, spróbuj zamiast tego użyć wtyczek.
Franck Garnier
7

Po pierwsze, bardzo dobre wyjaśnienie @Khoa TruongDinh na temat przepływu zdobywania przedmiotu w szablonie minicart.

jak mogę je zmienić, aby dodać lub usunąć szczegóły produktu?

Znalazłem sposób na rozszerzenie szablonu minicart o niestandardowe atrybuty produktu. Aby to zrobić, musisz przesłonić dostawcy / magento / module-checkout / CustomerData / DefaultItem.php z preferencjami DI

Utwórz app / code / Vendor / Module / etc / di.xml ot override DefaultItem object

<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>

Następnie utwórz nowy obiekt, aby przesłonić metodę doGetItemData () i dodaj atrybut niestandardowy za pomocą klucza product_custom_attribute

Plik: app / code / Vendor / Module / Preferences / 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()),
        ];
    }
}

Zauważ, że wstrzykiwam

\ Magento \ Catalog \ Model \ Product $ productModel

do metody konstruowania, ponieważ muszę załadować pełne dane produktu, aby uzyskać dostęp do mojego atrybutu custom_attribute. Jeśli istnieje lepszy sposób, proszę o informację.

I wreszcie możesz wyświetlić nowy atrybut w

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

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

                    <!-- ko text: product_custom_attribute --><!-- /ko -->
Miroslav Petroff
źródło
Używanie 'product_sku' => $this->item->getProduct()->getSku()działa, aby pobrać SKU, więc chociaż nie muszę \Magento\Catalog\Model\Product $productModelgo chwytać, użyję go, aby pobrać inne informacje o produkcie. W końcu uruchomiłem preferencje, więc twoja metoda działa jak urok!
circlesix
1
W przypadku atrybutów niestandardowych należy $productModelzaładować produkt ze wszystkimi atrybutami, a następnie pobrać je za pomocą $this->helper. Jeśli to działa, możesz głosować za moją odpowiedzią.
Miroslav Petroff
1
Tak zrobiłem, a oni pozwolili mi zagłosować tylko raz. Gdybym mógł oznaczyć twoją odpowiedź tak samo dobrze, jak odpowiedź Khoi, zrobiłbym to. Prześlę się i sprawdzę, czy możemy uzyskać dla ciebie więcej głosów, ponieważ jeszcze nie widziałem, aby ktokolwiek odpowiedział na ten problem gdziekolwiek indziej, a ten wybija go z parku.
circlesix