Colocando o SKU do produto no minicarrinho do cabeçalho

10

Quero poder exibir o produto SKUno minicarrinho de um site Magento 2. Mas não tenho certeza de como usar KnockoutJSpara obter informações adicionais sobre o produto. O modelo que está sendo chamado está aqui:

fornecedor / magento / check-out do módulo / view / frontend / web / template / minicart / item / default.html

E contém código como:

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

Portanto, minha pergunta direta seria: onde estão os valores para o conjunto de produtos e como posso alterá-los para adicionar ou remover detalhes do produto?

círculos
fonte

Respostas:

12

Até onde eu sei, o minicart do cabeçalho obterá os dados dos dados do cliente

fornecedor / magento / check-out do módulo / 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');
    ......
}

Olhe para os dados do cliente js vendor/magento/module-customer/view/frontend/web/js/customer-data.js, podemos obter os dados do cliente a partir do armazenamento local. Por exemplo, no console do navegador, execute a linha localStorage.getItem('mage-cache-storage'):, também podemos obter as informações do carrinho. insira a descrição da imagem aqui

{
  "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 para vendor / magento / check-module / 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(),
           .....
    }

fornecedor / magento / check-out do módulo / CustomerData / AbstractItem.php

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

Para obter o item SKU, acho que precisamos adicionar dados a getItemData()(deve tentar com o plug-in ). E, em seguida, substitua o modelo html vendor/magento/module-checkout/view/frontend/web/template/minicart/item/default.html

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

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

Update Magento 2.1.0 version

No Magento 2.1.0, você só precisa substituir default.html. Isso ocorre porque o método doGetItemDatajá possui o sku do produto.

Khoa TruongDinh
fonte
Obrigado! Preenchido em uma tonelada de 'hows' sobre esta questão!
circlesix
@Khoa TruongDinh obrigado pela ótima resposta. Isso funciona perfeito. Você pode me dizer como podemos fazer o mesmo na seção de resumo do checkout. Eu encontrei muito, mas não consigo encontrar um local para adicionar o novo atributo em vez do nome no resumo do checkout.
Rohit Goel
1
Tenha cuidado, se você tem produtos configuráveis, você precisará substituir essa classe também: Magento\ConfigurableProduct\CustomerData\ConfigurableIteme para o produto agrupados:Magento\GroupedProduct\CustomerData\GroupedItem
Franck Garnier
@FranckGarnier que acabei de verificar parece que não precisamos substituir essas classes. Adicione apenas !-- ko text: product_sku --><!-- /ko -->, o sku será exibido para produtos configuráveis. Minha versão do Magento é 2.1.5.
precisa saber é o seguinte
1
Ideal para product_sku, mas se você precisar adicionar informações extras que não estejam presentes nativamente, tenha cuidado com essas classes, tente usar plugins.
Franck Garnier
7

Em primeiro lugar, uma explicação muito boa de @Khoa TruongDinh sobre o fluxo de obtenção de itens no modelo minicart.

como posso alterá-los para adicionar ou remover detalhes do produto?

Encontrei uma maneira de estender o modelo de minicart com atributos personalizados do produto. Para fazer isso primeiro, você precisa substituir vendor / magento / module-checkout / CustomerData / DefaultItem.php pelas preferências do DI

Criar aplicativo / código / Fornecedor / Módulo / etc / di.xml ou substituir o objeto 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>

Em seguida, crie um novo objeto para substituir o método doGetItemData () e inclua custom_attribute com a chave product_custom_attribute

Arquivo: 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()),
        ];
    }
}

Observe que estou injetando

\ Magento \ Catalog \ Model \ Product $ productModel

para o método de construção porque preciso carregar dados completos do produto para acessar meu atributo customizado. Se houver uma maneira melhor, por favor me diga.

E, finalmente, você pode exibir o novo atributo em

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

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

                    <!-- ko text: product_custom_attribute --><!-- /ko -->
Miroslav Petroff
fonte
Usar 'product_sku' => $this->item->getProduct()->getSku()funciona para puxar o sku, então, enquanto eu não precisar \Magento\Catalog\Model\Product $productModelpegar isso, vou usá-lo para pegar outras informações do produto. Finalmente, tenho a preferência em funcionamento, para que seu método funcione como um encanto!
Círculos # 5/16
1
Para atributos customizados, você precisa $productModelcarregar o produto com todos os atributos e recuperá-los $this->helper. Se estiver funcionando, você pode votar na minha resposta.
Miroslav Petroff
1
Eu fiz, e eles só me deixaram votar uma vez. Se eu pudesse marcar sua resposta tão correta quanto a de Khoa, eu o faria. Vou postar por aí e ver se podemos obter mais votos para você, pois ainda tenho que ver alguém responder a esse problema em qualquer outro lugar e este nocauteia o parque.
circlesix